Inspirowany Google Code Challenge :
Alfabet łaciński zawiera 26 znaków, a telefony mają tylko dziesięć cyfr na klawiaturze. Chcemy ułatwić pisanie wiadomości do znajomego za pomocą sekwencji naciśnięć klawiszy w celu wskazania pożądanych znaków. Litery są odwzorowane na cyfry, jak pokazano poniżej. Na przykład, aby wstawić znak B, program nacisnąłby 22. Aby wstawić dwa znaki w sekwencji z tego samego klawisza, użytkownik musi przerwać przed ponownym naciśnięciem klawisza. Znak spacji „” powinien zostać wydrukowany, aby wskazać pauzę. Na przykład 2 2 oznacza AA, a 22 oznacza B.
Każda wiadomość będzie się składać tylko z małych liter az i spacji ''. Naciśnięcie zera powoduje emisję spacji.
Wyzwanie polega na napisaniu najmniejszej funkcji, która pobiera ciąg wejściowy i zwraca sekwencję naciśnięć klawiszy niezbędnych do wygenerowania wejścia jako ciągu lub wysłania go na standardowe wyjście. Funkcja, która jest najmniejszą liczbą bajtów, wygrywa.
Przykład wejścia / wyjścia
phone("hi")
44 444
phone("hello world")
4433555 555666096667775553
Inne wyjaśnienia
- Przerwy należy dodawać tylko w razie potrzeby i muszą być spacją ''.
- Każda wiadomość będzie się składać tylko z małych liter az i spacji ''. Drukuj,
0
aby zaznaczyć spacje. - Brak bibliotek zewnętrznych.
- Do funkcji można przekazać tylko ciąg wejściowy.
- Aby inne języki były konkurencyjne, deklaracja funkcji podstawowej nie ma znaczenia, podobnie jak import innych standardowych bibliotek.
#include
s,import
s iusing
s nie liczą się. Wszystko inne robi. Obejmuje to#define
funkcje pomocnicze i pomocnicze. Jeśli jesteś zdezorientowany, zobacz zasadę 2 w tym pytaniu. - Wiele spacji można oznaczyć jako
00
lub,0 0
ponieważ tak naprawdę nie trzeba przerywać między spacjami
{}
są częścią podpisu funkcji? Na przykład, jeśli mój kod tofunction f(){alert('hi');}
, czy powinienem liczyć znakialert('hi');
lub{alert('hi');}
?t9
działa inaczej: musisz kliknąć każdy klawisz raz, aby uzyskać słowo.Odpowiedzi:
Rubin,
129122115111108107105Z golfem ...
Ups, całkowicie zapomniałem usunąć niepotrzebne spacje - naprawiono ...
Zaoszczędziłem 2 znaki dzięki Peterowi Taylorowi.
Wersja online
Wyjaśnienie:
spacja jest tłumaczona na znak za pomocą liczby porządkowej 96
znaki są najpierw mapowane na ciąg liczb: - od a do 2 - od b do 22 - od d do 3222 - od h do 444333222
wyrażenie regularne dopasowuje następnie pierwszą grupę równych cyfr
tablica jest połączona
wszystkie spacje występujące w miejscu „cyfra spacja inny_cyfr” są usuwane
źródło
6666
6 nie powinno nigdy wymagać naciskania 4 razy z rzędu.\2
tego końcowego wyrażenia regularnego? Z pewnością druga grupa to twierdzenie o zerowej szerokości?REBEL -
154110103Ta „funkcja” akceptuje dane wejściowe ze standardowego wejścia i wysyła wyniki do standardowego wejścia.
Testy działają (więc nie musisz instalować interpretera):
źródło
JavaScript (124)
Uruchom w przeglądarce Firefox.
źródło
GolfScript, 46 znaków
Jak zwykle odczytuje dane wejściowe ze standardowego wejścia, drukuje na standardowe wyjście. Zobacz demo online (z wejściem w puszce).
Zauważ, że ten kod opiera się na bardzo ścisłej interpretacji specyfikacji wejściowej (tylko małe litery i spacje): w szczególności wszelkie znaki nowej linii na wejściu spowodują awarię! Ten problem można rozwiązać kosztem dwóch dodatkowych znaków, przygotowując
n-
kod, aby odfiltrować wszelkie znaki nowej linii.źródło
C ++ - 365 znaków bez
int main(){}
Używa tego samego rozumowania, co moja odpowiedź tutaj , tylko używając
for
pętli, aby wypisać każdą literę odpowiednią liczbę razy.źródło
s[i]==32
zamiasts[i]==' '
. Wartość ASCII miejsca wynosi 32.Perl - 107
110Oto moje poprzednie rozwiązanie w 120
128 130 155:Testy:
źródło
VBA
220253/258/219Nie licząc
Function
linii tutaj:Z
String
, 253 :Z
For
pętlą 258 :Dodano poprawki dla klucza 7/9 (dzięki, Danny), które dodały wiele znaków.
Za pomocą
Choose
219 :Nie chciałem uruchamiać tego, ponieważ ma on bardziej podstawową funkcjonalność, ale jest to krótszy kod ...
źródło
yes
powinno być999337777
. Uzyskać10338
za pomocą funkcji.C,
165 163 153 149138 znakówMoja pierwsza próba gry w golfa kodu, wszelkie sugestie są mile widziane.
źródło
C ++ -
170168160Gra w golfa:
Nie golfił
źródło
C: 136 znaków
I nieco nie golfisty (tak, tak to zostało napisane):
Może uda mi się to trochę zmniejszyć, stosując rekursję, czarną magię i spore ilości chili w proszku.
źródło
Java - 243
Dość naiwne rozwiązanie Java. Dzięki komentatorom za sugestie.
Naprawiono błąd, który czasami wstawiał niepotrzebne spacje, np. Dla wpisu „cześć światu sup”.
źródło
java
. Czy umiesz to umieścić w swoim nagłówku, tak jak inne odpowiedzi?t.length
z10
i
jest używany tylko do iteracji przezString
, usuń go i wykonaj pętlę foreach:for(char c:s.toCharArray())
if(c==' '){o+='0';continue;}
takżeif(c==' ')o+='0';else{
i dodaj odpowiedni}
.CoffeeScript - 202 (210 - 8)
źródło
APL, 77 znaków
Wyjaśnienie
2+⌊y←7.99,⍨.315×⍳25
lub, bez golfa,y←(0.315×⍳25),7.99 ◇ 2+⌊y
pobiera próbki odpowiednio nachylonej linii (y = 0,315 x) w punktach od 1 do 25; linia jest przechylona w taki sposób, że dolna część tych wartości y jest zgodna z powtarzającym się wzorem 000111 ... 777, z wyjątkiem szóstej grupy cyfr 5555; na końcu dołączana jest liczba, aby uzyskać czwartą 7, tak że końcowa tablica plus 2 to 22233344455566677778889999;⌈3.1×y-⌊y
zwiększa różnicę między tymi wartościami y a ich podłogami, tak że sufity różnic dają wzór 123123 ... z 4 na ostatnich cyfrach z dwóch grup 4 cyfr;'0',⍨( ... )/¨⍕¨ ...
lub(( ... ) /¨ ⍕¨ ...),'0'
wykorzystuje ten drugi wynik do duplikowania cyfr z pierwszego, tak aby wynik był tablicą ciągów „2” „22” „222” „3” „33” „333” ... z poprawnymi „7777” i „ 9999 ”na miejscu, a na końcu dołączone jest„ 0 ”;⍵⍳⍨⎕UCS 96+⍳26
lub(⎕UCS 96+⍳26)⍳⍵
oblicza indeks każdego wejściowego znaku, gdzie „a” wynosi 1, „z” wynosi 26, a spacja (i każdy inny znak) wynosi 27;{ ... }/( ... )[ ... ]
bierze ten ostatni wynik, indeks dla każdego wejściowego znaku, w celu przetłumaczenia każdego znaku na odpowiedni ciąg cyfr, a następnie konkatenuje ciągi znaków za pomocą funkcji w nawiasach klamrowych;{⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}
lub{(⍺,(=/↑¨⍺,⍵)↑''),⍵}
dołącza każdy nowy ciąg ⍺ do akumulatora ⍵, wstawiając pojedynczą spację tylko wtedy, gdy oba argumenty zaczynają się od tego samego znaku.Przykłady
źródło
Python
155150Chciałbym być lepszy na tym XD. Definicja funkcji nie jest liczona. Pierwszy poziom wcięcia to spacja, drugi to tabulator, a trzeci 2 tabulatory.
źródło
JavaScript 234
for(l=-1,r="",I=0,y=(s=prompt()).length;I<y;I++){c=s[I];n="";d=c.charCodeAt(0)-96;if(0>d)n=0;else for(k=J=0;J<8;k=++J){v="33333434"[k];if(d<=v){for(x=K=0;0<=d?K<d:K>d;x=0<=d?++K:--K)n+=k+2;break}d-=v}r+=n[0]==l[0]?" "+n:n;l=n}alert(r)
źródło
R 224
Jestem pewien, że jest lepszy sposób, aby to zrobić, więc będę dalej nad tym pracował.
źródło