Crea un programma che calcoli il peso di martellamento di una stringa. Il vincitore è il programma con il peso di martellamento più basso.

Regole:

  • Il peso di Hamming per un carattere ASCII è definito come il numero totale di bit impostato su 1 nella sua rappresentazione binaria.
  • Supponiamo che la codifica dellinput sia ASCII a 7 bit, passata attraverso qualunque meccanismo di input sia normale per la tua lingua (ad esempio stdin, args, ecc.)
  • Visualizza il risultato, come numero, in stdout o in qualsiasi altro meccanismo di output predefinito / normale utilizzato dalla tua lingua.
  • Dovrebbe essere ovvio, ma devi essere in grado di eseguire effettivamente il programma, nella vita reale, affinché sia una soluzione valida.
  • Winner è la soluzione il cui codice ha il minor peso di martellamento.
  • Spiacenti, nessuna soluzione in spazi bianchi per questo! Ok, ora puoi programmare in spazi bianchi ho risolto le regole 🙂

Esempi per carattere:

char | binary | weight -----+----------+------- a | 01100001 | 3 x | 01111000 | 4 ? | 00111111 | 6 \x00 | 00000000 | 0 \x7F | 01111111 | 7 

Commenti

  • se prendiamo 0x20 / ASCII 32 come riferimento, non è ‘ il peso ronzante di hello world 10 anziché 11?
  • Perché il peso di hello world è 11? Solo 10 caratteri sono diversi da uno spazio. Inoltre – il peso di Hamming di un programma ‘ sembra essere solo la sua lunghezza, spazi esclusi. Non così diverso dal normale codice di golf.
  • Scusa, ho completamente sbagliato. Larticolo di Wikipedia ‘ è piuttosto fuorviante e ho completamente ‘ ed ho rispettato le regole. Riscrivi adesso. Aggiornamento: Ok, riscritto per definirlo come il numero di bit impostato su 1 nella stringa ASCII, scusa per il disastro.
  • @ugoren Una soluzione con un valore più basso -valore I caratteri ASCII hanno un peso di martellamento inferiore.
  • Ora tutto ha un senso. USARE LE MAIUSCOLE, FARE ATTENZIONE A ~ E o.

Risposta

J (33)

Uno inferiore a 34!

+/,#:3 u: 

Pesante ispirato da questa risposta , ma un peso inferiore di uno.

 +/,#:3 u:"+/,#:3 u:" 33 

Risposta

J, peso 34

+/,#:a.i. 

Utilizzo: posizionare il stringa da misurare tra virgolette alla fine:

 +/,#:a.i."+/,#:a.i." 34 

In alternativa, prendendo input dalla tastiera (peso 54):

 +/,#:a.i.1!:1[1 hello 21 

Commenti

  • Cè ‘ solo un modo per scrivere questo:)
  • Non cè ‘ t … Ho trovato una soluzione che ha un peso di martellamento inferiore di uno.
  • Non sto cercando di essere un buzzkill, ma le regole richiedono un programma non un frammento.

Risposta

J , 39

+/,#:a.i:] 

Questa è una funzione che ne prende una discussione. (Oppure sostituisci ] con la stringa direttamente; come osserva Gareth, il costo scende a 34.)

 +/,#:a.i:] "hello world" 45 +/,#:a.i:] "+/,#:a.i:]" 39 

Commenti

  • Le grandi menti pensano allo stesso modo. 🙂

Risposta

Python, 189

print sum(bin(ord(A)).count("1")for A in raw_input()) 

Commenti

  • Lequivalente di Python 3, print(sum(bin(ord(A)).count('1')for A in input())), ha un punteggio di 180.
  • @ dan04: utilizza virgolette doppie invece di singole per 176.

Risposta

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 

Tipo di lo strumento giusto per il lavoro, ovviamente fa ancora schifo.

Commenti

  • +1 per aver usato una delle mie lingue preferite di tutti i tempi. È ‘ è la prima lingua che ho imparato a programmare su un PC.

Risposta

Unario 0

Sapevate tutti che sarebbe arrivato. Per prima cosa il programma BrainFuck:

,[[>++[>>+>+<<<-]>>> [<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>> [<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-] [-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>> [-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<< [>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<< [>>+<[>>+>+<<<-]>>>[<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>> [<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]> [-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<< [>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<<]>>> [>+>+<<-]>>[<<+>>-][-]+<[>[-]<<[<<->>-]<<[>>+<<-]>>>[-]]>[<<<+<[-]>>>> [-]]<<[->>>>+<<<<]<[-<<+>>]<<],]>>>>>>>. 

Ho aggiunto nuove righe per renderlo “leggibile” ma ha un peso di Hamming di 4066. Funziona ottenendo ripetutamente il quoziente / resti di una stringa di input e somma di tutti i resti. Ovviamente se lo esegui da solo ottieni: 226 (4066% 256) (tecnicamente \ xe2) quindi chiaramente si governa da solo il vincitore.

Ora lo convertiamo in unario e otteniamo

000 ... 9*google^5.9 0"s ... 000 

Usiamo unimplementazione unaria con caratteri NULL \ x00 per “0” e boom, hamming weight di 0.

Domanda bonus : per quali caratteri ASCII c puoi eseguire questo programma su una stringa composta da N ripete e visualizza quel carattere. (Ad es. Una stringa di 32 spazi dà uno spazio).Quali valori di N funzionano (o un numero infinito di essi funzionerà o nessuno lo farà).

Commenti

  • Non ‘ non sono sicuro di aver compreso questa soluzione. Il programma Brainfuck ha un enorme peso martellante. Unary accetta byte nulli come programma o sarebbe necessario reimplementare Unary? Se ‘ è il secondo, ‘ non è proprio una soluzione valida: chiunque potrebbe semplicemente dire ” Definisco un linguaggio di programmazione in cui ogni singolo byte di input restituisce {result} ” e vinco ogni sfida di golf del codice sul sito.
  • Un null carattere Unario andrebbe bene. Tutto ciò di cui hai bisogno è un EOF per dire smetti di contare. Infatti qui ‘ cè un po di pseudo-C per leggere quel file: main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; } Doesn ‘ Non importa quale sia il tuo carattere unario (purché non sia ‘ t EOF).
  • Bene qui ‘ è un compilatore unario del C che funziona bene con caratteri nulli: ideone.com/MIvAg . Ovviamente il file richiesto per realizzare questo programma non si adatterebbe alluniverso, ma abbiamo la capacità di eseguirlo.
  • Se puoi ‘ t effettivamente eseguirlo, ‘ non è proprio una soluzione.
  • Come Carl Sagan una volta ha detto: ” Se desideri calcolare il peso di martellamento di una stringa, devi prima inventare 10 ^ 500 universi. ” (miliardi e miliardi, pari)

Risposta

C, peso 322 263 256

Il peso di martellamento del peso di martellamento conta?

main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))D+=*A%2;printf("%d",D-2);} 

Usato principalmente per il golf standard tecniche.
Un singolo ciclo calcola il peso (spostandosi a destra e aggiungendo fino a zero) e scansiona la stringa (fa avanzare il puntatore quando viene raggiunto lo zero).
Supponendo che D sia inizializzato a 2 (parametro singolo).

Hamming weight specific optimizati ons:
1. ABDH, con peso 2 ciascuno, utilizzato per i nomi.
2. *++H preferito su H[1].

Commenti

  • Hah, fino ad ora non sono riuscito a capire la tua prima frase.
  • Puoi ridurre il punteggio a 230 restituendo il risultato come un numero unario : main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
  • @schnaader , Non ho mai saputo che @ fosse una cifra nel sistema unario. Pensavo usasse solo 0 .. 0. Ma se vuoi andare in questo modo, printf("@"+*a%2) è più breve.
  • @ugoren: dipende dalla convenzione / definizione di unario. Per esempio. en.wikipedia.org/wiki/Unary_numeral_system utilizza segni di conteggio e dice ” Non è presente alcun simbolo esplicito che rappresenti lo zero in unario come in altre basi tradizionali “.
  • @schnaader, OK, ma penso che ‘ s estende il requisito ” come numero ” troppo oltre.

Risposta

Golfscript 84 72 58

{2base~}%{+}* 

(grazie a Howard e Peter Taylor per il loro aiuto)

Input: la stringa di input deve essere nello stack (passata come riga di comando o semplicemente posizionato sullo stack).

Nel caso in cui lo esegui dalla riga di comando, assicurati di utilizzare echo -n, altrimenti anche la nuova riga finale essere contato.

Risultato: stampa il valore del peso di martellamento nella console

Il programma può essere testato

qui .

Commenti

  • Golfscript fa distinzione tra maiuscole e minuscole? In caso contrario, puoi salvare alcuni bit utilizzando BASE invece di base. Aggiornamento: appena selezionato, BASE non ‘ non funziona. Buona soluzione 🙂
  • @Polynomial Lho provato dopo aver visto il tuo commento TEST / test 🙂 Ma non funziona ‘ t funziona.
  • Puoi sbarazzarti di {...}2* applicando 2base~ in primo luogo. Ottiene un punteggio fino a 72.
  • @ Howard, grazie per questo fantastico suggerimento! Lho ‘ applicato nella mia risposta.
  • Il tuo meccanismo di test è sbagliato, perché ‘ hai dimenticato un importante limitazione della tua pagina Web GolfScript. Dovresti avere un ; prima della stringa che sostituisci con stdin, in modo che (; non sia necessario. Quindi losservazione di Howard ‘ arriva a 65.

Risposta

Perl, 80 (22 caratteri)

Fatto e fatto:

perl -0777nE "say unpack"%32B*"" 

O qui “è una versione alternativa con un peso di 77 (21 caratteri):

perl -0777pE "$_=unpack"%32B*"" 

Non mi piace molto quella versione, però, perché il suo output omette la nuova riga finale.

Per calcolare il peso, presumo che sto contando i caratteri nel modo consueto (escluso perl -e / -E, ma inclusi altri caratteri di opzione). Se per qualche motivo le persone si lamentano di questo, allora il meglio che posso fare senza opzioni è 90 (26 caratteri):

$/=$,,say unpack"%32B*",<> 

Utilizzo di esempio:

$ perl -0777nE "say unpack"%32b*"" rickroll.txt 7071 

Boom.

Answer

Pyth – 15

Dichiarazione di non responsabilità: questa risposta non è “idonea a vincere poiché Pyth è più giovane di questa sfida.

Utilizza .B per la rappresentazione binaria e conta il numero di "1" “s.

/.BQ\1 

Inserisce una stringa per salvare z rispetto a Q.

Provalo online qui .

Rispondi

Scala 231

 readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum  

Codice di autotest:

"""readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum""".map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum 

con modifica del test automatico.

Commenti

  • ‘ pesa 495, non 231. Non puoi ‘ ottenere il peso 231 con 126 caratteri, che ‘ è una media inferiore a 2 e tutti i caratteri stampabili (eccetto @ e lo spazio, che doni ‘ da usare) hanno almeno un peso 2.
  • @ugoren: ma ‘ sono solo 65 caratteri. Il programma viene stampato quasi due volte: una volta il codice per calcolare il peso di martellatura, e una seconda volta come input statico per calcolarlo per il programma. Ma la parte di calcolo manca del ” readLine () ” davanti, perché accetta linput letterale. Ho provato a chiarire la risposta stessa.

Answer

Java, weight 931 774 499 454

Penso che questa sia lunica risposta al momento con un peso superiore a circa 300.

class H{public static void main(String[]A){System.out.print(new java.math.BigInteger(A[0].getBytes()).bitCount());}} 

Si aspetta linput come argomento della riga di comando.

Risposta

GNU sed -r, 467 + 1

(+1 per luso di -r – o dovrebbe essere +4?)

Emette un valore unario per riga di origine; per convertire in un totale decimale, reindirizza loutput in | tr -d "\n" | wc -c. Conta tutti i caratteri ASCII stampabili (32-126), più lavanzamento riga (10).

s@[a-z]@\U& @g s@[?{}~]@ @g s@[][/7;=>OW|^]@ @g s@[-"+.3569:<GKMNSUVYZ\\]@ @g s@[#%&)*,CEFIJL1248ORTX]@ @g s@$|[!"$(ABDH0P`]@ @g y! @!11! 

È difficile evitare di elencare tutti i caratteri, ma possiamo ridurre questo osservando che le lettere minuscole hanno un peso di Hamming di uno in più rispetto alle lettere maiuscole corrispondenti. Preferiamo la nuova riga (punteggio 2) al punto e virgola (punteggio 5) come separatore di istruzioni; preferiamo @ (punteggio 1) o ! (punteggio 2) su / (punteggio 5) come delimitatore di pattern.

Nota – per ottenere i set di caratteri corretti, ho creato questa tabella da quella in man ascii, ordinata per peso. Basta aggiungere i punteggi a destra e sotto per ottenere il peso complessivo di ogni carattere:

 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 

Questo potrebbe rivelarsi utile ad altri.

Risposta

Julia 262 268

La versione modificata utilizza la pratica funzione “count_ones” per un risparmio di 6 (262)

show(mapreduce(x->count_ones(x),+,map(x->int(x),collect(ARGS[1])))) 

Vecchio versione che non utilizza la funzione di conteggio uno incorporata (268)

show(mapreduce(x->int(x)-48,+,mapreduce(x->bits(x),*,collect(ARGS[1])))) 

Utilizza largomento della riga di comando per linput.

Risposta

CJam 52 o 48

Se linput non è già nello stack (52)

q:i2fbs:s:i:+ 

Se linput è nello stack (48)

:i2fbs:s:i:+ 

Ad esempio

"Hello World":i2fbs:s:i:+ 

Rispondi

Julia, HW 199

H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:]))) 

Con

A="H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:])))" 

o inserendo direttamente la stringa:

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 

La versione ungolfed (HW 411) ha questo aspetto:

bitstring=mapreduce(x->bits(x),*,collect(teststring[:])) mapreduce(checkbit->checkbit=="1",+,bitstring) 

E per il gusto di farlo, ecco una versione ottimizzata (Hamming Weight 231 ) dellopinione di Bakerg sul problema:

A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:])))) 

con

H="A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))" 

Risposta

HPPPL (HP Prime Programming Language), 74

sum(hamdist(ASC(a),0)) 

La calcolatrice grafica HP Prime ha una funzione hamdist () incorporata.Il peso di martellamento di ogni carattere è uguale alla distanza di percussione da 0.

ASC (stringa) crea un array di valori ASCII di ogni carattere in una stringa.

hamdist ( value, 0) calcola la distanza di percussione da 0 per ogni valore ASCII

sum () riassume tutti i valori.

Calcolo del peso di martellamento del proprio codice sorgente:

Hamming Weight HPPPL

Risposta

05AB1E , peso 17 (4 byte )

ÇbSO 

Provalo online o verifica altri casi di test .

Spiegazione:

 Ç # 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  

Risposta

Perl 6 , 102

Provalo online!

Anche se questo non è il codice del golf, la soluzione più breve sembra avere anche il minor peso di martellamento …

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *