Wyzwanie CodeGolf
PWSSHHHH! Budzisz się w laboratorium kriogenicznym w 3000 roku. Po eskortowaniu do biura zadań, aby otrzymać chip kariery, prawdopodobnie od chłopca z dostawy, sonda wykrywa, że jesteś od 2000 roku. Z tego powodu i kilku stereotypy, jesteś głupi w porównaniu z dzisiejszym współczesnym człowiekiem i zmuszony jesteś powtarzać klasę.
Wchodzisz do swojej pierwszej klasy, a nauczyciel daje zadanie. Ona powie lub napisze liczbę do 50. Jeśli zapisze numer na tablicy (na przykład: 25), musisz podać liczby do tej liczby „jeden, dwa, trzy, ..., dwadzieścia pięć „. Jeśli powie głośno liczbę (na przykład „sześć”), wówczas na tablecie musisz wpisać liczby do tej liczby „1, 2, 3, 4, 5, 6”
To staje się bardzo żmudne i decydujesz, że zautomatyzujesz ten proces za pomocą wciąż działającej, ale archaicznej wiedzy programistycznej XXI wieku.
Cel:
Twój program powinien wziąć udział. Będzie to albo liczba dziesiętna ( 1 thru 50
), albo liczba zapisana ( one thru fifty
).
• Jeśli wprowadzana liczba jest liczbą dziesiętną, wynik powinien liczyć się od jednej do tej liczby, używając stylu zapisanego. (np. trzydzieści dwa )
• Jeśli wejście jest liczbą zapisaną, wynik powinien liczyć się od 1 do tej liczby, używając stylu dziesiętnego. (np. 32 )
Zasady:
Dane wejściowe i wyjściowe mogą być w każdym wybranym przez Ciebie przypadku (możesz więc stworzyć program, który akceptuje wielkie litery tylko w razie potrzeby).
Wprowadzane liczby dziesiętne nie muszą być typu liczbowego (np. Int), mogą być łańcuchem wejściowym zawierającym liczby (25 vs „25”). Oba są w porządku i możesz wybrać, który program ma zaakceptować. (Twój program nie musi akceptować obu)
Zapisany styl NIE wymaga łącznika między słowami złożonymi, ale możesz w razie potrzeby.
Wartości wyjściowe muszą być oddzielone w jakiejś formie, każdy separator jest w porządku 1,2,3
1 2 3
etc
Nie można dodawać dodatkowych bibliotek, takich jak num2words (python) itp. (Jednak biblioteki systemowe są w porządku)
Mimo że historia mówi, że pochodzisz z 2000 roku, możesz używać języków utworzonych po tej dacie (LOL)
To jest golf golfowy , więc wygrywa program z najkrótszą liczbą bajtów!
Odpowiedzi:
Perl 6 ,
119113 bajtówBaza danych Unicode FTW!
Wykorzystuje wypisane wielkie litery bez myślnika, np
TWENTYTWO
.Zwraca listę ciągów znaków lub zakres liczb. (Oba używają spacji jako separatora po wydrukowaniu za pomocą
put
.)źródło
Python3,
276271269243237235232217 bajtówBiorąc pod uwagę przesłanie perla @smls ...
Podejrzewam, że może być nieco bardziej golfa.
Wykorzystuje bibliotekę systemową
unicodedata
do wyszukiwania nazw numerów. Wymaga to wprowadzania nazw wielkich liter (oddzielonych spacjąFORTY TWO
:) lub liczb całkowitych dziesiętnych jako danych wejściowych.(To jest mój pierwszy kod golfowy.)
(Właśnie zauważyłem, że źle przeliczyłem długość (kodowanie), więc jest to kilka bajtów mniej niż wcześniej sądziłem. Jednak zaktualizowałem tylko najnowszą liczbę bajtów. Ups.)
źródło
unicodedata
to biblioteka systemowa dostarczana z domyślną instalacją, a nie „dodatkowa” biblioteka, którą należy zainstalować osobno.for
pętli i wprowadzając znaki nowej linii między każdym wyjściem.print()
nie obchodzi go, czy jest to liczba całkowita, czy łańcuch. Wypróbuj online!import*
zamiastimport name
zaoszczędzić kilka bajtówCommon Lisp,
297253243242144128Detale
~[ 0 ~; 1 ~; ... ~:; else ~]
to przełącznik oparty na wartości następnego dostępnego argumentu, który przeskakuje do odpowiedniego formatu kontrolki podrzędnej. Tutaj mam tylko przypadek „0” i „else”. Służy do wstawiania separatora przed każdą liczbą oprócz pierwszej, dzięki U zaczynając od zera.~:[ FALSE ~; TRUE ~]
jest formatem warunkowym; tutaj wypisujemy różne rzeczy, niezależnie od tego, czy dane wejściowe s są ciągiem znaków, czy nie.~R
napisz liczbę jako główny numer angielski, a~D
po prostu wydrukuj liczbę.Przykłady
źródło
f
tak, że „(f 2)” drukuje „jeden, dwa” i(f "two")
drukuje „1, 2”, czy to wygląda dobrze?JavaScript ES6,
559 526 381 368 364 358 332 327315 bajtówPodziękowania dla Kritixi Lithos za pomysł podzielenia tablicy i Arnaulda za sztuczkę 1 / n.
źródło
var
i możesz zmienić tablicę['one,'two',..]
na"one0two0three0...".split(0)
null, Array(n)
.!isNaN(n)
przez1/n
. To daje ciNaN
łańcuch (falsy), niezerową liczbę zmiennoprzecinkową dla niezerowej liczby całkowitej (prawda) lubInfinity
dla 0 (także prawda).Python 2 ,
503499494490479 bajtów-5 dzięki dzięki @JonathanAllan
Wypróbuj online!
Wprowadź liczbę lub pisownię liczby oddzieloną spacją.
Nieco mniej golfowa i bardziej czytelna wersja:
źródło
l="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
e
odnineteen
.Schemat,
161,152, 149Nieskompresowane:
źródło
string->number
, sprawdziłem szybko i wydaje się, że jest używany do konwersji np. Z ciągu"4"
na liczbę4
.(string->number "four")
zwraca#f
.PHP -
397372349344329 bajtówZainspirowany rozwiązaniem JS TomDevs
Zaoszczędzono 25 bajtów, zastępując
$a=[...]
przez$a=explode(...)
Zaoszczędzono kolejne 23 bajty, przełączając się z powrotem do tablicy bez ograniczników ciągów i przechowując
teen
w zmiennej dzięki @ user59178Zaoszczędzono kolejne 5 bajtów, usuwając
(int)
rzutowanie czcionekZapisano kolejne 15 bajtów, upuszczając
$b
,$i
wfor
deklaracjach i nawiasach klamrowych, dzięki @ user59178 ponownieNie golfowany:
Wypróbuj dla ciągu wejściowego lub dla numeru wejściowego
źródło
teen
w zmiennej zamiast powtarzać ją za każdym razem. Jako taki stałby się:$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];
;)
$b
i umieszczając drugą tablicę bezpośrednio w foreach, 6 dodatkowych bajtów, upuszczając wszystkie nawiasy klamrowe (chociaż musisz wprowadzić$a=$c
konfigurację pętli for) i 6 kolejnych bajtów, wykonując przyrostowe$i
kiedy go używasz, a nie w części „po” pętli for.for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Python 2, 262 bajty
repl.it
Ciągi wejściowe i wyjściowe są pisane małymi literami i łączone *, więc aby przetestować ciąg wejściowy, wpisz na przykład:
"thirtyfive"
monit.Tworzy listę wszystkich słów (od plus
"fiftyone"
do"fiftynine"
),x
a następnie sprawdza, czyinput
jest to słowo z proxyv>50
(łańcuchy są większe niż liczby w Pythonie 2, a wszystkie liczby w prawidłowym zakresie wejściowym ze specyfikacji są<=50
) iprint
s odpowiednie wartości przez wycięcie listy,x[:v]
lub budując zakres liczb całkowitych,range(1,x.index(v)+2)
.* Dodanie dzielenia wyrazów dla obu kosztuje 11 bajtów, zastępując
a+"ty"b
jea+"ty"+'-'*(b>'')+b
.źródło
Wolfram Language, 92 bajty
(Jestem nowy, daj mi znać, jeśli zrobiłem coś złego)
źródło
Do[Print@If[#>0,i,,IntegerName@i],{i,If[#>0,#,,Interpreter["SemanticNumber"]@#]}]&
JavaScript (ES6), 261 bajtów
Uwaga: ciąg przypisany do z jest kodowany za pomocą
atob
. W zakodowanym ciągu znajduje się 11 bajtów, których nie mogę opublikować na tej stronie, nawet jeśli są one poprawnymi znakami w ciągu javascript. Użyłem więc ucieczki heksadecymalnej w postaci \ xHH. Każda z tych ucieczek jest liczona jako 1 bajt.Oryginalny nieskompresowany ciąg jest wersją mniej golfową .
Mniej golfa
Test
źródło
ö\x89ÞöÜ(öØ...
te rzeczy są świetne hahaaPython 3 ,
305303 bajtówKonwersja do Python 3 po porady od @ nedla2004. Teraz nie ma również spacji między wpisanymi liczbami na wejściu lub wyjściu, np. Wpisz twentytwo
Wypróbuj online 3!
Python 2 ,
327320313308 bajtówWypróbuj online 2!
163170177 bajtów krótszych niż moja pierwotna odpowiedź, więc zamieszczam ją jako alternatywę. Wykorzystuje tofor
na dwóch listach, aby zbudować pełną listę wszystkich reprezentacji ciągów liczb, a następnie identyfikuje właściwą na liście i drukuje wszystko do niej według wartości lub według indeksu. Wysyła nowy wiersz dla każdej wartości.źródło
Python 2,
432 422 416403 bajtówJestem pewien, że można to poprawić. Przynajmniej jeśli uda mi się na stałe zakodować wartość, nad którą pracuję, i nie potrzebuję żadnej funkcji, mogę zapisać 20. Potrzebuje miejsca do oddzielenia słów podczas wprowadzania tekstu. Zaoszczędzono 6 bajtów dzięki komentarzowi JonathanAllan do odpowiedzi ElPedro, 4 za przestawienie matematyki.
(Uwaga: rzeczywista wersja tego używa tabulacji do wcięcia zamiast spacji. QPaysTaxes dodała jedną spację, ponieważ nie wyświetlała się poprawnie, aby zapewnić, że dany kod się skompiluje. Nie powinna zmieniać liczby bajtów.)
źródło
len(`f`)>2
może być...`f`[2:]
na kolejne 3, wierzę. (zignoruj...
brak możliwości poprawnego działania backticksa)f>50
wersję 6. (i inną, nieużywającd
)TypeError: 'int' object has no attribute '__getitem__'
. Jeśli przekazuję dane liczbowe jako ciąg,f[2:]
zbliża się, ale nadal nie działa, gdy traktuję jako wartość logiczną (print f[2:] and True
drukuje pustą linię, jeśli len (f) <2, nieTrue
lubFalse
)f>50
działa, dziękuję. Upuszczanied
nie jest tak proste, ponieważ zawsze umieszczam wartość końcową pętli wf
wierszu 8, aby nie można było zmienić wiersza 8,if f>50
ponieważ nigdy nie będzie to prawdą.C ++ 11,
484480477 bajtówWprowadzanie tekstu małymi literami bez myślników.
źródło
PowerShell , 362 bajty
Wypróbuj online! wprowadzanie słów lub wprowadzanie liczb
To dobry bałagan i nie jestem z tego powodu bardzo zadowolony, ale oto jest. Sugestie dotyczące gry w golfa mile widziane.
Pierwszy wiersz
$z
jest tablicą pełnych angielskich słów. Możesz zobaczyć-split0
numery for1
do12
i pętla do skonstruowania wszystkieteen
s, a następnie istnieje grono logiki umieścić wszystko razem dobrze. Wypróbuj online!Druga linia zaczyna się od logiki. Bierzemy dane wejściowe
$args
(jako ciąg znaków), umieszczamy-split
je na białej spacji, przechowujemy w$n
celu późniejszego użycia, bierzemy pierwsze[0]
słowo i pierwszy[0]
znak tego i sprawdzamy, czy jest-in
to zakres48..57
(tj. ASCII0
do9
). Sprawdzamy więc, czy mamy dane dziesiętne, czy angielskie. Wypróbuj online!W pierwszym przypadku budujemy zakres na podstawie danych dziesiętnych
$n[0]..$n[2]
i używamy go do indeksowania$z[...]
. W drugim przypadku znajdujemy.indexOf()
pierwsze słowo i ostatnie słowo i na tej podstawie budujemy tylko zakres liczbowy. W obu przypadkach mamy teraz szereg obiektów w potoku (ciągi lub liczby całkowite), a domniemaneWrite-Output
zakończenie programu daje nam nową linię między elementami.źródło
Swift3, 402 bajtów
Nie golfowany:
Nie ma tu nic specjalnego, wystarczy użyć tablicy do utworzenia zapisanych liczb.
Początkowo myślałem, że to rozwiązanie przy użyciu innego sposobu obliczania
values
tablicy:Które można golfować do:
zastępując trzecią linię w kodzie golfowym
Mogłem zdobyć 381 bajtów, ale istnieje błąd kompilatora, który mówi: „wyrażenie było zbyt złożone, aby można je było rozwiązać w rozsądnym czasie”, więcej informacji na temat błędu można znaleźć tutaj
źródło
R,
452430424 bajtówUmieszcza liczby w ramce danych z wypisanymi liczbami jako nazwami kolumn, dzięki czemu tłumaczenie między nimi (i późniejszym drukowaniem) jest bardzo łatwe.
Główną próbą gry w golfa było stworzenie spisanych liczb dla 20-49, prawdopodobnie o wiele więcej tutaj.
as.matrix
Podjąłem próbę wydrukowania data.frame z samych liczb, ale nadal mam nagłówek matrycy. Mam nadzieję, że to w porządku.Nie golfowany:
źródło
o=c("","one","two","three","four","five","six","seven","eight","nine") ; v=c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"); w=c("twenty","thirty","forty"); a=data.frame(0:50, c(o,v, sapply(w[1:3],function(y) sapply(o,function(x) paste0(y,x))),"fifty")); b=which(a==i); a[if(b<52) 2:b else 2:(b-51),ifelse(b<52,2,1)]
DO,
342331 bajtówWypróbuj online!
źródło
SAS, 179
Dane wyjściowe są zapisywane w dzienniku oddzielone znakami nowej linii. SAS ma wbudowany format do konwersji cyfr na słowa, co jest główną zaletą tego wyzwania, ale irytująco brakuje mu informacji, aby zrobić odwrotnie.
źródło