Chciałbym wziąć numer i wiedzieć, ile sylab jest w nim, gdy mówi się po angielsku.
Ograniczmy to do dodatnich liczb całkowitych, które są mniejsze niż tysiąc.
Jestem Brytyjczykiem, więc podążymy za kolumną setek z „i”, gdy będą po niej jakieś niezerowe cyfry.
Wyzwanie
- Napisz kod, który przyjmie dodatnią liczbę całkowitą niższą niż 1000 i wyświetli liczbę sylab w słowach reprezentujących tę liczbę w brytyjskim angielskim.
- NIE musi generować słów reprezentujących liczby, a jedynie liczbę zawartych w nich sylab.
- To jest golf golfowy, spróbuj to osiągnąć w jak najmniejszej liczbie bajtów.
- Użyj dowolnego języka, który ci się podoba.
- Standardowe luki są zabronione.
Przypadki testowe
| N | In words | Syllables |
| 1 | one | 1 |
| 2 | two | 1 |
| 3 | three | 1 |
| 4 | four | 1 |
| 5 | five | 1 |
| 6 | six | 1 |
| 7 | sev-en | 2 |
| 8 | eight | 1 |
| 9 | nine | 1 |
| 10 | ten | 1 |
| 11 | el-ev-en | 3 |
| 12 | twelve | 1 |
| 13 | thir-teen | 2 |
| 14 | four-teen | 2 |
| 17 | se-ven-teen | 3 |
| 20 | twen-ty | 2 |
| 21 | twen-ty one | 3 |
| 42 | four-ty two | 3 |
| 73 | sev-en-ty three | 4 |
| 77 | sev-en-ty sev-en | 5 |
| 100 | one hund-red | 3 |
| 110 | one hund-red and ten | 5 |
| 111 | one hund-red and el-ev-en | 7 |
| 555 | five hund-red and fif-ty five | 7 |
| 700 | sev-en hund-red | 4 |
| 770 | sev-en hund-red and sev-en-ty | 8 |
| 777 | sev-en hund-red and sev-en-ty sev-en | 10 |
| 999 | nine hund-red and nine-ty nine | 7 |
code-golf
natural-language
AJFaraday
źródło
źródło
Odpowiedzi:
Python 2 ,
84837467 bajtówDzięki @xnor za grę w golfa przy
916 bajtach!Wypróbuj online!
Python 2 , 79 bajtów
Prosto, ale dłużej.
Wypróbuj online!
źródło
-10
się~9
i przełączania wokół ostatni kawałek do+(0<n%100!=12)-(n%100!=11)
, ale to jeszcze dłużej niż nowego rozwiązania.lambda n:4*(n>99)+`n`.count('7')+cmp(n/10%10,1)-n%~9/9-min(n%100,13)%12/~9
min(n%100,13)%12/~9
może faktycznie pomóc w podejściu, którego próbowałem również dla mojej odpowiedzi Jelly.Perl 5
-p
, 53 bajtówWypróbuj online!
W jaki sposób
źródło
JavaScript (ES6), 89 bajtów
Wypróbuj online!
źródło
Python 2 ,
112108 bajtówWypróbuj online!
-4 bajty, dzięki Shaggy
źródło
[2]*7
część zawiedzie17
, ponieważ powinno to być 3 zamiast 2 (sev-en-teen
).JavaScript,
8684 bajtówUlepszony port rozwiązania Python firmy TFeld .
Wypróbuj online
2 bajty zapisane dzięki Arnauldowi
źródło
Wolfram Language
101115 BytesWyjaśnienie
(podstawienie
StringSplit
ws
)IntegerName
renderuje liczbę w amerykańskim angielskim (tj. bez „i” w liczbach większych niż 100)777-> "seven hundred seventy-seven
. Np .StringSplit[IntegerName@#,"-"]
usuwa wszelkie myślniki w renderowaniu.StringSplit/@
dzieli rendering na słowa.Join@@
pozostawia prostą listę słów, bez listy osadzonej (w przypadku pojawienia się łącznika).WordData[#,"Hyphenation"]
dzieli jedno słowo na sylaby.Join@@
pozostawia prostą listę sylab we wszystkich słowach.Length
liczy sylaby+Boole[#>100&&#~Mod~100!=0]
dodaje1
do liczby sylab dla liczb większych niż 100 (ze względu na dodatkowe „i” stosowane w renderowaniu brytyjsko-angielskim), z wyłączeniem całkowitych wielokrotności 100.źródło
Java 11,
105102 bajtówZawiera mnóstwo znaków niedrukowalnych.
-3 bajki dzięki @ OlivierGrégoire .
Wypróbuj online.
Wyjaśnienie:
źródło
.split("7",-1)
się.split("7",9)
, a-6+(n>99?4:0)
do-(n>99?2:6)
.-(n>99?2:6)
, ale teraz jest to tak oczywiste, że zwróciłeś na to uwagę. I-1
aby9
z powodu ograniczonej wielkości wejściowej bym nie pomyślał o tak dzięki!05AB1E ,
3431 bajtówWypróbuj online lub sprawdź wszystkie
[1,999]
przypadki testowe .Wyjaśnienie:
Przy wszystkich wspomnianych czekach będzie to 1 dla prawdy i 0 dla falsey.
źródło
I
(wejście) zamiastX
(wejście mod 100) podczas sprawdzania, czy jest większy niż 20 dla +1 zty
.>
(sprawdź, czy wartość wejściowa jest większa niż 100) została zastąpiona przez@
(sprawdź, czy wartość wejściowa jest większa lub równa 100). Może sam powinienem był sprawdzić kilka innych przypadków testowych przed wysłaniem .. Przepraszam za to ..Węgiel drzewny ,
3931 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Oblicz korekty liczby sylab i wyślij wynik jako ciąg.
Zacznij od zmiany każdej niezerowej cyfry na 1, a następnie dekodowania jako podstawy 2. Daje to prawidłową odpowiedź dla większości danych wejściowych.
Dodaj 1 dla każdego
7
.Weź literał ciąg
10000000001021111111
i dodaj 80 zer, a następnie cyklicznie indeksuj dane wejściowe i odejmuj tę cyfrę.źródło
Galaretka ,
282523 bajtówWypróbuj online!
Jak to działa
źródło
PHP ,
190158145141137 bajtówWypróbuj online!
Port rozwiązania Kevina Cruijssena (niestety nie ma takiej samej zwięzłości w PHP :))
-
3245 dzięki Shaggy!-3 dzięki Kevin Crujissen!
źródło
>99
i>19
zamiast>=100
i>=20
.05AB1E , 24 bajty
Galaretka Port Port Dennisa
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
05AB1E , 26 bajtów
Port odpowiedzi na węgiel drzewny @Neil , więc upewnij się, że go również głosujesz, jeśli podoba ci się ta odpowiedź!
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
•Ž¢Γ}Þ±6u•
Alternatywnie może być skompresowana liczba całkowita•8JA•b2TÌǝ
dla tej samej liczby bajtów.Wyjaśnienie:
Zobacz moją odpowiedź 05AB1E (sekcja Jak skompresować duże liczby całkowite? ), Aby zrozumieć, dlaczego tak
•Ž¢Γ}Þ±6u•
jest10000000001021111111
.źródło