Utwórz program, który oblicza masę hamującą łańcucha. Zwycięzcą jest program o najniższej wadze młota.
Zasady:
- Waga Hamminga dla znaku ASCII jest zdefiniowana jako całkowita liczba bitów ustawiona
1
w jego reprezentacji binarnej. - Załóżmy, że kodowanie wejściowe to 7-bitowe ASCII, przekazywane przez dowolny mechanizm wejściowy, który jest normalny dla twojego języka (np. Standardowe, args itp.)
- Wyprowadź wynik jako liczbę do standardowego lub innego domyślnego / normalnego mechanizmu wyjściowego używanego przez Twój język.
- Powinno być oczywiste, ale musisz być w stanie uruchomić program w prawdziwym życiu, aby było to prawidłowe rozwiązanie.
- Zwycięzca to rozwiązanie, którego kod ma najniższą masę młota.
Niestety, nie ma dla tego rozwiązania białych znaków !Ok, możesz pisać w białych znakach, teraz uporządkowałem zasady :)
Przykłady poszczególnych znaków:
char | binary | weight
-----+----------+-------
a | 01100001 | 3
x | 01111000 | 4
? | 00111111 | 6
\x00 | 00000000 | 0
\x7F | 01111111 | 7
code-golf
binary
number-theory
Wielomian
źródło
źródło
0x20
/ ASCII 32 jako odniesienie, to czy szum nie jest równyhello world
10, a nie 11?hello world
11? Tylko 10 znaków różni się od spacji. Ponadto - waga Hamminga programu wydaje się być tylko długością, z wyłączeniem spacji. Nie różni się tak bardzo od normalnego golfa kodowego.~
ANDo
.Odpowiedzi:
J (33)
Jeden mniej niż 34!
Mocno inspirowane przez tę odpowiedź , ale waga Hamminga jednego obniżyć.
źródło
J, waga 34
Użycie - umieść ciąg do zmierzenia w cudzysłowie na końcu:
Alternatywnie, przyjmując dane z klawiatury (waga 54):
źródło
J , 39
Jest to funkcja przyjmująca jeden argument. (Lub zastąp
]
bezpośrednio sznurkiem; jak zauważa Gareth, obniża to koszt do 34.)źródło
Python, 189
źródło
print(sum(bin(ord(A)).count('1')for A in input()))
ma wynik 180.QBasic,
322311286264Rodzaj właściwe narzędzie do pracy, nadal ssie oczywiście.
źródło
Unary 0
Wszyscy wiedzieliście, że to nadchodzi. Najpierw program BrainFuck:
Dodałem nowe wiersze, aby uczynić go „czytelnym”, ale ma wagę Hamminga 4066. Działa poprzez wielokrotne pobieranie ilorazu / reszty ciągu wejściowego i sumowanie wszystkich pozostałych. Oczywiście, jeśli uruchomisz go na sobie, otrzymasz: 226 (4066% 256) (technicznie \ xe2) tak wyraźnie, że rządzi się zwycięzcą.
Teraz przekształcamy go w Unary i otrzymujemy
Używamy jednoargumentowej implementacji ze znakami NULL \ x00 dla „0” i wysięgnika, co daje wagę 0.
Pytanie dodatkowe : Dla jakich znaków ASCII
c
możesz uruchomić ten program na łańcuchu składającym się zN
powtórzeń i wypuścić ten znak. (Np. Ciąg 32 spacji daje spację). Jakie wartościN
pracy (albo nieskończona ich liczba zadziała, albo żadna nie zadziała).źródło
main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }
Nie ma znaczenia, co wybierzesz jako swój Unary char (o ile nie jest to EOF).C, masa
322263256Czy liczy się ciężar wbijający w młot?
Stosowane głównie standardowe techniki gry w golfa.
Pojedyncza pętla oblicza masę (przesuwa się w prawo i dodaje do zera) i skanuje ciąg znaków (przesuwa wskaźnik, gdy osiągnie zero).
Zakładając, że
D
jest inicjowany na 2 (pojedynczy parametr).Optymalizacje specyficzne dla wagi Hamminga:
1.
ABDH
, każda z wagą 2, używana dla nazw.2.
*++H
preferowaneH[1]
.źródło
main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
@
jest cyfrą w systemie jednorzędowym. Myślałam, że używa tylko0
..0
. Ale jeśli chcesz to zrobić, drogaprintf("@"+*a%2)
jest krótsza.Golfscript
847258(podziękowania dla Howarda i Petera Taylora za ich pomoc)
Dane wejściowe: ciąg wejściowy musi znajdować się na stosie (przekazany jako argument wiersza poleceń lub po prostu umieszczony na stosie).
Jeśli uruchamiasz go z wiersza poleceń, upewnij się, że używasz
echo -n
, w przeciwnym razie liczony będzie również znak nowej linii.Wyjście: drukuje wartość masy młota na konsoli
Program można przetestować tutaj .
źródło
BASE
zamiastbase
. Aktualizacja: właśnie zaznaczona,BASE
nie działa. Dobre rozwiązanie :)TEST
/test
komentarza :) Ale to nie działa.{...}2*
, aplikując2base~
w pierwszej kolejności. Uzyskuje wynik do 72.;
przed ciągiem, który zastępujesz stdin, więc nie(;
jest to konieczne. Następnie obserwacja Howarda sprowadza się do 65.Perl, 80 (22 znaków)
Sporządzono i zrobiono:
Lub tutaj jest alternatywna wersja o wadze 77 (21 znaków):
Nie podoba mi się jednak ta wersja, ponieważ jej wynik pomija ostatnią nową linię.
Aby obliczyć wagę, zakładam, że liczę znaki w zwykły sposób (wyłączając
perl -e
/-E
, ale włączając inne znaki opcji). Jeśli z jakiegoś powodu ludzie narzekają na to, to najlepsze, co mogę zrobić bez opcji, to 90 (26 znaków):Przykładowe użycie:
Bum.
źródło
Pyth - 15
Oświadczenie: Ta odpowiedź nie kwalifikuje się do wygrania, ponieważ Pyth jest młodszy od tego wyzwania.
Wykorzystuje
.B
reprezentację binarną i zlicza liczbę"1"
.Pobiera dane wejściowe w ciągu, aby zaoszczędzić na
z
kontraQ
.Wypróbuj online tutaj .
źródło
Scala 231
Kod testowy:
z modyfikacją samokontroli.
źródło
@
i spacji, których nie używasz) mają co najmniej wagę 2.Java, waga
931774499454Myślę, że w tej chwili jest to jedyna odpowiedź o wadze ponad 300.
Oczekuje danych wejściowych jako argumentu wiersza poleceń.
źródło
GNU
sed -r
, 467 + 1(+1 za użycie
-r
- czy powinno to być +4?)Wyjściowe wartości jednostkowe na linię źródłową; aby przekonwertować na liczbę dziesiętną, przekieruj wyjście na
| tr -d "\n" | wc -c
. Zlicza wszystkie drukowalne znaki ASCII (32-126), plus wysuw wiersza (10).Trudno jest uniknąć wyszczególnienia wszystkich znaków, ale możemy to zmniejszyć, zauważając, że małe litery mają ciężar Hamminga o jeden większy niż odpowiadające im wielkie litery. Wolimy znak nowej linii (wynik 2) niż średnik (wynik 5) jako separator instrukcji; my wolimy
@
(wynik 1) lub!
(wynik 2) niż/
(wynik 5) jako ogranicznik wzoru.Uwaga - aby uzyskać odpowiednie zestawy znaków, stworzyłem tę tabelę od tej
man ascii
, posortowanej według wagi. Po prostu dodaj wyniki bezpośrednio i poniżej, aby uzyskać całkowitą wagę każdej postaci:Może się to przydać innym.
źródło
Julia 262
268Zmodyfikowana wersja wykorzystuje przydatną funkcję „count_ones” dla oszczędności 6 (262)
Stara wersja bez wbudowanej funkcji liczenia (268)
Używa argumentu wiersza poleceń do wprowadzania danych.
źródło
CJam 52 lub 48
Jeśli dane wejściowe nie są jeszcze na stosie (52)
Jeśli dane wejściowe są na stosie (48)
Na przykład
źródło
Julia, HW 199
Z
lub bezpośrednio wstawiając ciąg:
Wersja bez golfa (HW 411) wygląda następująco:
A dla zabawy, oto zoptymalizowana wersja (Hamming Weight 231 ) podejścia Bakerga do problemu:
z
źródło
HPPPL (HP Prime Programming Language), 74
Kalkulator graficzny HP Prime ma wbudowaną funkcję hamdist (). Masa uderzenia każdego znaku jest taka sama, jak odległość uderzenia od 0.
ASC (ciąg) tworzy tablicę wartości ASCII każdego znaku w ciągu.
hamdist (wartość, 0) oblicza odległość uderzenia od 0 dla każdej wartości ASCII
sum () sumuje wszystkie wartości.
Obliczanie masy młota własnego kodu źródłowego:
źródło
05AB1E , waga 17 (4 bajty )
Wypróbuj online lub sprawdź kilka innych przypadków testowych .
Wyjaśnienie:
źródło
Perl 6 , 102
Wypróbuj online!
Chociaż nie jest to golf golfowy, wydaje się, że najkrótsze rozwiązanie ma również najmniejszą masę młota ...
źródło