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
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ää vain0
..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
-tunnustabase
-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*
soveltamalla2base~
. 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
.
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:
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
+*.ords>>.base(2).comb(~1)
Vaikka tämä ei ole golfkoodi, lyhyimmällä ratkaisulla näyttää olevan myös pienin haitallinen paino …
0x20
/ ASCII 32 viitteenä ei ole ’ thello world
10: n koliseva paino kuin 11?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.~
JAo
.