Creați un program care calculează greutatea de lovitură a un șir. Câștigătorul este programul cu cea mai mică greutate de lovire.
Reguli:
- Greutatea de lovire pentru un caracter ASCII este definit ca numărul total de biți setat la
1
în reprezentarea sa binară. - Să presupunem că codificarea de intrare este ASCII pe 7 biți, trecut prin orice mecanism de intrare este normal pentru limba dvs. (de exemplu, stdin, args etc.)
- Afișați rezultatul, ca număr, la stdout sau la orice mecanism de ieșire implicit / normal pe care îl folosește limba dvs.
- Ar trebui să fie de la sine înțeles, dar trebuie să puteți efectiv rula programul, în viața reală, pentru ca acesta să fie o soluție validă.
- Winner este soluția al cărei cod are cea mai mică greutate de lovitură.
-
Ne pare rău, nu există soluții în spațiu pentru acesta!Ok, puteți codifica în spațiu alb acum am „sortat regulile 🙂
Exemple de caractere:
char | binary | weight -----+----------+------- a | 01100001 | 3 x | 01111000 | 4 ? | 00111111 | 6 \x00 | 00000000 | 0 \x7F | 01111111 | 7
Comentarii
Răspuns
J (33)
Una mai mică decât 34!
+/,#:3 u:
Foarte inspirat de acest răspuns , dar cu o greutate mai mică decât una mai mică.
+/,#:3 u:"+/,#:3 u:" 33
Răspuns
J, greutate 34
+/,#:a.i.
Utilizare – plasați șir de caractere care se măsoară în ghilimele la sfârșit:
+/,#:a.i."+/,#:a.i." 34
Alternativ, luând intrări de la tastatură (greutate 54):
+/,#:a.i.1!:1[1 hello 21
Comentarii
- Există ‘ un singur mod de a scrie acest lucru:)
- Nu există ‘ t … Am găsit o soluție care are o greutate mai mică decât una mai mică.
- Nu încerc să fiu un buzzkill, dar regulile cer un program , nu un fragment.
Răspuns
J , 39
+/,#:a.i:]
Aceasta este o funcție care acceptă una argument. (Sau înlocuiți ]
cu șirul direct; după cum remarcă Gareth, acest lucru reduce costul la 34.)
+/,#:a.i:] "hello world" 45 +/,#:a.i:] "+/,#:a.i:]" 39
Comentarii
- Mintile superbe gândesc la fel. 🙂
Răspuns
Python, 189
print sum(bin(ord(A)).count("1")for A in raw_input())
Comentarii
- Echivalentul Python 3,
print(sum(bin(ord(A)).count('1')for A in input()))
, are un scor de 180. - @ dan04: Utilizați ghilimele duble în loc de simple pentru 176.
Răspuns
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
Tip de instrumentul potrivit pentru slujbă, bineînțeles, de la sine, desigur.
Comentarii
- +1 pentru utilizarea uneia dintre limbile mele preferate din toate timpurile. ‘ este prima limbă pe care am învățat să o codez pe un computer.
Răspuns
Unary 0
Știați cu toții că vine. Mai întâi programul BrainFuck:
,[[>++[>>+>+<<<-]>>> [<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>> [<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-] [-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>> [-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<< [>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<< [>>+<[>>+>+<<<-]>>>[<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>> [<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]> [-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<< [>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<<]>>> [>+>+<<-]>>[<<+>>-][-]+<[>[-]<<[<<->>-]<<[>>+<<-]>>>[-]]>[<<<+<[-]>>>> [-]]<<[->>>>+<<<<]<[-<<+>>]<<],]>>>>>>>.
Am adăugat linii noi pentru a-l face „lizibil”, dar are o greutate Hamming de 4066. Funcționează obținând în mod repetat coeficientul / resturile unui șir de intrare și adăugând toate resturile. Bineînțeles, dacă îl rulați singur, veți obține: 226 (4066% 256) (din punct de vedere tehnic \ xe2) atât de clar încât se stăpânește câștigătorul.
Acum îl convertim în Unary și obținem
000 ... 9*google^5.9 0"s ... 000
Folosim o implementare unitară cu caractere NULL \ x00 pentru „0” și boom, cu greutatea de 0.
Întrebare bonus : Pentru ce caractere ASCII c
puteți rula acest program pe un șir format din N
repite și puneți-l să scoată acel caracter. (De exemplu, un șir de 32 de spații oferă un spațiu).Ce valori ale N
funcționează (fie un număr infinit de ele vor funcționa, fie nu va funcționa niciuna).
Comentarii
- Nu ‘ nu sunt sigur că înțeleg această soluție. Programul de brainfuck are o greutate uriașă. Unary acceptă octeți nuli ca program sau ar trebui să re-implementați Unary? Dacă ‘ este cel din urmă, ‘ nu este într-adevăr o soluție validă – oricine ar putea spune doar ” Definesc un limbaj de programare în care orice octet de intrare unic dă {result} ” și câștig fiecare provocare de cod de golf de pe site.
- O valoare nulă personajul Unary ar fi bine. Tot ce aveți nevoie este un EOF pentru a spune că nu mai contați. De fapt, aici ‘ există câteva pseudo-C pentru a citi acel fișier:
main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }
Doesn ‘ Nu contează deloc ce alegi să fii caracterul tău unar (atâta timp cât nu este ‘ t EOF). - Ei bine aici ‘ este unar pentru compilatorul C care funcționează bine cu caractere nule: ideone.com/MIvAg . Desigur, fișierul necesar pentru a face acest program nu ar încadra în univers, dar avem capacitatea de a-l rula.
- Dacă poți ‘ t de fapt rulați-l, ‘ nu este o soluție.
- Ca Carl Sagan a spus odată: ” Dacă doriți să calculați greutatea unui șir, trebuie mai întâi să inventați 10 ^ 500 de universuri. ” (miliarde și miliarde, chiar)
Răspuns
C, greutate 322 263 256
Contează greutatea de lovitură a greutății de lovitură?
main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))D+=*A%2;printf("%d",D-2);}
Folosit mai ales golf standard tehnici.
O singură buclă calculează greutatea (deplasarea la dreapta și adăugarea până la zero) și scanează șirul (avansează indicatorul când atingeți zero).
Presupunând că D
este inițializat la 2 (parametru unic).
Optimizarea optimă a greutății Hamming ons:
1. ABDH
, cu greutatea 2 fiecare, folosit pentru nume.
2. *++H
preferat în locul H[1]
.
Comentarii
- Hah, nu am reușit să înțeleg prima propoziție până acum.
- Puteți obține scorul până la 230 scriind rezultatul ca un număr unar :
main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
- @schnaader , Nu am știut niciodată că
@
este o cifră în sistemul unar. Am crezut că folosește doar0
..0
. Dar dacă doriți să mergeți așa,printf("@"+*a%2)
este mai scurt. - @ugoren: Depinde de convenția / definiția unarului. De exemplu. en.wikipedia.org/wiki/Unary_numeral_system folosește semne de cont și spune ” Nu există un simbol explicit care să reprezinte zero în unar ca și în alte baze tradiționale „.
- @schnaader, OK, dar cred că ‘ s întinde cerința ” ca număr ” prea departe.
Răspuns
Golfscript 84 72 58
{2base~}%{+}*
(mulțumesc lui Howard și Peter Taylor pentru ajutor)
Intrare: șirul de intrare trebuie să fie pe stivă (trecut ca linie de comandă argument, sau pur și simplu plasat pe stivă).
În cazul în care îl rulați de pe linia de comandă, asigurați-vă că utilizați echo -n
, altfel linia nouă finală va fi, de asemenea, să fie numărat.
Ieșire: imprimă valoarea greutății ciocănitoare pe consolă
Programul poate fi testat d = „62d7d0ee03”>
aici .
Comentarii
- Golfscript este sensibil la majuscule? Dacă nu, puteți salva câțiva biți utilizând
BASE
în loc debase
. Actualizare: Tocmai bifat,BASE
nu funcționează ‘. Soluție bună 🙂 - @Polynomial Am încercat că după ce am văzut
TEST
/test
comentariul 🙂 Dar nu ‘ nu funcționează. - Puteți scăpa de
{...}2*
aplicând2base~
în primul rând. Obține un scor scăzut la 72. - @Howard mulțumesc pentru acest sfat minunat! ‘ l-am aplicat în răspunsul meu.
- Mecanismul dvs. de testare este greșit, deoarece ‘ ați uitat o limitarea importantă a paginii dvs. Web GolfScript. Ar trebui să aveți un
;
înainte de șirul pe care îl înlocuiți cu stdin, astfel încât(;
să nu fie necesar. Apoi, observația Howard ‘ o reduce la 65.
Răspuns
Perl, 80 (22 caractere)
Gata și gata:
perl -0777nE "say unpack"%32B*""
Sau aici este o versiune alternativă cu o greutate de 77 (21 de caractere):
perl -0777pE "$_=unpack"%32B*""
Nu îmi place la fel de mult această versiune, totuși, deoarece rezultatul său omite linia nouă finală.
Pentru a calcula greutatea, presupun că numără caracterele în mod obișnuit (cu excepția perl -e
/ -E
, dar inclusiv alte caractere de opțiune). Dacă, dintr-un anumit motiv, oamenii se plâng de acest lucru, atunci cel mai bun lucru pe care îl pot face fără opțiuni este 90 (26 de caractere):
$/=$,,say unpack"%32B*",<>
Exemplu de utilizare:
$ perl -0777nE "say unpack"%32b*"" rickroll.txt 7071
Boom.
Răspuns
Pyth – 15
Disclaimer: Acest răspuns nu este eligibil pentru a câștiga, deoarece Pyth este mai tânăr decât această provocare.
Utilizează .B
pentru reprezentarea binară și numără numărul de "1"
„s.
/.BQ\1
Intră într-un șir de salvat pe z
versus Q
.
Răspuns
Scala 231
readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum
Cod de verificare:
"""readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum""".map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum
cu modificări automate.
Comentarii
- Este ‘ greutatea 495, nu 231. Puteți ‘ să obțineți greutatea 231 cu 126 de caractere – că ‘ este o medie mai mică de 2 și toate caracterele tipărite (cu excepția
@
și spațiu, pe care nu ‘ nu folosiți) au cel puțin greutatea 2. - @ugoren: Dar ‘ are doar 65 de caractere. Programul este tipărit aproape de două ori: odată codul pentru calcularea greutății de lovire și a doua oară ca intrare statică pentru calculul acestuia pentru program. Dar părții de calcul lipsește ” readLine () ” în față, deoarece ia intrarea literală. Am încercat să clarific răspunsul în sine.
Răspuns
Java, pondere 931 774 499 454
Cred că acesta este singurul răspuns în acest moment cu o greutate de peste 300.
class H{public static void main(String[]A){System.out.print(new java.math.BigInteger(A[0].getBytes()).bitCount());}}
Se așteaptă introducerea ca argument de linie de comandă.
Răspuns
GNU sed -r
, 467 + 1
(+1 pentru utilizarea -r
– sau ar trebui să fie +4?)
Ieșiri ca valoare unară pe linie sursă; pentru a converti la un număr zecimal, redirecționați ieșirea în | tr -d "\n" | wc -c
. Numără toate caracterele ASCII tipărite (32-126), plus linia de alimentare (10).
s@[a-z]@\U& @g s@[?{}~]@ @g s@[][/7;=>OW|^]@ @g s@[-"+.3569:<GKMNSUVYZ\\]@ @g s@[#%&)*,CEFIJL1248ORTX]@ @g s@$|[!"$(ABDH0P`]@ @g y! @!11!
Este greu să eviți să enumerăm toate caracterele, dar putem reduce acest lucru observând că literele mici au o greutate Hamming cu una mai mare decât literele majuscule corespunzătoare. Preferăm linia nouă (scor 2) în locul punctului și virgulei (scor 5) ca separator de instrucțiuni; preferăm @
(scor 1) sau !
(scor 2) peste /
(scor 5) ca delimitator de tipare.
Notă – pentru a obține seturile potrivite de caractere, am creat acest tabel din cel din man ascii
, sortat după greutate. Adăugați doar scorurile corect și mai jos pentru a obține greutatea generală a fiecărui personaj:
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
Acest lucru s-ar putea dovedi util pentru ceilalți.
Răspunde
Julia 262 268
Versiunea modificată folosește funcția „count_ones” la îndemână pentru o salvare de 6 (262)
show(mapreduce(x->count_ones(x),+,map(x->int(x),collect(ARGS[1]))))
Vechi versiune care nu folosește funcția de numărare integrată (268)
show(mapreduce(x->int(x)-48,+,mapreduce(x->bits(x),*,collect(ARGS[1]))))
Folosește argumentul liniei de comandă pentru intrare.
Răspuns
CJam 52 sau 48
Dacă intrarea nu este deja în stivă (52)
q:i2fbs:s:i:+
Dacă intrarea este în stivă (48)
:i2fbs:s:i:+
De exemplu
"Hello World":i2fbs:s:i:+
Răspuns
Julia, HW 199
H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:])))
Cu
A="H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:])))"
sau prin inserarea directă a șirului:
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
Versiunea fără golf (HW 411) arată așa:
bitstring=mapreduce(x->bits(x),*,collect(teststring[:])) mapreduce(checkbit->checkbit=="1",+,bitstring)
Și pentru distracție, iată o versiune optimizată (Hamming Weight 231 ) din problema lui bakerg asupra problemei:
A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))
cu
H="A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))"
Răspuns
HPPPL (HP Prime Programming Language), 74
sum(hamdist(ASC(a),0))
Calculatorul grafic HP Prime are o funcție hamdist () încorporată.Greutatea de lovire a fiecărui caracter este aceeași cu distanța de lovitură de la 0.
ASC (șir) creează o serie de valori ASCII ale fiecărui caracter dintr-un șir.
hamdist ( value, 0) calculează distanța de lovire de la 0 pentru fiecare valoare ASCII
sum () însumează toate valorile.
Calculând greutatea de lovire a propriului cod sursă:
Răspuns
05AB1E , greutate 17 (4 octeți )
ÇbSO
Încercați online sau verificați încă câteva cazuri de testare .
Explicație:
Ç # 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
Răspuns
Perl 6 , 102
+*.ords>>.base(2).comb(~1)
În timp ce acest cod nu este cod de golf, cea mai scurtă soluție pare să aibă, de asemenea, cea mai mică greutate …
0x20
/ ASCII 32 ca referință, nu este ‘ t greutatea zumzăitoare ahello world
10 mai degrabă decât 11?hello world
11? Doar 10 caractere sunt diferite de un spațiu. De asemenea – greutatea Hamming a unui program ‘ pare să fie doar lungimea sa, excluzând spațiile. Nu este atât de diferit de codul normal de golf.~
ȘIo
.