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

  • ha 0x20 / ASCII 32 referenciaként nem ‘ t a hello world 10 zümmögő súlya a 11 helyett?
  • Miért van a 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.
  • Sajnálom, ezt teljesen elcsesztem. A Wikipedia ‘ súlyzási cikkek megtévesztése meglehetősen félrevezető, és én teljesen fubar ‘ szerkesztettem a szabályokat. Újraírok most. Frissítés: Rendben, újraírva, hogy az ASCII karaktersorozatban 1-re állított bitek számaként definiálja, elnézést a csavarásért.
  • @ugoren Alacsonyabb megoldás értékű ASCII karaktereknek kisebb a súlya.
  • Most mindennek van értelme. FELHASZNÁLÁS, VIGYÁZZA A ~ ÉS o.

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 a printf("@"+*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 a base 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* a 2base~ 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.

Próbálja ki itt online .

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:

A HPPPL súlyának megütése

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

Próbálja ki online!

Noha ez a “golfkód nem”, úgy tűnik, hogy a legrövidebb megoldásnak is a legkisebb a súlya …

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük