To wyzwanie jest oparte na tym filmie . Zalecam obejrzenie go przed wypróbowaniem tego wyzwania.
Najpierw definiujemy funkcję. Ta funkcja ( OEIS ) przyjmuje na wejściu liczbę całkowitą n i wyświetla liczbę liter w angielskiej reprezentacji n (bez spacji i łączników). Na przykład „trzy” ma 5 liter, więc 3 odwzorowuje na 5.
Jak pokazano na filmie rozpoczynającym się od dowolnej liczby powtarzającej się, ten proces ostatecznie doprowadzi do liczby 4, która będzie mapować się na zawsze.
Oto przybliżony skierowany wykres pokazujący orbity liczb mniejsze niż 16:
12 11
\|
15 2 6 1 10 14 13
\ \|/ / / /
7 3-/ 8--/
\| /
9 0 5--/
\ \|
\-4
Wyzwanie polega na określeniu liczby kroków, które wykona liczba (lub ile razy ta funkcja musi zostać zastosowana do liczby) przed osiągnięciem czterech (tj. Poziom na pokazanym wykresie skierowanym).
Formowanie liczb angielskich
Oto krótkie wyjaśnienie, w jaki sposób należy sformułować angielskie słowa dla tego wyzwania:
Numery od jeden do dziewiętnaście to:
jeden, dwa, trzy, cztery, pięć, sześć, siedem, osiem, dziewięć, dziesięć, jedenaście, dwanaście, trzynaście, czternaście, piętnaście, szesnaście, siedemnaście, osiemnaście, dziewiętnaście
W przypadku liczb większych niż dziewiętnaście proces wygląda następująco:
Jeśli liczba ma setki miejsc, zacznij od nazwy cyfry w setkach miejsc i „sto”.
na przykład
100 -> "onehundred"
Jeśli reszta jest mniejsza niż dwadzieścia, dołącz reprezentację w języku angielskim.
na przykład
714 -> "sevenhundredfourteen"
W przeciwnym razie, jeśli cyfra dziesiątek nie jest zerowa, dołącz odpowiednią reprezentację:
2-> twenty
3-> thirty
4-> forty
5-> fifty
6-> sixty
7-> seventy
8-> eighty
9-> ninety
na przykład
470 -> "fourhundredseventy"
Wreszcie, jeśli jest jedna cyfra, dołącz jej reprezentację
na przykład
681 -> "sixhundredeightyone"
Dalsze postanowienia
W przypadku liczb większych niż sto należy pominąć znaki „i” podczas liczenia liczby liter. Na przykład 577 to „pięćset siedemdziesiąt siedem”, które ma 23 litery.
Twój program musi akceptować wszystkie liczby całkowite większe niż 0 i mniejsze niż 1000 jako dane wejściowe standardowymi metodami.
Twój program musi wypisać liczbę kroków wymaganych do standardowych metod wyjścia.
To jest codegolf, więc wygrywa rozwiązanie z najmniejszą liczbą bajtów.
Przypadki testowe
1 -> 3
4 -> 0
7 -> 2
23 -> 5
577 -> 6
600 -> 4
źródło
Odpowiedzi:
JavaScript (ES6), 106 bajtów
Ciągi wydają się być najlepszym sposobem na zakodowanie długości, pomimo narzutu konwersji numerycznej.
źródło
Python, z num2words,
97 113 115 94 9392 bajtów+16 bajtów (zapomniałem dzielenia że num2words stosuje który nie zmienia wyników żadnego z przypadków testowych, choć
23
i577
każdy ma myślnika)+2 bajtów (zapomniałem to
f=
chociaż rekurencyjna)-20 bajtów (wykorzystania
re
)-8 bajty dzięki @Wheat Wizard (użytkowania
~
, należy wymienićn!=4
zn-4
i ... jeden import linia> _ <)-1 bajt dzięki @Cyoce (przestrzeń z
4 and
)Liczy tylko liczbę kroków; działa również na duże i ujemne liczby całkowite (
\W
znajduje spacje, przecinki i łączniki w wyniku funkcji num2words):Oto ostatni przypadek, krok po kroku:
źródło
f=
wcześniejszej funkcji lambdaimport re,num2words as r
zamiast dwóch różnych instrukcji.n-4
to to samo, con!=4
num2words
jestw
,re
jest nadalre
- zwróć uwagę, że zarówno moduł, jak i funkcja są nazywanenum2words
and 1+
można go zastąpić,and-~
aby zaoszczędzić jeden bajtPyth - 54 bajty
Spróbuje refaktoryzować.
Pakiet testowy .
źródło
Mathematica, 89 bajtów
Typowa matematyka: dobre wbudowane funkcje, złe długie nazwy funkcji.
FixedPointList
stosuje swój pierwszy argument (funkcję) wielokrotnie do drugiego argumentu, dopóki odpowiedź się nie zmieni, wyświetlając wszystkie wyniki; wyniki obejmują oryginalne dane wejściowe i dwie kopie powtarzanych danych wyjściowych, stąd-2
na końcu. Wbudowane oprogramowanie MathematicaIntegerName
zawiera spacje i łączniki, więc musimy się ich pozbyć ręcznie.Irytujące
IntegerName
wyjście zawiera znak „-” (Unicode # 8208) zamiast zwykłych łączników; dlatego przesyłanie to 89 bajtów zamiast 88. (I nie mogłem poprzedzić powyższego kodu czterema spacjami i pozwolić, aby zaakceptował znak Unicode - jakakolwiek pomoc? - więc powyższy kod nie będzie działał poprawnie, jeśli zostanie wycięty i wklejony .)źródło
Python 2.7,
344216208 bajtów:Nie używa żadnych bibliotek zewnętrznych w przeciwieństwie do innych odpowiedzi w języku Python. Przenosi dane wejściowe
stdin
i wyjściowe dostdout
.Zamień na wszystkie przypadki testowe!
Wyjaśnienie
Najpierw tworzy 3 słowniki, w których każda paruje długość reprezentacji angielskich słów dla każdej liczby z liczbą, którą reprezentuje w zamkniętym przedziale, odpowiednio
[1,9]
w miejscach jedynki, dziesiątki i setki. Na przykład, pierwsza pozycja w słownikud
jest1:3
jak1
jest napisaneone
w języku angielskim i ma3
litery.Następnie każda cyfra umieszczona w danych wejściowych ciągu
x
jest przypisywana do odpowiedniego słownika, po czym każda liczba w każdym miejscu jest dopasowywana do jej wartości w odpowiednim słowniku. Załóżmy na przykład, że wprowadzony numer to23
. Miejsce20
w dziesiątkach byłoby sparowane ze słownikieme
, w którym jest on dopasowany6
, a miejsce3
w jedności byłoby sparowane ze słownikiemd
, w którym jest dopasowany5
. Te dopasowane cyfry są następnie dodawane razem, aby reprezentować długość angielskiej reprezentacji liczby, która jest przypisanax
jako ciąg i tak długo, jak długox!='4'
trwa pętla while, zwiększającc
o1
za każdym razem, aby przedstawić liczbę dotychczasowych kroków. Dlatego23
odpowiadałby11
, co z kolei odpowiadałoby, do6
którego zwróciłoby się,3
a następnie do,5
a na końcu4
, w wyniku5
całkowitej liczby kroków.Wreszcie, gdy pętla się zakończy, wysyłana
c
jest wartość wyjściowastdout
reprezentująca „Odległość do czterech”, która w tym przypadku byłaby5
.źródło
Jawa,
556295 bajtówDzięki @KevinCruijssen za oszczędność 261 bajtów
Nie golfowany:
źródło
s++
s
.. Btw, możesz zagrać w golfa o całkiem sporą kwotę w następujący sposób:int c(int n){int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8,6,9,9,11,10,6,5,5,5,7,6,6},c=0,t=(int)Math.pow(10,(int)Math.log10(n)),x=1;while(n>0)if(n/100>0)c+=s[n/100]+7;else{if(n>0&n<25){c+=s[n];break;}else c+=s[(n/10)+22];}n%=t;t/=10;}for(;c!=4;x++,c=s[c]);return x;}