Wprowadzenie:
Myślę, że wszyscy o tym wiemy i prawdopodobnie została przetłumaczona na wiele różnych języków: piosenka dla dzieci „Głowa, ramiona, kolana i palce u stóp”:
Głowa, ramiona, kolana i palce, kolana i palce
Głowa, ramiona, kolana i palce, kolana i palce
I oczy, uszy i usta i nos
Głowa, ramiona, kolana i palce, kolana i palce
wikipedia
Wyzwanie:
Dane wejściowe: dodatnia liczba całkowita.
Dane wyjściowe: wypisz jedno z następujących słów na podstawie danych wejściowych jako n-ty indeks:
head
shoulders
knees
toes
eyes
ears
mouth
nose
Tutaj części ciała są dodawane z indeksami:
Head (0), shoulders (1), knees (2) and toes (3), knees (4) and toes (5)
Head (6), shoulders (7), knees (8) and toes (9), knees (10) and toes (11)
And eyes (12) and ears (13) and mouth (14) and nose (15)
Head (16), shoulders (17), knees (18) and toes (19), knees (20) and toes (21)
Head (22), shoulders (23), knees (24) and toes (25), knees (26) and toes (27)
Head (28), shoulders (29), knees (30) and toes (31), knees (32) and toes (33)
And eyes (34) and ears (35) and mouth (36) and nose (37)
Head (38), shoulders (39), knees (40) and toes (41), knees (42) and toes (43)
etc.
Zasady konkursu:
- Oczywiście możesz używać danych wejściowych 1-indeksowanych zamiast 0-indeksowanych. Ale proszę podać, którego użyłeś w swojej odpowiedzi.
- W danych wyjściowych nie jest rozróżniana wielkość liter, więc jeśli chcesz wyprowadzać je wielkimi literami, to w porządku.
- Powinieneś obsługiwać dane wejściowe do co najmniej 1000.
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi odnoszą się standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- W razie potrzeby dodaj również wyjaśnienie.
Przypadki testowe (indeksowane 0):
Input: Output:
0 head
1 shoulders
7 shoulders
13 ears
20 knees
35 ears
37 nose
98 knees
543 nose
1000 knees
code-golf
string
kolmogorov-complexity
Kevin Cruijssen
źródło
źródło
kolmogorov-complexity
odpowiedzi, które zawsze mają takie same stałe dane wyjściowe, ale teraz widzę, że chodzi o ustalone ciągi wyjściowe w kodzie i znajdowanie wzorców do gry w golfa (lub kodowania go jak w odpowiedzi 05AB1E @ Enigmy ). Dzięki za dodanie; Nie byłem zbyt pewien, jakie tagi są odpowiednie dla tego wyzwania, które było jednym z moich (niestety bez odpowiedzi) pytań w piaskownicy.inquestion:2140 shoulders
.Odpowiedzi:
05AB1E ,
363534 bajtówWypróbuj online! lub jako pakiet testowy
Wyjaśnienie
Krótko mówiąc, budujemy listę
['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']
i indeksujemy ją za pomocą danych wejściowych (indeksowanych 0).źródło
‡ä¾ØsÏ©s¸±s
wydaje się dziwne, biorąc pod uwagę, że każde słowo składa się z 2 znaków. Czy to coś innego?s
mnogiej,shoulder, knee, toe
które są w liczbie pojedynczej w słowniku. Nie potrzebujemy tego,eyes, ears
ponieważ są one już pluralizowane w słowniku, więc łańcuch ma oczekiwaną parzystą długość.JavaScript (ES6),
918887 bajtówJak to działa
Mamy 4 odrębne pary słów, które zawsze pojawiają się razem: po „głowie” zawsze występują „ramiona”, po „kolanach” zawsze występują „palce u nóg” itp.
Dlatego możemy użyć następującego indeksu:
I skompresuj całą sekwencję (w odwrotnej kolejności) do następującej maski binarnej:
Używamy
[ 'knees', 'toes' ]
jako pierwszej pary, aby uzyskać jak najwięcej zer wiodących, jak to możliwe.Uzupełniamy tę sekwencję dodatkowym,
0
aby wyodrębniona wartość została wstępnie pomnożona przez 2, co prowadzi do:Stąd końcowy wzór na właściwe słowo:
Przypadki testowe
Pokaż fragment kodu
źródło
Python 2,
158148137128114109104 bajtówTabela przeglądowa wydaje się lepsza. Skróciłem również duży sznurek i zmieniłem kolejność przedmiotów. -5 bajtów dzięki Rod za użycie łańcucha jako listy.
wstępne rozwiązanie:
źródło
hskteemnehnoyaooaoeeerusduessste ls h d
a następnie dodając „ers”, jeśli wiesz, że to słowo powinno być „ramiona” :)c=int('602323'*2+'4517602323'[input()%22])
i upuścićh
c:[i%22]
po pierwsze,[input()%22]
po drugiePerl, 74 bajty
73 bajtowy kod + 1 dla
-p
.Wykorzystuje indeksowanie 0. Nie generuje separatora, ale można to zmienić za
-l
pomocą flag.Wypróbuj online .
źródło
x2)x2
zamiastx2),@a
Python 2,
9790 bajtówByć może jest taka matematyka, więc nie muszę tworzyć listy słów, ale na razie to działa!
Dzięki Flp.Tkc za zapisanie 7 bajtów :)
źródło
split()
k='head shoulders '+'knees toes '*2
print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
Java 7,
155137131123111110 bajtów-12 bajtów dzięki @Neil .
-1 bajt, bezwstydnie tworząc port niesamowitej odpowiedzi @Arnauld .
Java jest indeksowana na 0, więc tego właśnie użyłem.
Kod niepoznany i testowy:
Wypróbuj tutaj.
Wydajność:
źródło
String c(int i){return "head,shoulders,knees,toes,knees,toes,eyes,ears,mouth,nose".split(",")[(i+16)%22%16%10];}
ma tylko 112 bajtów.C,
153 bajty141 bajtówDzięki @cleblanc za 4 bajty. Deklaracja b globalnie rzuca masę ostrzeżeń o rzucaniu na int, ale nie złamała się dla mnie.
Nie golfowany:
To nie jest najmniejsza odpowiedź, ale podobała mi się technika i dobrze się bawiłem, znajdując kilka wzorów.
Dziennik zmian:
b
do globalnego, aby uniknąćchar
(4 bajty)a > 11 && a < 16
=>(a & 12) > 8
(2 bajty)i=(a-6)%10
=>i=(a+4)%10
tak, żei < 2 && i >= 0
=>i < 2
(6 bajtów)źródło
*b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'
a następnie zastąpić zwracany b [...] puts (b [...]), aby sprowadzić go do 143 bajtów&&
na&
.JavaScript (ES6)
9189 bajtówźródło
%
:n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10]
.R, 95 bajtów
Tworzy wektor znaków, aby działał jako tabela odnośników. Pobiera dane wejściowe z stdin (
1-indexed
) i%%22
znajduje odpowiednią część ciała.Bonus:
%%
jest wektoryzowany, co oznacza, że będzie to również działać z wejściami wektorowymi.Przypadki testowe na skrzypcach R (zauważ, że jest to nazwana funkcja, ponieważ
scan
nie działa na skrzypcach R)źródło
jq, 80 znaków
(Kod 77 znaków + opcja wiersza poleceń 3 znaki)
Przykładowy przebieg:
Test on-line (Przekazanie
-r
adresu URL nie jest obsługiwane - sprawdź sam wynik wyjściowy).źródło
WinDbg,
207157151 bajtów-50 bajtów przez kodowanie przesunięcia / długości części ciała jako znaków ascii.
-6 bajtów przy użyciu lokalnego var podczas wyszukiwania przesunięcia / długości.
Wprowadzanie odbywa się za pomocą wartości ustawionej w pseudorejestru
$t0
.Jak to działa:
Przykładowe dane wyjściowe:
źródło
PHP, 91
102118128129BajtówIndeksowane 0
W dół do 91 po usunięciu str_split, nie zdawałem sobie sprawy, że ciąg PHP jest dostępny jako tablica znaków (PHP 5+?)
Do 102 dzięki sugestii insertusername do usuwania cudzysłowów i dopuszczania powiadomieńźródło
'
słowa, takie jak'head'
staje sięhead
itp.error_reporting
.Galaretka , 55 bajtów
Wypróbuj online!(Indeks 1)
Daj spokój! Naprawdę?
Jako bonus, to jest skompresowany ciąg, którego miałem użyć zamiast górnej linii:
Oba kodują ten ciąg:
Chyba powinienem teraz poćwiczyć: P
źródło
PowerShell, 91 bajtów, zero indeksowanych
Bardzo proste podejście, wygeneruj tablicę pierwszych 22 elementów, używając, w miarę możliwości, mnożenia ciągu znaków, kompilując je ze spacjami i dzieląc na końcu. (dzielenie jest o 2 bajty krótsze niż równoważne ustawienie jako tablica), a następnie po prostu znajdź punkt w tej tablicy, używając modułu wejściowego, niezbyt interesujący lub specyficzny dla języka.
Przypadek testowy:
itp.
źródło
rubin, 81 bajtów
Funkcja lambda z wykorzystaniem indeksowania zerowego.
wyjaśnienie
Generujemy następującą tablicę, z której korzystamy z pierwszych 16 elementów, obejmujących prawidłowe wiersze 2,3,4 utworu:
Bierzemy n modulo 22, aby zredukować go do jednego wiersza, a następnie odejmujemy 6. Teraz indeks 6 (na przykład) został zmieniony na 0 i wskazuje na właściwe słowo. Wskazuje 0..5, które wskazują na pierwszy wiersz piosenki, są teraz ujemne. Używamy
&15
(identycznie jak%16
w nawiasach, ale unika się potrzeby), aby zamapować pierwszą linię utworu na czwartą linię. Zatem indeks0
->-6
->10
w programie testowym
źródło
->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
Befunge,
129119 bajtów0-indeksowane
Wypróbuj online!
Wyjaśnienie
Jak zauważył Arnauld , słowa występują w parach, więc mamy indeks tylko 11 wartości, a następnie dodajemy słowo% 2, aby uzyskać odpowiednie słowo w parze. Słowa są wypychane na stos jako pojedynczy ciąg oddzielony gwiazdkami, aby zaoszczędzić miejsce. Testujemy dzielenie wyrazów, biorąc wartość char modulo 7, ponieważ tylko gwiazdka jest wielokrotnością 7.
źródło
SQL 2005 747 bajtów
Gra w golfa:
Nie golfowany:
Potrzebuje takiej tabeli, w której pierwsza kolumna jest automatycznie zwiększana:
To jest odpowiedź z jednym indeksem. Tabela jest zapełniana przy pierwszym utworzeniu procedury składowanej - nie pozwoliłbym zrobić wszystkiego
INSERT
w jednym zdaniu, niestety, ta funkcja jest dostępna tylko w>=SQL 2008
. Następnie wykorzystuje%22
lewę z innych odpowiedzi. Po wypełnieniu tabeli używana jest tylko ostatnia część:źródło
bash (z ed), 83 znaki
1-indeksowany
Przykładowe połączenie:
źródło
dc , 135 bajtów
Wypróbuj online!
Tablice
dc
muszą być budowane jednocześnie, co stanowi ciężar tego ćwiczenia. Ponieważ „oczy”, „uszy”, „usta” i „nos” pojawiają się tylko raz w naszym zestawie, po prostu je wkładamy. Ale dla pozostałych oszczędzamy kilka bajtów, umieszczając je na stosiex[head]x
, gdzie x jest środkiem jego trzech wartości, a następnie uruchamiamy makro,[:add6-r;ar:adA+r;ar:a]dshx
aby umieścić je w tablicy, pociągnąć z powrotem, umieścić w tej samej wartości pomniejszonej o sześć, wyciągnąć z powrotem, a następnie umieścić po raz ostatni przy pierwotnej wartości plus dziesięć. Używamy wartości środkowej, ponieważdc
pozwala nam używać cyfr szesnastkowych nawet w trybie dziesiętnym, a odejmowanieA
jest o jeden mniej bajtowe niż dodawanie16
- Działa to również tylko dlatego, że wszystkie środkowe wartości są mniejsze niż piętnaście. Musimy zrobić kolana i palce u nogi dwa razy, a sprawienie, by nasze makro było wystarczająco inteligentne, aby rozwiązać ten problem, jest droższe niż dwukrotne uruchomienie makra; ale zapisujemy tutaj bajty, ładując wcześniej zapisaną kopię ciągu zamiast zapisywać go ponownie (wB 3;aB
porównaniuB[toes]B
- myślę, że to oszczędza łącznie 3 bajty).Kiedy już tablica zbudowana, wszystko co musisz zrobić, to
22%
a następnie;ap
wyciągnąć go z tablicy i wydrukować.źródło
C # 6, 138 bajtów
repl.it demo
Niegolfowane + komentarze:
źródło
Split
i mieć taki sam czek jak ternary (?:
) w nawiasach kwadratowych (z+4
drugą częścią), w ten sposób:string F(int i)=>"eyes,ears,mouth,nose,head,shoulders,knees,toes,knees,toes".Split(',')[(i+10)%22<4?(i+10)%22%4:(i+6)%22%6+4];
( 126 bajtów )Excel, 146 bajtów
Używa @ Neila
MOD(MOD(MOD(B1+16,22),16),10)
do zapisywania15
bajtów.źródło