Cel
Napisz program lub funkcję, która tłumaczy numeryczny numer telefonu na tekst, który ułatwia powiedzenie. Kiedy cyfry są powtarzane, należy je czytać jako „podwójne n” lub „potrójne n”.
Wymagania
Wkład
Ciąg cyfr.
- Załóżmy, że wszystkie znaki są cyframi od 0 do 9.
- Załóżmy, że ciąg zawiera co najmniej jeden znak.
Wydajność
Słowa, oddzielone spacjami, o tym, jak cyfry te można odczytać na głos.
Przetłumacz cyfry na słowa:
0 „o” „
1” jeden „
2” dwa „
3” trzy „
4” cztery „
5” pięć „
6” sześć „
7” siedem „
8” osiem „
9” dziewięć ”Gdy ta sama cyfra zostanie powtórzona dwa razy z rzędu, napisz „podwójna liczba ”.
- Kiedy ta sama cyfra zostanie powtórzona trzy razy z rzędu, napisz „ liczba potrójna ”.
- Gdy ta sama cyfra zostanie powtórzona cztery lub więcej razy, napisz „podwójną liczbę ” dla pierwszych dwóch cyfr i oceń resztę ciągu.
- Między każdym słowem jest dokładnie jedna spacja. Dopuszczalna jest pojedyncza przestrzeń wiodąca lub końcowa.
- W danych wyjściowych nie jest rozróżniana wielkość liter.
Punktacja
Kod źródłowy z najmniejszą liczbą bajtów.
Przypadki testowe
input output
-------------------
0123 oh one two three
4554554 four double five four double five four
000 triple oh
00000 double oh triple oh
66667888 double six double six seven triple eight
19999999179 one double nine double nine triple nine one seven nine
code-golf
kolmogorov-complexity
Hand-E-Food
źródło
źródło
Odpowiedzi:
05AB1E ,
5352515049 bajtówWypróbuj online!
Wyjaśnienie:
źródło
M
również przegląda listy podczas określania maksymalnej liczby całkowitej na stosie? Nie wiedziałem tego. Brzmi jak coś do zapamiętania. :)8088 Montaż, IBM PC DOS,
164159156155 bajtówDwójkowy:
Zbuduj i przetestuj plik wykonywalny
xxd -r
z góry lub pobierz PHONE.COM .Niezmontowany wykaz:
TL; DR:
Łańcuch wejściowy jest odczytywany od prawej do lewej, aby ułatwić znalezienie potrójnego. Dane wyjściowe są wypychane na stos x86, aby uprościć odwracanie kolejności wyświetlania, a także ułatwić uporządkowanie słów „podwójnych” i „potrójnych” przed nazwą cyfry.
Jeśli następna cyfra jest inna niż ostatnia, nazwa jest sprawdzana na liście słów i przekazywana na stos. Ponieważ nie ma formalnej koncepcji „indeksowanej tablicy ciągów o zmiennej długości” w kodzie maszynowym, lista słów jest skanowana
i
(indeks słowa) kilka razy, aby separator łańcucha ($
) znalazł odpowiednie słowo. Pomocne jest to, że x86 ma parę krótkich instrukcji (REPNZ SCASB
podobnych domemchr()
C), co upraszcza to (dzięki CISC !).Jeśli cyfra jest taka sama jak poprzednia, licznik długości „przebiegu” jest zwiększany i kontynuuje zapętlanie w lewo na wejściu. Po zakończeniu wybierania nazwa cyfry jest pobierana ze stosu, ponieważ będzie trzeba ją wstawić po „podwójnej” lub „potrójnej” dla każdej grupy. Jeśli długość cyklu jest nieparzysta (a długość cyklu wynosi
> 1
), nazwa cyfry, po której następuje ciąg „potrójny”, jest wypychana na stos, a długość przebiegu jest zmniejszana o 3. Ponieważ długość przebiegu będzie teraz parzysta, krok powtarza się dla „podwójnego”, aż długość przebiegu wyniesie 0.Gdy łańcuch wejściowy osiągnie koniec, stos jest wyrzucany z każdym zapisanym łańcuchem zapisywanym na ekranie w odwrotnej kolejności.
I / O:
Samodzielny plik wykonywalny DOS dla komputera PC, wprowadzany z wyjścia wiersza poleceń do konsoli.
Pobierz i przetestuj PHONE.COM .
źródło
repne scasb
jestmemchr
(lubstrchr
jeśli wiesz, że będzie hit), niestrstr
.mov cl, byte[si]
to jest równoważnemovzx cx, byte [si]
. Zastanawiam się, czy użycie innego regu, na przykładAH
, do liczeniadec ah / jnz
zamiast zamiastloop
zaoszczędziłoby czegokolwiek przed niepotrzebnym push / popem CX. Prawdopodobnie nie i nie masz żadnych 16-bitowych regów, które pozwoliłyby na 1 bajtdec
.CH=0
I go przez fysnet.net/yourhelp.htm , który dla każdego rozsądnego wydania DOS jest zawsze zerowany, to samo zBX
. Dobra myśl o zerowym rozszerzeniumov
, choć technicznie nie sądzę, żemovzx
jest dostępna na 808x (utrzymanie platformy docelowej na IBM PC 5150 i wszystkich innych). Bawiłem się wszystkimi rejestrami najlepiej, jak mogłem, aby zapisać bajty, ale jeśli zobaczysz coś, co prawdopodobnie przegapiłem, daj mi znać!memchr
IMO. Nazewnictwo „instrukcji ciągu” wprowadza w błąd ludzi, którzy myślą, że pracują na ciągach C o niejawnej długości, ale tak naprawdę działają na ciągach takich jakstd::string
bufor lub. Jakmemcpy
,memset
(movs / stos),memchr
/memrchr
(repne scas z DF = 0 lub 1) imemcmp
(powtórz cmps). Jedynym odpowiednikiem Crepe scas
jeststrspn
to, że nie sądzę, aby istniała dla tegomem
funkcja. Można nawet opisaćstosw
albostosd
jakowmemset
np.movzx
kosztuje dodatkowy bajt opcodu, i tak, został wprowadzony tylko z 386. Po prostu łatwiej było napisać, że opisujesz fakt, że wykonujesz scalanie małobajtowe i zakładając, że jest poprawnie rozszerzony o zero. Jeśli znasz CX lub przynajmniej CH = 0, to tak dla golfa zawsze idźmov
do CL. Ale poza golfem, instrukcje ładowania bajtów x86 tomovzx
imovsx
: unikają fałszywych zależności lub innych shenaniganów z częściowym rejestrem. W nowoczesnych procesorach z dwordowym miejscem docelowym są one tak szybkie, jakmov
obciążenia dworda .05AB1E ,
6156535251 bajtów-9 bajtów dzięki @Grimy .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Zobacz moją wskazówkę 05AB1E (sekcja Jak korzystać ze słownika? ), Aby zrozumieć, dlaczego
… ‹¶½¿
jest" double triple"
i“Šç€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“
jest"oh two three four five six seven eight nine"
.źródło
if(length>=4)
przed dodaniem reszty, ale oczywiście nie jest to konieczne dla liczb całkowitych wielkości1,2,3
, ponieważ;Å2¨3ª£
pozostawi ciągi nietknięte (tylko owinięte w listę, którą spłaszczamy po mapie). Dzięki za zauważenie! I czekam na Twoją odpowiedźÅγ
. Rzeczywiście miałem wrażenie, że pierwsza część może być wykonana w jakiś sposób znacznie krócej.Dg;LàäR
jest wciąż bajt krótszy niżāɨšJõK
i znacznie bardziej podobny do tego, co pierwotnie miałeś.á
zamiastõK
na końcu. :)á
! Oto 51 i jeszcze jeden . 50 wydaje się możliwe.QuadR , 137 bajtów SBCS
Walizka na tytuł z wiodącym odstępem.
Wypróbuj online!
∊
ε nlist (Spłaszczenie)¯2↑¨
podejmuje ostatnie dwa znaki (wyściółki na lewej przestrzeni) każdego z bohaterów@
w miejscach, gdzie(∊∘⎕A)
znaki są członkami wielkiej A lphabet⍵
w wyniku operacji poniżej PCRE próżniowej ...(.)
dowolna postać\1
po którym następuje*
zero lub więcej razy, jest zastępowany wynikiem następującego…{…}⍵M
„dfn”;⍵
to M powyższego wzoru('OhOneTwoThreeFourFiveSixSevenEightNine'(
…)⎕A)
Zastosuj następującą anonimową funkcję ukrytą z długim łańcuchem i alfabetem A jako lewymi argumentami:∊
członkostwo (liter w długim łańcuchu wielkimi literami)⊂
partycje (z nową partycją rozpoczynającą się za każdym razem, gdy jest członkiem⊣
lewy argument (tj. długi ciąg)(
…)⎕R
PCRE R. EUmieãæ następujące wzory z tymi słowami:⎕D
cyfry od 0 do 9,¨
traktuj każdy jako osobny wzór⍺←
przypisać tę funkcję zastępczą do⍺
(za pomocą lphabetise)⋄
następnie,⊃⍵
pierwsza postać meczu,
jako ciąg⍺
zastosować się⍺
do tegow←
przypisz to dow
( słowa )' '∊
…:
Jeśli spacja jest jego członkiem (tzn. Jeśli dopasowanie było puste):⍬
nic nie zwraca (staje się pustym ciągiem)⋄
jeszcze,1=≢⍵:
jeśli jeden równa się liczbie znaków w dopasowaniu (tj. jego długości):⍺⍵
alfabetycznie tę cyfrę⋄
jeszcze,3=≢⍵:
jeśli trzy równa się liczbie znaków w dopasowaniu (tj. jego długości):'Triple',w
prepend „Triple” dla wag ord⋄
jeszcze,2↓⍵
upuść na cyfry z meczu∇
powrócić do tegow,
dodaj słowo'Double',
przedrostek „Double”źródło
JavaScript (ES6),
161 160 152144 bajtówDane wyjściowe zawierają jedną wiodącą przestrzeń.
Wypróbuj online!
lub Zobacz sformatowany kod źródłowy
W jaki sposób?
Konwersja jest przetwarzana w trzech krokach:
"X X"
z"double X"
"double X X"
z"triple X"
Aby zapisać bajty, używamy tego samego wyrażenia regularnego dla wszystkich kroków:
który działa w następujący sposób:
W kroku 1 używamy funkcji zwrotnej, która wybiera właściwe słowo z tabeli odnośników:
"799999"
→" seven nine nine nine nine nine"
W kroku 2 zastępujemy
"$1 double$2"
:" (seven)( nine)( nine)"
→" seven double nine"
"( nine)( nine) nine"
→" double nine nine"
W kroku 3 zastępujemy
"triple$2"
:" (double)( nine)( nine)"
→" triple nine"
źródło
Wolfram Language (Mathematica) , 115 bajtów
Wypróbuj online!
Pobiera na wejściu listę cyfr. Dane wyjściowe obejmują wiodącą przestrzeń.
źródło
Stax , 56 bajtów
Uruchom i debuguj
źródło
Python 2 ,
171169168 bajtówWypróbuj online!
-1 bajt, dzięki Jitse
źródło
1312
;)['','double ','triple '][n]
do' eellpbiurotd'[-n:0:-2]
168 bajtów: Spróbuj online!Perl 5
-p
, 111 bajtówWypróbuj online!
Wyjaśnienie:
źródło
Scala , 213 bajtów
Rozumiem. W jakiś sposób wersja rekurencyjna, którą próbowałem zbudować, była znacznie bardziej szczegółowa niż ta (choć wciąż jest rekurencyjna, ale tylko w jednym przypadku). Funkcja
f
przyjmuje jako ciąg wejściowy numer telefonu i przekazuje fonetykę za pomocą spacji końcowej.Wypróbuj online!
Edytować : -8b dzięki DrY Wit!
Scala , 215 bajtów
I oto nadchodzi wiodąca wersja białych znaków, z jakiegoś powodu o dwa bajty dłuższa (nawet przy masowym refaktoryzacji).
Wypróbuj online!
źródło
(o(0)+"").toInt
jeo(0)-48
.PHP ,
174169166159 bajtówWypróbuj online!
Dla każdej cyfry o indeksie
$i
rozpoczynającym się od 0:$i
jest równa 3, drukowane'triple '
i dodaje 2, aby w$i
następnej iteracji przeskoczyły 2 cyfry.$i
jest równa lub większa niż 2, ale nie jest równa 3, drukuje'double '
i dodaje 1 do$i
następna iteracja spowodowała przeskok 1 cyfry.$i++
.źródło
Retina 0.8.2 , 105 bajtów
Wypróbuj online! Generuje wiodącą przestrzeń. Objaśnienie: Początkowo próbowałem wyrażenia regularnego, które automatycznie dopasowuje 2 lub 3 cyfry, ale podejście @ Arnaulda okazało się bardziej golfistyczne. Wyjaśnienie:
Dopasuj pary identycznych cyfr i zastąp pierwszą cyfrą
=
. Następnie powtórz, aby dla liczby nieparzystej druga ostatnia cyfra została również zastąpiona przez=
.Umieść cyfry (i
=
) na zewnątrz.Obsługuj przypadek trzech identycznych cyfr.
Zamień wszystkie pozostałe znaki na słowa.
źródło
Galaretka , 59 bajtów
Wypróbuj online!
Łącze monadyczne, które przyjmuje jako argument ciąg znaków cyfrowych i zwraca ciąg galaretki słów oddzielonych spacją. Wywoływany jako pełny program, daje wynik niejawnie.
źródło
T-SQL 2017, 238 bajtów
Dodano kilka podziałów wiersza, aby było czytelne
Wypróbuj online
źródło
C ++, 382 bajty
To nie jest super-mądry, ale ktoś musiał napisać wersję C ++. Funkcja rekurencyjna R przechodzi przez ciąg wejściowy i zlicza powtarzane wartości. Jeśli są więcej niż 3 powtórzenia, to udaje, że były 2 powtórzenia, następnie przewija do tyłu i próbuje ponownie.
Kilka innych znaków źródłowych prawdopodobnie można by wycisnąć z
#define
major, ale jestem pewien, że lepszy algo mógłby wycisnąć więcej.i weryfikacja przypadków testowych:
źródło
#include <sstream>
? Czy mógłbyś to przesunąć w dół po części golfowej dla funkcji testowej? Myślę, że pisaniestd::ostream&s
zajęłoby mniej miejsca niżusing namespace std;
, chyba że są inne miejsca, w których potrzebujeszstd::
.Perl 6 ,
9693 bajtówWypróbuj online!
Jest to anonimowy blok kodu, który pobiera liczbę i zwraca ciąg z cyframi pisanymi wielkimi literami, np
0123 => oh ONE TWO THREE
Z pojedynczym końcowym odstępem.Zostało to na chwilę usunięte, dopóki nie dowiedziałem się, jak używać przechwytywania w widoku z wyprzedzeniem, ale teraz powinno to zostać naprawione.
źródło
Czerwony , 242 bajty
Wypróbuj online!
źródło
Scala , 253 bajty
Wypróbuj online!
źródło
Oracle SQL, 578 bajtów (w sformatowanej formie)
Rozwiązanie nie jest w żaden sposób zwięzłe, więc opublikuj je w sformatowany sposób.
Testuj w SQL * Plus
Główną sztuczką jest to, że cyfry zamieniane są na słowa przy użyciu modeli w formacie Oracle zamiast na stałe literałów „jeden”… „dziewięć”.
źródło
union all
zselect regexp_replace(s,case when length(regexp_substr(s, '(.)(\1)+')) = 3 then '^...' else '^(.)\1|^.' end) from r
.JavaScript, 142 bajty
Wypróbuj online!
źródło
(Roblox) Lua 5.1 , 166 bajtów
Upewnij się, że
s
jest to wstępnie zdefiniowana wartość ciągu wypełniona tylko cyframi; będzie to zmienna do modyfikacji. Rezultatem będzie wiodąca postać spacji[\u20]
.źródło
s
posiadania danych wejściowych jest niezgodny z regułami . Poza tym masz dobry pierwszy post! Polecam zamieścić link do strony testowej online, np. Tio.run/#lua , aby inni mogli przetestować Twoje rozwiązanie