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

  • dacă luăm 0x20 / ASCII 32 ca referință, nu este ‘ t greutatea zumzăitoare a hello world 10 mai degrabă decât 11?
  • De ce este greutatea 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.
  • Ne pare rău, am înșelat totul. Articolul ‘ din Wikipedia este destul de înșelător și am completat ‘ ed regulile. Rescrieți acum. Actualizare: Ok, rescris pentru a-l defini ca numărul de biți setat la 1 în șirul ASCII, îmi pare rău pentru înșelătorie.
  • @ugoren O soluție cu mai mică -valorile caracterelor ASCII au o greutate mai mică.
  • Acum totul are sens. UTILIZAȚI MAJUSCULE, ATENȚIE LA ~ ȘI o.

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 doar 0 .. 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 de base. 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ând 2base~ î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.

Încercați online aici .

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ă:

Greutate de tăiere HPPPL

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

Încercați online!

În timp ce acest cod nu este cod de golf, cea mai scurtă soluție pare să aibă, de asemenea, cea mai mică greutate …

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *