Luo ohjelma, joka laskee haaran painon nauha. Voittaja on ohjelma, jolla on pienin vasarapaino.

Säännöt:

  • ASCII-merkin hamming-paino määritetään bittien kokonaismääräksi, joka on asetettu arvoon 1 binääritiedostossaan.
  • Oletetaan, että syötekoodaus on 7-bittinen ASCII, joka kulkee minkä tahansa kielellesi normaalin syöttömekanismin (esim. Stdin, args jne.) Kautta
  • Tulos tulostetaan numerona vakiona tai mihin tahansa oletus- / normaaliin lähtömekanismiin, jota kielesi käyttää.
  • Sen pitäisi olla itsestään selvää, mutta sinun on pystyttävä tosiasiallisesti ajaa ohjelman tosielämässä , jotta se olisi kelvollinen ratkaisu.
  • Voittaja on ratkaisu, jonka koodilla on pienin haitallinen paino.
  • Anteeksi, ei ratkaisuja välilyönnissä tälle! Ok, voit koodata välilyönnissä, nyt olen selvittänyt säännöt 🙂

Merkkikohtaiset esimerkit:

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

kommentit

  • jos otamme 0x20 / ASCII 32 viitteenä ei ole ’ t hello world 10: n koliseva paino kuin 11?
  • Miksi hello world 11 on paino? Vain 10 merkkiä eroavat välilyönnistä. Lisäksi – ohjelman ’ Hamming-paino näyttää olevan vain sen pituus välilyöntejä lukuun ottamatta. Ei niin erilainen kuin normaali koodigolf.
  • Anteeksi, olen täysin kiusannut tämän. Wikipedian ’ painoartikkelin häiritseminen on melko harhaanjohtava, ja olen täysin fubar ’ muokannut sääntöjä. Kirjoitetaan uudelleen nyt. Päivitys: Ok, kirjoitettu uudelleen määrittelemään se ASCII-merkkijonossa 1 asetettujen bittien lukumääräksi, anteeksi ruuvituksesta.
  • @ugoren Ratkaisu, jolla on alempi -arvoisilla ASCII-merkkeillä on pienempi haitallinen paino.
  • Nyt kaikella on järkeä. KÄYTÄ TÄYTTÖKOHTIA, VAROITA ~ JA o.

Vastaa

J (33)

Yksi alle 34!

+/,#:3 u: 

Voimakkaasti innoittamana tämä vastaus , mutta yhden pienempi paino.

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

vastaus

J, paino 34

+/,#:a.i. 

Käyttö – aseta merkkijono, joka mitataan lainausmerkeissä lopussa:

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

Vaihtoehtoisesti ottamalla syöttö näppäimistöltä (paino 54):

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

kommentit

  • ’ on vain yksi tapa kirjoittaa tämä:)
  • Ei ole ’ t … Löysin ratkaisun, jonka hamming-paino on yksi pienempi.
  • En yritä olla buzzkill, mutta säännöt pyytävät ohjelmaa, ei fragmenttia.

Vastaa

J , 39

+/,#:a.i:] 

Tämä on yksi toiminto Perustelu. (Tai korvaa ] suoraan merkkijonolla; kuten Gareth toteaa, kustannukset laskevat 34: een.)

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

Kommentit

  • Suuret mielet ajattelevat samalla tavalla. 🙂

vastaus

Python, 189

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

kommentit

  • Python 3 -vastaavan, print(sum(bin(ord(A)).count('1')for A in input())), pistemäärä on 180.
  • @ dan04: Käytä kaksinkertaisia lainausmerkkejä yhden sijasta vuodelle 176.

Vastaa

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 

Tyyppi oikea työkalu työhön, on silti perseestä tietysti.

Kommentit

  • +1 yhden suosikkikieleni käytöstä kaikkien aikojen ajan. Se ’ on ensimmäinen kieli, jonka opin oppimaan koodaamaan tietokoneella.

Vastaa

Unary 0

Kaikki tiesitte, että se oli tulossa. Ensin BrainFuck-ohjelma:

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

Lisäsin uusia rivejä, jotta se olisi ”luettavissa”, mutta sen Hamming-paino on 4066. Se toimii saamalla toistuvasti osamäärä / syötemerkkijonon jäännökset ja kaikki jäännökset lasketaan yhteen. Tietenkin, jos suoritat sen itse, saat: 226 (4066% 256) (teknisesti \ xe2) niin selvästi, että se määrää itsensä voittajaksi.

Nyt muunnamme sen Unaryksi ja saat

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

Käytämme unaarista toteutusta, jossa on NULL-merkkejä \ x00 ”0”: lle ja puomille, mikä haittaa painoa 0.

Bonuskysymys : Mille ASCII-merkkeille c voit käyttää tätä ohjelmaa merkkijonossa, joka koostuu N toistoja ja anna sen antaa kyseinen merkki. (E.G. 32 välilyönti merkkijono antaa välilyönnin).Mitkä N -arvot toimivat (joko loputon määrä niistä toimii tai kukaan ei toimi).

Kommentit

  • En ’ ole varma, ymmärränkö tämän ratkaisun. Aivoriihiohjelmalla on valtava haitallinen paino. Hyväksyykö Unary tyhjät tavut ohjelmana vai pitäisikö sinun ottaa Unary käyttöön uudelleen? Jos se ’ on jälkimmäinen, se ’ ei ole oikea ratkaisu – kuka tahansa voisi vain sanoa ” Määritän ohjelmointikielen, jossa mikä tahansa yksittäinen syöttötavu antaa arvon {result} ”, ja voitan kaikki koodigolf-haasteet sivustolla.
  • null hahmo Unary olisi hieno. Tarvitset vain EOF: n sanomaan lopeta laskeminen. Itse asiassa ’ on jonkin verran pseudo-C: tä lukemaan tiedosto: main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; } Doesn ’ Sillä ei ole väliä mitä valitset Unary-charsiisi (kunhan se ei ole ’ t EOF).
  • No tässä ’ on unary C-kääntäjälle, joka toimii hyvin nollamerkkien kanssa: ideone.com/MIvAg . Tietysti tämän ohjelman tekemiseen tarvittava tiedosto ei sovi universumiin, mutta meillä on kyky suorittaa se.
  • Jos voit ’ t tosiasiallisesti ajaa se, se ’ ei todellakaan ole ratkaisu.
  • Kuten Carl Sagan sanoi kerran: ” Jos haluat laskea merkkijonon vasaran painon, sinun on ensin keksittävä 10 ^ 500 universumia. ” (jopa miljardeja ja miljardeja)

vastaus

C, paino 322 263 256

Lasketaanko hammingin painon paino?

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

Käytetään pääasiassa tavallista golfia tekniikat.
Yksi silmukka laskee painon (siirtyy oikealle ja lisää nollaan) ja skannaa merkkijonon (vie osoittimen eteenpäin, kun nolla saavutetaan).
Oletetaan, että D alustetaan arvoon 2 (yksi parametri).

Painokohtainen optimointi ons:
1. ABDH, paino 2 kumpikin, käytetään nimissä.
2. *++H parempi kuin H[1].

Kommentit

  • Hah, en täysin ymmärtänyt ensimmäistä virkettäsi vasta tähän asti.
  • Voit laskea pisteet 230: een antamalla tuloksen unary -numerona: main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
  • @schnaader , En koskaan tiennyt, että @ oli numero unaarijärjestelmässä. Luulin, että se käyttää vain 0 .. 0. Mutta jos haluat mennä tällä tavalla, printf("@"+*a%2) on lyhyempi.
  • @ugoren: Riippuu unaryn yleissopimuksesta / määritelmästä. Esimerkiksi. fi.wikipedia.org/wiki/Unary_numeral_system käyttää vastaavia merkkejä ja sanoo ” Nollaa ei ole nimenomaista symbolia unary, kuten muissakin perinteisissä tukikohteissa ”.
  • @schnaader, OK, mutta mielestäni se ’ s venyttämällä vaatimusta ” numerona ” liian pitkälle.

Vastaa

Golfscript 84 72 58

{2base~}%{+}* 

(kiitos Howardille ja Peter Taylorille avusta)

Input: syötemerkkijonon on oltava pinossa (välitetään komentorivinä tai yksinkertaisesti sijoitettu pinoon).

Jos suoritat sen komentoriviltä, varmista, että käytät echo -n, muuten myös perässä oleva uusi rivi tulee näkyviin.

Output: tulostaa painavan painon arvon konsolille.

Ohjelma voidaan testata

täällä .

Kommentit

  • Onko Golfscript eroteltu isoilla ja pienillä kirjaimilla? Jos ei, voit tallentaa muutaman bitin käyttämällä BASE -tunnusta base -kohdan sijaan. Päivitys: Tarkistettu, BASE ei toimi ’. Hyvä ratkaisu 🙂
  • @Polynomial yritin sitä nähtyäni TEST / test kommenttisi 🙂 Mutta ei ’ ei toimi.
  • Voit päästä eroon {...}2* soveltamalla 2base~. Pistemäärä laskee 72.
  • @Howard kiitos tästä upeasta vinkistä! Olen ’ käyttänyt sitä vastauksessani.
  • Testimekanismisi on väärä, koska olet ’ unohtanut Web GolfScript -sivusi tärkeä rajoitus. Sinulla tulisi olla ; ennen merkkijonoa, jonka korvataan stdinillä, jotta (; on tarpeeton. Sitten Howard ’ -havainto johtaa sen 65: een.

vastaus

Perl, 80 (22 merkkiä)

Valmis ja valmis:

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

Tai tässä on vaihtoehtoinen versio, jonka paino on 77 (21 merkkiä):

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

En kuitenkaan pidä tuosta versiosta niin paljon, koska sen tuotoksesta puuttuu viimeinen uusi rivi.

Painon laskemiseksi oletan, että lasken merkkejä tavalliseen tapaan (pois lukien perl -e / -E, mutta mukaan lukien muut vaihtoehtomerkit). Jos jostain syystä ihmiset valittavat tästä, niin paras mitä voin tehdä ilman vaihtoehtoja, on 90 (26 merkkiä):

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

Esimerkkikäyttö:

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

Puomi.

Vastaa

Pyth – 15

Vastuuvapauslauseke: Tämä vastaus ei ole kelvollinen voittamaan, koska Pyth on tätä haastetta nuorempi.

Käyttää tiedostoa .B binaariesitykseen ja laskee "1" ”s: n määrän.

/.BQ\1 

Ottaa merkkijonon syötteen säästääksesi z vs. Q.

Kokeile online täällä .

Vastaa

Scala 231

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

Itsetestauskoodi:

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

muokatun testin avulla.

Kommentit

  • Sen ’ paino 495, ei 231. Voit ’ saada painoa 231 126 merkillä – että ’ on keskimäärin alle 2 ja kaikki tulostettavat merkit (paitsi @ ja välilyönti, joita et ’ ei käytetä) on vähintään paino 2.
  • @ugoren: Mutta se ’ on vain 65 merkkiä. Ohjelma tulostetaan melkein kaksi kertaa: Kerran koodi laskeaksesi painon ja toisen kerran staattisena syötteenä sen laskemiseksi ohjelmalle. Mutta laskevasta osasta puuttuu ” readLine () ” edestä, koska se vie kirjaimellisen syötteen. Yritin selvittää itse vastauksen.

Vastaus

Java, paino 931 774 499 454

Mielestäni tämä on tällä hetkellä ainoa vastaus, jonka paino on yli 300.

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

Odotetaan syötettä komentoriviargumenttina.

Vastaa

GNU sed -r, 467 + 1

(+1 käytettäessä -r – vai pitäisikö sen olla +4?)

Tulokset unariarvona lähdekenttää kohti; Jos haluat muuntaa desimaaliluvuksi, ohjaa ulostulo muotoon | tr -d "\n" | wc -c. Laskee kaikki tulostettavat ASCII-merkit (32-126) plus rivinvaihdon (10).

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

Kaikkien merkkien luetteloinnista on vaikea välttää, mutta voimme vähentää tämä huomaa, että pienten kirjainten Hamming-paino on yksi enemmän kuin vastaavat isot kirjaimet. Lauserottajana suosittelemme uutta riviä (pisteet 2) puolipisteeseen (pisteet 5) nähden; mieluummin @ (pisteet 1) tai ! (pisteet 2) yli / (pisteet 5) kuvion erottimena.

Huomaa – Jotta saisit oikeat merkistöjoukot, loin tämän taulukon sarakkeessa man ascii, lajiteltuna painon mukaan. Lisää vain pisteet oikealle ja alle saadaksesi kunkin merkin kokonaispainon:

 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 

Tämä voi osoittautua hyödylliseksi muille.

Vastaa

Julia 262 268

Muokattu versio käyttää kätevää ”count_ones” -toimintoa 6 (262) säästöön

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

Vanha versio, jossa ei ole sisäänrakennettua yhden laskennan toimintoa (268)

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

Käyttää komentoriviargumenttia syötteessä.

Vastaa

CJam 52 tai 48

Jos syötettä ei vielä ole pinossa (52)

q:i2fbs:s:i:+ 

Jos syöte on pinossa (48)

:i2fbs:s:i:+ 

Esimerkiksi

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

Vastaa

Julia, HW 199

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

Kanssa

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

tai lisäämällä merkkijono suoraan:

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 

Golfamaton versio (HW 411) näyttää tältä:

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

Ja hauskanpidon vuoksi tässä on optimoitu versio (Hamming Weight 231 ) bakergista ottaa ongelman:

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

kanssa

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

vastaus

HPPPL (HP: n ensisijainen ohjelmointikieli), 74

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

HP Prime -grafiikkalaskimessa on sisäänrakennettu hamdist () -toiminto.Jokaisen merkin vasaran paino on sama kuin vasaran etäisyys 0.

ASC (merkkijono) luo matriisin merkkijonon jokaisen merkin ASCII-arvoista.

hamdist ( arvo, 0) laskee vasaran etäisyyden 0 jokaiselle ASCII-arvolle.

summa () summaa kaikki arvot.

Oman lähdekoodin hamming-painon laskeminen:

HPPPL-painon painaminen

Vastaa

05AB1E , paino 17 (4 tavua )

ÇbSO 

Kokeile verkossa tai tarkista vielä joitain testitapauksia .

Selitys:

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

vastaus

Perl 6 , 102

Kokeile verkossa!

Vaikka tämä ei ole golfkoodi, lyhyimmällä ratkaisulla näyttää olevan myös pienin haitallinen paino …

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *