Duolingo, aplikacja do nauki języków, ma wiele rzeczy do zrobienia, ale jest jeden poważny problem, który doprowadza mnie do szału. Mówi mi, ile dni z rzędu korzystałem z aplikacji z komunikatem „ Jesteś w 7-dniowej serii”! Pomijając dzielenie wyrazów i to, czy należy przeliterować liczbę, działa to dobrze w przypadku większości liczb, ale jest bezsprzecznie błędne, gdy mówi, że masz 8-dniową passę! Nie używam go do nauki angielskiego, ale nadal jest to niefortunne zachowanie w przypadku aplikacji językowej.
Pomożesz zespołowi Duolingo, pisząc kompletny program lub funkcję, która określa, czy dana liczba powinna być poprzedzona znakiem a lub an . Liczba jest poprzedzona znakiem „ if” w mówionym języku angielskim, który rozpoczyna się od dźwięku spółgłoskowego lub półpełkowego , a poprzedzona jest znakiem „if”, który rozpoczyna się od dźwięku samogłoski. Zatem jedyne numery poprzedzone to te, których wymowa zaczyna się osiem , jedenaście , osiemnaście , czy osiemdziesięciu .
Prawdopodobnie zespół deweloperów Duolingo zostawił ten błąd, ponieważ zabrakło miejsca na więcej kodu źródłowego w aplikacji, więc musisz go skrócić tak krótko, jak to możliwe, w nadziei, że mogą go wcisnąć.
Twój kod musi przyjmować liczbę całkowitą od 0 do 2 147 483 647 i dane wyjściowe a
lub an
. Końcowy znak nowej linii jest opcjonalny. Dla celów tego wyzwania rok 1863 jest odczytywany jako tysiąc osiemset sześćdziesiąt trzy , a nie osiemset sześćdziesiąt trzy .
Przypadki testowe:
0 → a
8 → an
11 → an
18 → an
84 → an
110 → a
843 → an
1111 → a
1863 → a
8192 → an
11000 → an
18000 → an
110000 → a
180000 → a
1141592 → a
1897932 → a
11234567 → an
18675309 → an
Odpowiedzi:
Pyth, 23 bajty
Wybiera liczbę liter do odcięcia na końcu
"an"
, sprawdzając, czy pierwsza litera nie jest8
cyfrą, i czy pierwsza cyfra liczby rozpatrywana w bazie 1000 nie jest ani 11, ani 18. Wynikowa wartość logiczna to liczba znaków do wycięcia koniec.źródło
Python 2, 60 bajtów
Anonimowa funkcja. Dodaje
n
jeśli:źródło
n
> = '8' '`` oszczędza trzy bajty.GNU Sed, 32
Wynik obejmuje +1 za
-E
opcję sed.Wypróbuj online.
an
a
Dzięki @ MartinBüttner za jego podejście do siatkówki, które pozwoliło zaoszczędzić 10 bajtów.
źródło
Shell + bsd-games, 30
Wejście odczytane ze STDIN.
number
konwertuje ciąg dziesiętny na słowa. Łatwo jest zatem zdecydować, czy wynik zaczyna się od tego, czy niee
.źródło
Siatkówka , 27 bajtów
Nie różni się to bardzo od odpowiedzi Retina od DigitalTrauma, ale nalegali, żebym to opublikował.
Wypróbuj online.
Pierwszy regex zastępuje wszystkie odpowiednie liczby
an
, a drugi zastępuje wszystkie pozostałe liczbya
. Działa to dla tych samych bajtów:źródło
C ++, 101
To jest moje wyzwanie, więc nie jest to konkurencyjna odpowiedź. Chciałem tylko zobaczyć, jak krótko mogę to zrobić w C ++. Operacje na łańcuchach są zbyt szczegółowe, więc odbywa się to za pomocą matematyki. Wydaje mi się, że musi istnieć sposób na zmniejszenie tego stanu, ale nie jestem w stanie tego rozgryźć.
źródło
Mathematica, 53 bajty
Rozwiązanie wykorzystujące przetwarzanie ciągów byłoby w rzeczywistości dłuższe.
źródło
PostScript,
119113 znakówZ kodem testowym:
źródło
JavaScript (ES6)
70614638 bajtówSpołeczność wiki, ponieważ obecne rozwiązanie jest tak różne od mojego oryginalnego. Dziękuję wszystkim!
Demo: http://www.es6fiddle.net/iio40yep/
źródło
eval
sztuczki! Wiedziałem, że musi być też lepszy wyraz regularny, ale nie mogłem znaleźć niczego, co byłoby krótsze. Dziękuję Ci!n=>/^8|^(?=1[18])..(\d{3})*$/.test(n)?'an':'a'
( es6fiddle.net/iiehl1ex ). Ma długość 46 bajtów.8
, czy zaczyna się od1[18]
i czy długość liczb jest2 * (3n)
. Zasadniczo jest to cały kod, ale w wyrażeniu regularnym.Poważnie,
4340 bajtówStrategia polega na tym, aby spojrzeć tylko na 1, 2 lub 3 najbardziej znaczące cyfry, dzieląc liczbę całkowitą przez największą wartość,
10^(3n)
która jest mniejsza niż wartość wejściowa.Wypróbuj online
Wyjaśnienie:
źródło
Retina , 34
Bezpośrednie tłumaczenie mojej odpowiedzi :
Wypróbuj online.
Jeden bajt zapisany dzięki @Timwi.
źródło
Perl 6 ,
3130 bajtów(Perl 6 używa
[ ]
w wyrażeniach regularnych do przechwytywania( )
i używa<[ ]>
do zestawów znaków)Stosowanie:
źródło
PostScript, 109 bajtów
Kod weryfikuje, czy numer zaczyna się od pewnych prefiksów. Prefiks
8
jest zawsze sprawdzany ( osiem , osiemdziesiąt coś , osiemset setek i ), ale11
i18
( jedenaście i osiemnaście ) są sprawdzane tylko wtedy, gdy liczba cyfr jest wielokrotnością 3 plus 2.Zaczynamy od wstępnego wyniku,
a
a gdy zostanie znaleziony prefiks, wynik zostanie zastąpiony przezan
.anchorsearch
służy do unikania wydobywania przedrostka z łańcucha. Nawet jeśli znaleziono dopasowanie, kontynuujemy weryfikację pozostałych prefiksów - po co marnować 5 bajtówexit
? -, ale ponieważ oryginalny ciąg zostanie zastąpiony przez, za
pewnością nie otrzymamy żadnych fałszywych trafień.Aby zwrócić wynik
a
-lub-an
na stosie operandów zamiast go drukować, usuń końcowy=
(wynikowa długość: 107 bajtów).Kod testowy:
źródło
PostScript (z tokenami binarnymi), 63 bajty
Są
’
to bajty o wartości 146 (dziesiętne),¥
165 i$
3. Wszystkie pozostałe są drukowalnymi 7-bitowymi znakami ASCII.Jest to to samo, co moja wersja PostScript [czysta ASCII], ale używa tokenów binarnych, co pomaga zmniejszyć całkowitą długość. Wysyłam go osobno z 3 powodów:
źródło
Python 3,
11093917674706564 bajtówOto długi, ale prosty.
Edycja: poprawione dzięki isaacg . Zapisano trochę białych znaków po porównaniach. Wiele bajtów zapisywane dzięki Timwi , Mego , benpop i Alissa .
lub dla tej samej liczby bajtów.
Nie golfowany:
źródło
843
„osiemset czterdzieści trzy”, które powinno byćan
.(-~len(n)%3)<1
zamiastlen(n)%3==2
?(n[:2]=="11"or n[:2]=="18")
to skrócić"118".contains(n[:2])
?n[:2]in"118"
?Java 10, 102 bajty
Wypróbuj online.
Wyjaśnienie:
źródło
Japt ,
2827 bajtówWypróbuj online!
Rozpakowane i jak to działa
źródło
1e3
zA³
GNU
sed -r
+ BSDnumber
, 34 bajtyNajpierw przekonwertujemy na numer angielski. Następnie usunąć wszystko z wyjątkiem ewentualnego początkowego
e
, a prefiks zea
. Następnie przekonwertuje
(jeśli jest obecny) nan
. Jedyną sztuczką w golfa jest dopasowanie opcjonalnegoe
w pierwszej zmianie, dzięki czemu możemy ponownie użyć wzorca w następnej linii.Próbny
źródło
TeaScript , 35 bajtów
Wypróbuj tutaj.
Wyjaśnienie
źródło
Python 2.7, 66
Oczywiście nie tak krótki jak ten
lambda
.źródło
05AB1E , 26 bajtów
Prawdopodobnie można grać w golfa jeszcze trochę, ale działa.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
QuadS , 32 bajty
Wypróbuj online!
źródło
Stax , 25 bajtów
Uruchom i debuguj
Rozpakowane, niepolowane i skomentowane, wygląda to tak.
Uruchom ten
źródło
Biała spacja , 243 bajty
Litery
S
(spacja),T
(tab) iN
(nowa linia) dodane tylko jako wyróżnienia.[..._some_action]
dodano tylko jako wyjaśnienie.Wypróbuj online (tylko z surowymi spacjami, tabulatorami i nowymi wierszami).
Program zatrzymuje się z błędem: nie znaleziono wyjścia.
Objaśnienie w pseudo-kodzie:
źródło
C ++,
8079 bajtówOkazało się, że 4 bajty są krótsze, aby jawnie przetestować pod kątem 8xx i 8x niż mieć inną
/=10
pętlę, taką jak ta:Próbny
źródło
i/=1000
byći/=1e3
i może&&
stać się wszystkim&
?&&
może być wszystko&
, ponieważ odejmowanie daje liczby całkowite, a nie boolean - np. Wynosi19-11
8, a19-18
wynosi 1; widzę, że8 && 1
to prawda, ale8 & 1
fałsz. Możemy użyć&
, ale że musimy zmienić-
się!=
, a także dodać nawiasów.&
naprawdę nie działa tutaj, mój zły. Przy okazji, dlaczego nie dodasz również linku TIO do swojej odpowiedzi?Perl 5
-p
, 26 bajtówWypróbuj online!
źródło
Perl,
715549 bajtówWiedziałem, że trójskładnik pomoże kiedyś ...
Pozwól mi to zepsuć.
$_=<>
akceptuje liczbę jako dane wejściowe.$_=...
blok ustawi wartość$_
po użyciu....?...:...
jest operatorem trójskładnikowym. Jeśli warunek (pierwszy argument) jest prawdziwy, zwraca drugi argument. W przeciwnym razie zwraca trzeci./^8/||(/^1[18]/&&length%3==2)
sprawdza, czy liczba zaczyna się od 8 lub od 11 lub 18 (1[18]
akceptuje albo) i ma mod długości 3 2.$_
jest ustawione naan
. W przeciwnym razie jest ustawiony naa
.$_
(alboa
alboan
) przy pomocysay
.Zmiany
źródło
$_=<>;$_=(/^8/)||/^1[18]/&&length($_)%3==1?'an':'a';say
oszczędza kilka bajtów. (Chociaż liczba do porównania zależy od tego, jaki jest twój znak nowej linii, ale to nie zmienia liczby bajtów.)length($_)
nalength
(lub przynajmniej upuścić pareny), ale z jakiegoś powodu to nie działa.($_)
dostać$_=<>;$_=/^8/||/^1[18]/&&length%3==1?'an':'a';say
, który ma tylko 49 bajtów.-p
zamiast$_=<>
isay
,y///c
zamiastlength
, i upuszczając w cudzysłowiea
ian
:perl -pe'$_=/^8/||/^1[18]/&&y///c%3==2?an:a'
(34 bajtów + 1 o-p
). Należy pamiętać, że wejście nie może kończyć się znakiem nowej linii:echo -n 11 | perl -pe'...'
. To także naprawia błąd:length%3==2
jest analizowany jakolength(%3)==2
, a nie jakolength($_)%3==2
, więc zawsze zwraca false.Pyth,
2931Odwraca ciąg, dzieli go na trzyosobowe sekcje, odwraca go ponownie, a następnie wybiera odpowiednie zakończenie.
źródło
111
- dajean