Ta konkurencja się skończyła.
Zwycięzcą jest CJam z 22 postaciami, pokonując odpowiedź TwiNight o jedną postać. Gratulacje Dennis !
Wyróżnienie należy do Falko , który całkowicie oszalał na punkcie darmowego importu.
.
Jakiś czas temu chciałem wiedzieć, jak mogę wypisać nowoczesne smartfony za pomocą mojego telefonu Nokia 3310, i chociaż niektóre odpowiedzi były naprawdę dobre, nadal nie mogę nadążyć! Może powinienem przyjąć inne podejście i po prostu nie pisać słów, które trudno byłoby pisać.
Wywołamy fragment tekstu, który można łatwo wpisać, jeśli nie ma dwóch kolejnych liter na tym samym przycisku na klawiaturze telefonu, biorąc pod uwagę standardowy układ:
Twoje zadanie
Twoim zadaniem jest napisanie programu / funkcji, która akceptuje ciąg s
ze stdin / jako parametr i zwraca prawdziwą wartość, jeśli s
jest łatwa do wpisania, aw przeciwnym razie wartość falsy. Dane wejściowe będą się składać tylko z małych liter i spacji i na pewno nie będą puste!
Punktacja
To jest codegolf, więc wygrywa najmniej znaków.
Sprawozdanie importowe nie będą wliczane do końcowego wyniku, więc jeśli kiedykolwiek chciał użyć std::set_symmetric_difference
, liftM4
lub itertools.combinations
w kodzie, teraz jest czas!
-3 jeśli twój kod źródłowy jest łatwy do pisania, zakładając, że wszystko, co nie jest literą, znajduje się na przycisku 0. W końcu mogę chcieć wysłać twój kod do znajomych!
Przypadki testowe
Oto kilka przypadków testowych, aby sprawdzić, czy kod działa zgodnie z przeznaczeniem:
"x" -> True
"aardvark" -> False
"ardvark" -> True
"flonk" -> False
"im codegolfing all day long" -> False
"i indulge in minimizing bytecount" -> True
"havent heard from you in a long time" -> False
"your silence was of undue permanence" -> True
"how are you" -> False
"how are you" -> True
Miłej gry w golfa!
Odpowiedzi:
CJam,
34312722 znakówWypróbuj online.
Przykładowy przebieg
Jak to działa
tło
Rdzeń kodu polega na zastosowaniu mapy F do każdego znaku C ciągu wejściowego, aby obrazy symboli na tym samym kluczu pasowały do siebie. Znalazłem odpowiednią mapę, przestrzegając następujących zasad:
Mapa T: C ↦ (C - 'h') + 13 przekształca ciąg S: = "abcdefghijklmnopqrstuvxyz" w następujący sposób:
W przypadku klawiszy 0do 6wystarczyłoby podzielić T (C) przez 3 , ale musimy zastosować pewną korektę do znaków w s , t , v , y i z .
Mapa D: C ↦ (C - 'h') / 9 przekształca ciąg S w następującą tablicę:
To koryguje ilorazy s , t , v , y i z , bez wpływu na pozostałe.
Na koniec mapa F: C ↦ (T (C) - D (C)) / 3 przekształca ciąg S w następujący sposób:
Wszystko, co spoczywa, to jakoś porównać kolejne znaki. W tym celu my XOR F (C) z obrazem poprzedniego znaku - po pierwsze, my XOR F (C) z 1 (domyślna wartość zmiennej X ), która nie ma preimage - i mnożymy wszystkie wyniki.
Produkt będzie falsy tylko wtedy, gdy jeden z czynników jest zerem, czyli tylko wtedy, gdy dwa kolejne znaki mają ten sam obraz przez F .
źródło
Python 2 -
80, 68, 64, 61, 58, 50, 48, 45, 4442Mimo że robi się to trochę niedorzeczne, będę nadal korzystać z darmowego importu bibliotek, nawet
__builtin__
biblioteki:Tak więc tylko następująca krótka linia liczy się do długości kodu:
Podziękowania dla Markuza za pomysły dotyczące
input()
! Te wyzwania związane z darmowym importem zawsze przedstawiają niektóre mniej znane biblioteki. ;)Alternatywnie przy użyciu tylko
operator
biblioteki (98, 8379):Zatrzymam się tutaj. Ale można dodatkowo golfowym wersję użyciu
sys
,pprint
oraz innych bibliotek ...Alternatywa bez bibliotek (105):
źródło
ord(c)
do zmiennej (powiedzmyo
), a następnie odjęciec/112
ic/119
zamiast wartości logiczne?lambda
tak łatwo przypisywać zmiennych do wyrażeń. Z[(o-1-o/112-o/119)/3for o in map(ord,s)]
znów kończę na 80 bajtach.from sys import argv as s
, używającs[1]
zamiastinput()
input
z__builtin__
również jest w rzeczywistości jeszcze lepsze: D zapisuje kolejny bajt.RubyRegex (najpopularniejsze smaki),10683 bajtówPonieważ wyrażenie regularne
Właśnie wyciąłem pośrednika (Ruby) i uczyniłem z niego rozwiązanie czysto regularne. Działa w wielu odmianach i odnajduje dopasowanie tylko wtedy, gdy ciąg nie zawiera dwóch kolejnych znaków na tym samym przycisku.
źródło
{2}
poza alternatywą, oszczędzając 22 bajty?Bash + coreutils, 49
Zwraca kod wyjścia 1 dla PRAWDA i 0 dla FAŁSZ:
źródło
perl -pE'y/a-z/aaadddgggjjjmmmpppptttwwww/;$_=!/(.)\1/' <(echo "x")
wypisuje 1 dla prawdy, a nic dla fałszu.aaadddgggjjjmmmpppptttwwww
ale się poddałem.11122233344455566667778888
wystarczy. Bazując 36 kodując pierwsze 19 cyfr tego numeru, możemy zapisać 1 znak!APL (Dyalog),
2423Wyjaśnienie
⍞
: Pobiera ciąg znaków z ekranu⎕AV
: Jest to wektor atomowy, który jest zasadniczo ciągiem wszystkich znaków rozpoznawanych przez APL, które oczywiście obejmują wszystkie małe litery (indeks 18 ~ 43) i spację (indeks 5)⍳
:IndexOf
funkcję. W przypadku wielu funkcji w APL, które przyjmują jeden lub dwa argumenty skalarne, możesz podać do niej tablicę zamiast skalara - APL wykona dla ciebie zapętlenie.⍳
Zwraca więc tablicę liczbową indeksów..21-.31×
: Razy 0,31, a następnie odejmij od 0,21. To mała sztuczka, która odwzorowuje literę na tym samym kluczu (zwłaszcza PQRS) na ten sam numer (po zaokrągleniu w dół do liczb całkowitych), z wyjątkiem Z, które są mapowane na własną grupę . Zwraca tablicę boolowską dla każdej kolejnej pary. : ORAZ razem wszystkie wpisy wynikowej tablicy.¯13⌈
:max
z -13. Sprowadza to Z do grupy z WXY⌊
: Zaokrąglaj w dół do liczb całkowitych2≠/
: Paruj-≠
∧/
źródło
∧/2≠/
(wszystkie kolejne pary są wpisywane na różnych klawiszach) zamiast~∨/2=/
(żadna kolejna para nie jest wpisywana na tym samym klawiszu.) APL FTW !!!Perl - 44
Jest to w zasadzie adaptacja Perla do odpowiedzi @ DigitalTrauma opublikowanej za jego zgodą. Ogolono 2 znaki dzięki @KyleStrand.
43 znaki + 1 dla
-p
flagi.y///
jest taki sam jaktr///
. Drukuje1
na prawdę, a nic na fałsz. Mogę opublikować szczegółowe wyjaśnienie na żądanie.Przykładowy przebieg:
Perl - 81
+1 za
-n
flagę. Działa przy użyciujoin
wyrażenia regularnego (takiego samego jak Martin ), który goli kilka bajtów.Przykładowy przebieg:
źródło
a
iz
pozostać nietransliterowanym?y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/
Ponadto nie będzie to obsługiwać spacji, prawda?a
iz
pozostanie taki sam. Zaktualizowana odpowiedź!JavaScript -
159156 bajtówZwraca 1 za prawda i 0 za fałsz.
Gdybym tylko mógł pozbyć się słów kluczowych.
źródło
function g(s){p=n=-1;for(i=0;i<s.length;i++){p=n;n=s.charCodeAt(i)-97;n>17&&n--;n>23&&n--;if(~p)continue;if(~(p/3)==~(n/3))return 0}return 1}
!=
pętlę w for przez<
.c, 74 bajty
Zwraca niezerowy status wyjścia dla PRAWDA i 0 dla FAŁSZ:
źródło
while
nafor(;c=~getchar();d=c/3)
, i kolejny bajt, zmieniając swój pierwszyif
na?:
operator.c=getchar()
są wymagane, ponieważ~
mają wyższy priorytet niż=
. Nadal zajmę pozostałe dwa bajty :)exit(d!=c/3);
zamiastif(d==c/3)exit(0);
pracy?Ruby 1.8,
89838178 bajtówOto kolejne zgłoszenie. Ku mojemu wstydowi bije to wyrażenie regularne. :(
Pobiera ciąg za pomocą argumentu wiersza poleceń i wypisuje wartość logiczną.
Jeśli chodzi o algorytm, zmieniam litery po
p
o jeden poz
drugim, a następnie o dwa, a następnie sprawdzam, czy po dzieleniu liczb całkowitych przez 3 nie ma kolizji.PS: Po raz pierwszy użycie Ruby 1.8 skróciło kod (ze względu na krótszy sposób uzyskiwania kodów znaków).
źródło
Kobra - 80
źródło
JavaScript (ES6) 66
74Wewnętrzna pętla znajduje grupę dla każdej postaci. Koncepcyjnie jest to „redukcja”, ale „mapa” jest krótsza. Zewnętrzna pętla porównuje grupę kolejnych znaków i wychodzi z fałszem, jeśli są one równe.
Przetestuj w konsoli Firefox / Firebug
Wydajność
źródło
.some
zamiast każdego. Ponieważ nawet jeśli raz się nie powiedzie, odpowiedź jest fałszywa.some
ievery
są wymienne, bawiąc się warunkami. Ale tutaj po prostusome
zamiast zamiastevery
nie będzie działać, spróbuj.[...s].every
sztuczki w golfach :)Perl, 83 bajty
Rażące nadużywanie $ _ w Perlu.
źródło
-e
Perl jest wolny). 71 znaków alternatywne parametry polecenia liniowych:perl -nlaF -e 'map{$_=ord;$_=($_-$_/112-$_/119-1)/3;die 0 if$l==$_;$l=$_}@F;die 1'
.-l
, ale wygląda dobrze!-l
jako zamiennikchop
. Ale oczywiście masz rację.Dwa zadania są trudne w Pythonie; wykrywanie łańcuchów i przypisywanie grup. Oba mogą być wspomagane przy użyciu numpy, ale nie ma go w standardowej bibliotece.
Python 2 (tylko standardowa biblioteka) - funkcja 59 znaków
Python 2 (tylko standardowa biblioteka) - 53 znaki standardowe, aby wyjść z wartości
Tutaj nadużywam faktu, że
issubclass(bool,int)
tak zmieniającall()
naany()
otrzymuję prawidłową wartość wyjściową, odcinając sięnot()
od wartości zwracanej. Usunięcie narzutu funkcji spowodowało, że wersje wyrażeń regularnych pozostały w tyle.źródło
J - 42 char
Funkcja przejmująca ciąg po prawej stronie.
Najpierw odwzorowujemy alfabet (
u:97+i.26
) na cyfry od 0 do 25, wszystkie pozostałe znaki (w tym spacje) będą miały wartość 26 (i.
). Następnie mapujemy ({~
) pierwsze trzy elementy mapują na pierwszy klawisz, kolejne trzy na następny klawisz, i tak dalej, za pomocą klawiszy klawiatury telefonu, upewniając się, że spacja / inna interpunkcja jest mapowana na osobny klawisz na końcu . (4 3 4 1,~5#3
jest równe3 3 3 3 3 4 3 4 1
iI.
zamienia to w 27-elementową tablicę, w której pierwsze trzy są kluczem 1 itd.) Następnie sprawdzamy, czy w parach jest nierówność (2~:/\
) i ORAZ wszystkie wyniki razem (*/
).źródło
Rakieta, 119
Niegolfowany (regexing kombinatoryczny):
źródło
JavaScript - 152
Nie jestem zwycięzcą, ale dałem mu szansę. Beats @Lozzaaa o 4 bajty według czasu publikacji :)
Przechodzi wszystkie testy.
Wykorzystuje brak pisania JS, aby utworzyć tablicę wielu typów, i korzysta z indeksu zwracającego -1 dla obsługi przestrzeni.
Stosowanie:
Zakłada tylko małe litery i spacje. Zwraca 1 dla wartości true, 0 dla wartości false.
Może gdybym znał ES6, mógłbym spróbować drugiego wyzwania ...
źródło
ES6, JavaScript
8970 znakówWiem, że nie jest to zwycięzca, ponieważ przy podejmowaniu przydatnych operacji, takich jak uzyskanie wartości ASCII charakteru, JS stawia wiele nadęć (
.charCodeAt()
).Uruchom go w konsoli internetowej najnowszego Firefoksa.
Stosowanie:
Funkcja zwraca true lub false.
EDYCJA : Dużo grałem w golfa za pomocą
[...x].every
sztuczki wyuczonej z @ edc65 (Dzięki!)Spróbuję bardziej zagrać w golfa :)
źródło
GML (Game Maker Language), 149
źródło
Python 3 - 152 znaków
Nie najkrótszy, jaki mogłem wybrać, ale na razie to wystarczy
źródło