Hozzon létre egy programot, amely kiszámolja a kalapálás súlyát húr. A győztes az a program, amelynek a legkisebb súlya van.
Szabályok:
- Az ASCII karakterek súlyát a bináris reprezentációjában.
- Tegyük fel, hogy a bemeneti kódolás 7 bites ASCII, amelyet a nyelved normális beviteli mechanizmusai (például stdin, args stb.) Adnak át
- Az eredményt számként adja ki a stdout-ba vagy bármilyen alapértelmezett / normál kimeneti mechanizmusba, amelyet a nyelv használ.
- Ennek magától értetődőnek kell lennie, de képesnek kell lennie arra, hogy ténylegesen fusson a program a való életben annak érdekében, hogy érvényes megoldás legyen.
- A nyertes az a megoldás, amelynek kódja a legkevésbé fontos.
-
Sajnáljuk, nincs megoldás a szóközben erre!Ok, most már beírhat egy fehér szóközbe, rendeztem a szabályokat 🙂
Karakterenkénti példák:
char | binary | weight -----+----------+------- a | 01100001 | 3 x | 01111000 | 4 ? | 00111111 | 6 \x00 | 00000000 | 0 \x7F | 01111111 | 7
Megjegyzések
Válasz
J (33)
Egy 34-nél alacsonyabb!
+/,#:3 u:
Erősen ihlette t ez a válasz , de eggyel kisebb súlya van.
+/,#:3 u:"+/,#:3 u:" 33
Válasz
J, súly 34
+/,#:a.i.
Használat – helyezze el a A végén idézőjelben mérendő karakterlánc:
+/,#:a.i."+/,#:a.i." 34
Alternatív megoldásként a billentyűzetről lehet bevinni (54. súly):
+/,#:a.i.1!:1[1 hello 21
Megjegyzések
- A ‘ csak egy módon írhatja ezt:)
- Nincs ‘ t … Találtam egy megoldást, amelynek eggyel alacsonyabb a súlya.
- Nem próbálok buzzkill lenni, de a szabályok egy programot, és nem töredéket kérnek.
Válasz
J , 39
+/,#:a.i:]
Ez egy függvény érv. (Vagy cserélje le az ]
szót közvetlenül a karakterlánccal; ahogy Gareth megjegyzi, ez 34-re csökkenti a költségeket.)
+/,#:a.i:] "hello world" 45 +/,#:a.i:] "+/,#:a.i:]" 39
Megjegyzések
- A nagyszerű elmék egyformán gondolkodnak. 🙂
Válasz
Python, 189
print sum(bin(ord(A)).count("1")for A in raw_input())
megjegyzés
- A Python 3 megfelelője,
print(sum(bin(ord(A)).count('1')for A in input()))
, 180-as pontszámmal rendelkezik. - @ dan04: Használjon dupla idézőjeleket egyetlen helyett a 176-hoz.
Válasz
QBasic, 322 311 286 264
H$=COMMAND$ FOR A=1 TO LEN(H$) B=ASC(MID$(H$,A,1)) WHILE B>0 D=D+B MOD 2 B=B\2 WEND NEXT ?D
Fajtája a megfelelő eszköz a munkához, természetesen továbbra is szar.
Megjegyzések
- +1 minden idők egyik kedvenc nyelvének használatáért. ‘ ez az első nyelv, amelyet megtanultam kódolni a PC-n.
Válasz
Unary 0
Mindannyian tudtátok, hogy jön. Először a BrainFuck program:
,[[>++[>>+>+<<<-]>>> [<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>> [<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-] [-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>> [-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<< [>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<< [>>+<[>>+>+<<<-]>>>[<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>> [<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]> [-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<< [>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<<]>>> [>+>+<<-]>>[<<+>>-][-]+<[>[-]<<[<<->>-]<<[>>+<<-]>>>[-]]>[<<<+<[-]>>>> [-]]<<[->>>>+<<<<]<[-<<+>>]<<],]>>>>>>>.
Új sorokat adtam hozzá, hogy “olvashatóvá válhassak”, de a Hamming súlya 4066. Úgy működik, hogy többször kapjuk meg a / bemeneti karakterlánc maradékai és az összes maradék összeadása. Természetesen, ha önállóan futtatja, akkor kapja meg: 226 (4066% 256) (technikailag \ xe2), így egyértelműen maga szabja meg a győztest. div id = “235c480adc”>
Egyetlen megvalósítást használunk NULL karakterekkel \ x00 a “0” és a boom számára, a 0 súlyát ütemezve.
Bónuszkérdés : Milyen ASCII karakterekhez c
futtathatja ezt a programot egy karakterláncon, amely N
ismétléseket, és adja ki ezt a karaktert. (E.G. 32 szóközből álló húr teret ad).Az N
milyen értékei működnek (vagy végtelen sokan működnek, vagy egyik sem fog működni).
Megjegyzések
- Nem ‘ nem biztos, hogy értem ezt a megoldást. Az brainfuck programnak hatalmas súlya van. Elfogadja-e az Unary a null bájtokat programként, vagy újra kell-e telepítenie az Unary-t? Ha ‘ ez utóbbi, akkor ‘ nem igazán érvényes megoldás – bárki mondhatná ” Meghatározok egy programozási nyelvet, ahol bármelyik bemeneti bájt {result} ” -et ad, és megnyerem a webhely minden kódgolf-kihívását.
- A null karakter Unary jól lenne. Csak egy EOF-re van szükséged, hogy azt mondd: ne számolj le. Valójában itt ‘ van néhány ál-C a fájl elolvasásához:
main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }
Doesn ‘ egyáltalán nem számít, hogy mit választasz az Unary-féle karakterednek (mindaddig, amíg ez nem ‘ t EOF). - Nos, itt ‘ unary a C fordítóhoz, amely null karakterekkel jól működik: ideone.com/MIvAg . Természetesen a program elkészítéséhez szükséges fájl nem férne el az univerzumban, de képesek vagyunk futtatni.
- Ha ‘ t valójában futtassa, ez ‘ nem igazán megoldás.
- Mint Carl Sagan egyszer ezt mondta: ” Ha ki akarja számolni egy húr ütés súlyát, először 10 ^ 500 univerzumot kell kitalálnia. ” (még milliárdok és milliárdok)
Válasz
C, súly 322 263 256
Számít-e a kalapálás súlya?
main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))D+=*A%2;printf("%d",D-2);}
Többnyire szokásos golfozás technikák.
Egy hurok kiszámítja a súlyt (jobbra tolva és nullaig összeadva), és beolvassa a karakterláncot (ha a nulla eléri, a mutató előrelép).
Feltételezve, hogy a D
értéket 2 (egyetlen paraméter).
Súlyspecifikus optimalizálás ons:
1. ABDH
, mindegyik 2-es súllyal, névre használva.
2. *++H
előnyben részesíti a H[1]
.
Hozzászólások
- Hah, egészen mostanáig nem értettem az első mondatodat.
- A pontszámot 230-ra csökkentheti, ha az eredményt unáris számként adja meg:
main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
- @schnaader , Soha nem tudtam, hogy
@
egy számjegy az unáris rendszerben. Azt hittem, hogy csak a következőt használja:0
..0
. De ha ezt akarja megtenni, akkor aprintf("@"+*a%2)
rövidebb. - @ugoren: Az unary konvenciójától / definíciójától függ. Például. Az hu.wikipedia.org/wiki/Unary_numeral_system egyező jelöléseket használ, és azt mondja, hogy ” Nincs kifejezett nulla jelkép unariában, mint más hagyományos alapokban “.
- @schnaader, OK, de szerintem ‘ s túlságosan megnyújtja a (z) ” követelményt ” számként.
Válasz
Golfscript 84 72 58
{2base~}%{+}*
(köszönet Howardnak és Peter Taylornak a segítségért)
Input: a bemeneti karakterláncnak a veremben kell lennie (parancssorként továbbítva) argumentum, vagy egyszerűen csak a verembe helyezzük).
Ha a parancssorból futtatja, akkor győződjön meg róla, hogy a echo -n
parancsot használja, különben a záró új sor is
Output: kinyomtatja a kalapács súly értékét a konzolba.
A program tesztelhető
itt .
Megjegyzések
- A kis- és nagybetűk különböznek-e a Golfscript-től? Ha nem, akkor menthet néhány bitet a
BASE
használatával abase
helyett. Frissítés: Csak ellenőrizve,BASE
nem működik ‘. Jó megoldás 🙂 - @Polynomial Megpróbáltam, hogy láttam a
TEST
/test
megjegyzésed 🙂 De nem ‘ nem működik. - Megszabadulhat
{...}2*
a2base~
az első helyen. Pontszám 72-ig csökken. - @Howard köszönöm ezt a nagyszerű tippet! ‘ alkalmaztam a válaszomban.
- A teszt mechanizmusa hibás, mert ‘ elfelejtett egy a Web GolfScript oldal fontos korlátozása. A karakterlánc elé kell állítania egy
;
-t, amelyet a stdin-del helyettesít, így a(;
felesleges. Ezután Howard ‘ megfigyelése 65-re csökkenti.
Válasz
Perl, 80 (22 karakter)
Kész és kész:
perl -0777nE "say unpack"%32B*""
Vagy itt egy alternatív változat 77 (21 karakter) súlyú:
perl -0777pE "$_=unpack"%32B*""
Azért ez a verzió nem tetszik annyira, mert a kimenete kihagyja a végső új sort.
A súly kiszámításához feltételezem, hogy a szokásos módon számolom a karaktereket (a perl -e
/ -E
kivételével, de egyéb opciós karaktereket is tartalmaz). Ha valamilyen oknál fogva az emberek panaszkodnak emiatt, akkor a legjobb, amit opciók nélkül tehetek, 90 (26 karakter):
$/=$,,say unpack"%32B*",<>
Mintahasználat:
$ perl -0777nE "say unpack"%32b*"" rickroll.txt 7071
Boom.
Válasz
Piton – 15
Jogi nyilatkozat: Ez a válasz nem nyerhető, mivel Pyth fiatalabb ennél a kihívásnál.
A .B
fájlt használja bináris ábrázoláshoz, és megszámolja az "1"
“s számát.
/.BQ\1
Bevitelt vesz egy karakterláncba a z
és a Q
mentéshez.
Válasz
Scala 231
readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum
Önellenőrző kód:
"""readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum""".map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum
a módosítás tesztelésével.
Megjegyzések
- Ez ‘ súlya 495, nem pedig 231. ‘ nem kaphat 231 súlyt 126 karakterrel – hogy ‘ átlagosan kevesebb, mint 2, és az összes kinyomtatható karakter (kivéve a
@
és szóközt, amelyet nem ‘ t használat) legalább 2-es súlyú. - @ugoren: De ‘ csak 65 karakter. A programot csaknem kétszer nyomtatják ki: Egyszer a kódot a kalapács súlyának kiszámításához, másodszor pedig statikus bemenetként annak kiszámításához a programhoz. De a számoló részből hiányzik az ” readLine () “, mert a szó szerinti bemenetre van szükség. Megpróbáltam tisztázni magát a választ.
Válasz
Java, súly 931 774 499 454
Szerintem jelenleg ez az egyetlen válasz, amelynek súlya meghaladja a 300-at.
class H{public static void main(String[]A){System.out.print(new java.math.BigInteger(A[0].getBytes()).bitCount());}}
Az inputot parancssori argumentumként várja.
Válasz
GNU sed -r
, 467 + 1
(+1 a -r
használatához – vagy +4 legyen?)
A kimenet unáris értékként jelenik meg forrássoronként; tizedesjegyűvé konvertáláshoz irányítsa át a kimenetet | tr -d "\n" | wc -c
-re. Megszámolja az összes nyomtatható ASCII karaktert (32–126), valamint a sorcsatornát (10).
s@[a-z]@\U& @g s@[?{}~]@ @g s@[][/7;=>OW|^]@ @g s@[-"+.3569:<GKMNSUVYZ\\]@ @g s@[#%&)*,CEFIJL1248ORTX]@ @g s@$|[!"$(ABDH0P`]@ @g y! @!11!
Nehéz elkerülni az összes karakter felsorolását, de csökkenthetjük ennek figyelembevételével, hogy a kisbetűk Hamming-súlya eggyel több, mint a megfelelő nagybetűk. Az új sort (2. pont) inkább a pontosvesszővel (5. pont) állítjuk elő állításelválasztóként; inkább a @
(1. pont) vagy !
(2. pontszám) mint /
(5. pont) mint minta elválasztó.
Megjegyzés – a megfelelő karakterkészlet megszerzéséhez ezt a táblázatot a man ascii
mezőben hoztam létre, súly szerint rendezve. Csak adja hozzá jobbra és alul a pontszámokat, hogy megkapja az egyes karakterek összsúlyát:
2 4 3 5 6 7 --- ------ - 0: @ 0 P ` p |0 1: ! A 1 Q a q | 2: " B 2 R b r |1 4: $ D 4 T d t | 8: ( H 8 X h x | 3: # C 3 S c s | 5: % E 5 U e u | 6: & F 6 V f v |2 9: ) I 9 Y i y | A: * J : Z j z | C: , L < \ l | | 7: ´ G 7 W g w | B: + K ; [ k { |3 D: - M = ] m } | E: . N > ^ n ~ | F: / O ? _ o |4 --- ------ - 1 2 3
Ez hasznos lehet mások számára.
Válasz
Julia 262 268
A módosított verzió a praktikus “count_ones” funkciót használja 6 (262) megtakarításhoz
show(mapreduce(x->count_ones(x),+,map(x->int(x),collect(ARGS[1]))))
Régi beépített egyszámláló függvény nélküli verzió (268)
show(mapreduce(x->int(x)-48,+,mapreduce(x->bits(x),*,collect(ARGS[1]))))
Parancssori argumentumot használ a bevitelhez.
Válasz
52 vagy 48 CJam
Ha a bemenet még nincs a veremben (52)
q:i2fbs:s:i:+
Ha az input a veremben van (48)
:i2fbs:s:i:+
Például
"Hello World":i2fbs:s:i:+
Válasz
Julia, HW 199
H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:])))
A
A="H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:])))"
vagy a karakterlánc közvetlen beillesztésével:
julia> H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect("H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:])))"))) 199
A nem golfozott verzió (HW 411) így néz ki:
bitstring=mapreduce(x->bits(x),*,collect(teststring[:])) mapreduce(checkbit->checkbit=="1",+,bitstring)
És a móka kedvéért íme egy optimalizált verzió (Hamming Weight 231 ) bakerg vállalja a problémát:
A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))
a
H="A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))"
Válasz
HPPPL (HP Prime programozási nyelv), 74
sum(hamdist(ASC(a),0))
A HP Prime grafikus számológép beépített hamdist () funkcióval rendelkezik.Az egyes karakterek súlya megegyezik a 0-tól való távolsággal.
Az ASC (string) tömböt hoz létre az egyes karakterek ASCII értékeiből egy stringben.
hamdist ( érték, 0) kiszámítja az egyes ASCII értékek 0-tól való ütési távolságát
a sum () összesíti az összes értéket.
Saját forráskódjának kalkulációs súlyának kiszámítása:
Válasz
05AB1E , súly 17 (4 bájt )
ÇbSO
Próbálja ki online vagy ellenőrizzen még néhány tesztesetet .
Magyarázat:
Ç # Convert the characters in the (implicit) input to their ASCII decimal values # i.e. "Test" → [84,101,115,116] b # Convert those values to binary # i.e. [84,101,115,116] → ["1010100","1100101","1110011","1110100"] S # Split it into a list of 0s and 1s (implicitly flattens) # i.e. ["1010100","1100101","1110011","1110100"] # → [1,0,1,0,1,0,0,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0] O # Sum those (and output implicitly) # i.e. [1,0,1,0,1,0,0,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0] → 16
Válasz
Perl 6 , 102
+*.ords>>.base(2).comb(~1)
Noha ez a “golfkód nem”, úgy tűnik, hogy a legrövidebb megoldásnak is a legkisebb a súlya …
0x20
/ ASCII 32 referenciaként nem ‘ t ahello world
10 zümmögő súlya a 11 helyett?hello world
11 súlya? Csak 10 karakter különbözik a szóköztől. Továbbá – úgy tűnik, egy program ‘ Hamming súlya csak a hossza, a szóközök nélkül. Nem annyira különbözik a normál kódgolftól.~
ÉSo
.