Łatwe do wpisania słowa


30

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:

Telephone Keyboard


Twoje zadanie

Twoim zadaniem jest napisanie programu / funkcji, która akceptuje ciąg sze stdin / jako parametr i zwraca prawdziwą wartość, jeśli sjest ł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, liftM4lub itertools.combinationsw 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!


Czy dwie kolejne spacje są złe?
Martin Ender

@ MartinBüttner tak! Powinien chyba do tego dodać test testowy.
Flonk

9
Mam hantle nokia, jeśli naciśniesz spację dwa razy, dostanę cyfrę 0.
overactor

1
Powiązane pytanie: opracuj układ klawiatury telefonu, który maksymalizuje niektóre wyniki na podstawie tego, jak łatwo można wpisać najczęściej występujące słowa.
justinpc,

1
@jpcooper jak dwa wymienione tutaj ? Użyłem 8pen i bardzo mi się podoba, z tym wyjątkiem, że szkło mojego telefonu nagrzewa się przy jego użyciu (od kontaktu, a nie od aktywności procesora), a współczynnik tarcia sprawia, że ​​trudno jest używać go przy długich wejściach. Używanie pióra s-Note w Note 3 jest o wiele łatwiejsze
Eben

Odpowiedzi:


6

CJam, 34 31 27 22 znaków

1l{'h-_9/-D+3/X\:X^*}/

Wypróbuj online.

Przykładowy przebieg

$ cjam <(echo "1l{'h-_9/-D+3/X\:X^*}/") <<< 'aardvark'; echo
0
$ cjam <(echo "1l{'h-_9/-D+3/X\:X^*}/") <<< 'ardvark'; echo
66000

Jak to działa

1l                         " Push a R := 1 and read a line L from STDIN.                  ";
                           " Initialize X := 1. (implicit)                                ";
  {                  }/    " For each character C of L, do the following:                 ";
    'h-                    "     C -= 'h'                                                 ";
       _9/-D+3/            "     Y := (C - C / 9 + 13) / 3                                ";
               X\  ^*      "     R *= X ^ Y                                               ";
                 :X        "     X := Y                                                   ";
                           " Print R. (implicit)                                          ";

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:

[-59   6  7  8   9 10 11  12 13 14  15 16 17  18 19 20  21 22 23 24  25 26 27  28 29 30 31]

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ę:

[ -8   0  0  0   0  0  0   0  0  0   0  0  0   0  0  0   0  1  1  1   1  1  1   1  1  1  2]

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:

[-17   2  2  2   3  3  3   4  4  4   5  5  5   6  6  6   7  7  7  7   8  8  8   9  9  9  9]

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 .


Myślę, że bajt (nie znak) dla tego licznika to 54

@Optimizer Wydaje mi się, że wiki tag -golf kod mówi bajty

Ta odpowiedź nie zawiera już znaków spoza ASCII.
Dennis,

@professorfish Tag wiki jest tylko domyślny. Jeśli wyzwanie określa postacie, są to postacie.
Martin Ender

27

Python 2 - 80, 68, 64, 61, 58, 50, 48, 45, 44 42

Mimo że robi się to trochę niedorzeczne, będę nadal korzystać z darmowego importu bibliotek, nawet __builtin__biblioteki:

from numpy import diff as D
from pprint import pprint as P
from __builtin__ import all as A
from __builtin__ import raw_input as I
from __builtin__ import bytearray as B

Tak więc tylko następująca krótka linia liczy się do długości kodu:

P(A(D([(o-o/112-o/59)/3for o in B(I())])))

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 operatorbiblioteki ( 98, 83 79):

from operator import ne as n
K=[(ord(c)-1-(c>'p')-(c>'w'))/3for c in input()]
print all(map(n,K[1:],K[:-1]))

Zatrzymam się tutaj. Ale można dodatkowo golfowym wersję użyciu sys, pprintoraz innych bibliotek ...


Alternatywa bez bibliotek (105):

s=input()
n=lambda c:(ord(c)-1-(c>'p')-(c>'w'))/3
print all([n(s[i])!=n(s[i+1])for i in range(len(s)-1)])

I po raz kolejny niezależnie publikujemy to samo rozwiązanie w Ruby i Python. Wygląda na to, że tym razem wygrywasz. ;) ... Nie można również zapisać 4 bajty, przez przypisanie ord(c)do zmiennej (powiedzmy o), a następnie odjęcie c/112i c/119zamiast wartości logiczne?
Martin Ender

@ MartinBüttner: Tak, raz na jakiś czas Python może pokonać Ruby. Niestety nie mogę lambdatak ł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.
Falko,

O, rozumiem. Chory nowa poprawa! : D
Martin Ender

Bardzo imponujące. I nadal możesz zapisać 3 bajty from sys import argv as s, używając s[1]zamiastinput()
Markuz

importowanie inputz __builtin__również jest w rzeczywistości jeszcze lepsze: D zapisuje kolejny bajt.
Markuz,

20

Ruby Regex (najpopularniejsze smaki), 106 83 bajtów

Ponieważ wyrażenie regularne

^(?!.*(  |[abc]{2}|[def]{2}|[ghi]{2}|[jkl]{2}|[mno]{2}|[p-s]{2}|[tuv]{2}|[w-z]{2}))

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.


Nie możesz umieścić tego {2}poza alternatywą, oszczędzając 22 bajty?
Niet the Dark Absol

1
@NiettheDarkAbsol niestety nie, ponieważ wtedy może wybrać różne alternatywy dla dwóch powtórzeń.
Martin Ender

Ach, oczywiście. Wiedziałem, że istnieje powód XD
Niet the Dark Absol

Uznanie dla czytelnego, zrozumiałego rozwiązania golfowego!
GreenAsJade

12

Bash + coreutils, 49

tr a-z $[36#8g7e9m4ddqd6]7778888|grep -Pq '(.)\1'

Zwraca kod wyjścia 1 dla PRAWDA i 0 dla FAŁSZ:

$ for s in "x" "aardvark" "ardvark" "flonk" "im codegolfing all day long" "i indulge in minimizing bytecount" "havent heard from you in a long time" "your silence was of undue permanence" "how are  you" "how are you"; do echo "./3310.sh <<< \"$s\" returns $(./3310.sh <<< "$s"; echo $?)"; done
./3310.sh <<< "x" returns 1
./3310.sh <<< "aardvark" returns 0
./3310.sh <<< "ardvark" returns 1
./3310.sh <<< "flonk" returns 0
./3310.sh <<< "im codegolfing all day long" returns 0
./3310.sh <<< "i indulge in minimizing bytecount" returns 1
./3310.sh <<< "havent heard from you in a long time" returns 0
./3310.sh <<< "your silence was of undue permanence" returns 1
./3310.sh <<< "how are  you" returns 0
./3310.sh <<< "how are you" returns 1
$ 

Bardzo dobrze! Będzie to 46 znaków w Perlu: perl -pE'y/a-z/aaadddgggjjjmmmpppptttwwww/;$_=!/(.)\1/' <(echo "x")wypisuje 1 dla prawdy, a nic dla fałszu.
hmatt1

@chilemagic Śmiało i opublikuj odpowiedź na perl :). Nie zapomnij dodać jednego do wyniku za pomocą parametru wiersza polecenia -p (zgodnie z konwencjami golf-code).
Digital Trauma

Myślałem, że mogę znaleźć sposób na skrócenie, aaadddgggjjjmmmpppptttwwwwale się poddałem.
Ben Jackson,

2
@BenJackson Wymyśliłem sposób. Możemy faktycznie użyć ciągu dowolnych odrębnych znaków - 11122233344455566667778888wystarczy. Bazując 36 kodując pierwsze 19 cyfr tego numeru, możemy zapisać 1 znak!
Cyfrowa trauma

9

APL (Dyalog), 24 23

~∨/2=/⌊¯13⌈.21-.31×⎕AV⍳⍞

∧/2≠/⌊¯13⌈.21-.31×⎕AV⍳⍞

Wyjaś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)
: IndexOffunkcję. 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⌈ : maxz -13. Sprowadza to Z do grupy z WXY
: Zaokrąglaj w dół do liczb całkowitych
2≠/ : Paruj-
∧/


Zamierzałem zamieścić coś takiego, ale pobiłeś mnie. Cholerny klawisz Z! Nadal możesz ogolić 1 znak, mówiąc ∧/2≠/(wszystkie kolejne pary są wpisywane na różnych klawiszach) zamiast ~∨/2=/(żadna kolejna para nie jest wpisywana na tym samym klawiszu.) APL FTW !!!
Tobia,

Tak tkx. Myślałem: „Powinienem być w stanie ogolić 1 znak tutaj, dlaczego nie mogę tego zrobić OMGGGG !!!” Ale muszę iść na zajęcia, więc po prostu publikuję to, co mam. I tak, DAMN Z KEY. Niestety korzystam z telefonu, więc nie mogę go edytować do późniejszego dnia
TwiNight

I pomyślałem o prawach De Morgana i wciąż nie mogę tego
rozgryźć

1
Powodzenia wysyłaj SMS-y do znajomych. ;)
Thane Brimhall

To wygląda bardzo interesująco. Czy jest jakiś sposób na wypróbowanie tego kodu bez zakupu interpretera APL Dyalog? Tłumacz online, którego zwykle używam , nie rozumie dialektu ...
Dennis,

7

Perl - 44

Jest to w zasadzie adaptacja Perla do odpowiedzi @ DigitalTrauma opublikowanej za jego zgodą. Ogolono 2 znaki dzięki @KyleStrand.

y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/

43 znaki + 1 dla -pflagi. y///jest taki sam jak tr///. Drukuje1 na prawdę, a nic na fałsz. Mogę opublikować szczegółowe wyjaśnienie na żądanie.

Przykładowy przebieg:

perl -pE'y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/' <(echo "x")

Perl - 81

$s=join"]{2}|[",qw(abc def ghi jkl mno p-s tuv w-z);say/^(?!.*(  |[$s]{2}))/?1:0

+1 za -nflagę. Działa przy użyciu joinwyrażenia regularnego (takiego samego jak Martin ), który goli kilka bajtów.

Przykładowy przebieg:

perl -nE'$s=join"]{2}|[",qw(abc def ghi jkl mno p-s tuv w-z);say/^(?!.*(  |[$s]{2}))/?1:0' <(echo "your silence was of undue permanence")

Czy nie mógłbyś ogolić dwóch postaci z rozwiązania Perla, pozwalając ai zpozostać nietransliterowanym? y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/Ponadto nie będzie to obsługiwać spacji, prawda?
Kyle Strand

... och, racja, dwie spacje w rzędzie to już dwa identyczne znaki z rzędu. Mój błąd.
Kyle Strand

@KyleStrand miły telefon na wynajem ai zpozostanie taki sam. Zaktualizowana odpowiedź!
hmatt1

4

JavaScript - 159 156 bajtów

function g(s){p=n=-1;for(i=0;i!=s.length;i++){p=n;n=s.charCodeAt(i);n-=97;if(n>17)n--;if(n>23)n--;if(p==-1)continue;if(~~(p/3)==~~(n/3))return 0;}return 1;}

Zwraca 1 za prawda i 0 za fałsz.

Gdybym tylko mógł pozbyć się słów kluczowych.


Przynajmniej możesz pozbyć się białych znaków, a jeśli tak :) 141: 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}
Optymalizator

W swojej odpowiedzi używasz wielu interesujących rzeczy, których wcześniej nie widziałem. Zwykle piszę w C ++, ale pomyślałem, że dam JS szansę, ponieważ testowanie w Internecie jest szybsze.
Lozzaaa

Znalazłem to miejsce tylko dzisiaj i pomyślałem, że dam mu szansę. Moja następna próba będzie lepsza: D
Lozzaaa

Możesz uczynić kod krótszym znakiem, zastępując !=pętlę w for przez <.
ProgramFOX,

Tak, to było w optymalizacjach Optymalizatora :) jaka jest etykieta korzystania z sugestii ludzi w mojej odpowiedzi? Teraz jest inny wpis JavaScript, który mogę pokonać, akceptując te modyfikacje.
Lozzaaa

4

c, 74 bajty

main(c,d,r){for(;~(c=getchar());r*=d!=c/3,d=c/3)c-=--c/'p'*(c-'k')/7;c=r;}

Zwraca niezerowy status wyjścia dla PRAWDA i 0 dla FAŁSZ:

$ for s in "x" "aardvark" "ardvark" "flonk" "im codegolfing all day long" "i indulge in minimizing bytecount" "havent heard from you in a long time" "your silence was of undue permanence" "how are  you" "how are you"; do echo "./3310 <<< \"$s\" returns $(./3310 <<< "$s"; echo $?)"; done
./3310 <<< "x" returns 40
./3310 <<< "aardvark" returns 0
./3310 <<< "ardvark" returns 216
./3310 <<< "flonk" returns 0
./3310 <<< "im codegolfing all day long" returns 0
./3310 <<< "i indulge in minimizing bytecount" returns 72
./3310 <<< "havent heard from you in a long time" returns 0
./3310 <<< "your silence was of undue permanence" returns 232
./3310 <<< "how are  you" returns 0
./3310 <<< "how are you" returns 8
$ 

Możesz zapisać 3 bajty, zmieniając whilena for(;c=~getchar();d=c/3), i kolejny bajt, zmieniając swój pierwszy ifna ?:operator.
Allbeert

@Allbeert - Dzięki. Nawiasy wokół c=getchar()są wymagane, ponieważ ~mają wyższy priorytet niż =. Nadal zajmę pozostałe dwa bajty :)
Digital Trauma

Na koniec, czy coś takiego exit(d!=c/3);zamiast if(d==c/3)exit(0);pracy?

@professorfish To sprawiłoby, że wyjście w tym momencie byłoby bezwarunkowe, czego nie chcę
Digital Trauma

Możesz zapisać jedną postać za pomocą r * = d ^ c / 3
Alchymist

3

Ruby 1.8, 89 83 81 78 bajtów

p$*[0].chars.map{|c|c=c[0];(c-c/?p-c/?w-1)/3}.each_cons(2).map{|a,b|a!=b}.all?

Oto 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 po zdrugim, 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).


3

Kobra - 80

def f(s)
    for c in s
        for x in 9,if' adgjmptw'[x]>c,break
        t,f=x,t<>x
    print f

3

JavaScript (ES6) 66 74

F=s=>[...s].every(c=>[...' adgjmptw'].map(x=>s+=c<x,w=s,s=0)|s!=w)

Wewnę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

;["x","aardvark","ardvark","flonk","im codegolfing all day long",
"i indulge in minimizing bytecount","havent heard from you in a long time",
"your silence was of undue permanence","how are  you","how are you"]
.forEach(x=>console.log(x + ' -> ' + F(x)))

Wydajność

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

Możesz zrobić .somezamiast każdego. Ponieważ nawet jeśli raz się nie powiedzie, odpowiedź jest fałszywa.
Optymalizator

@Optimizer somei everysą wymienne, bawiąc się warunkami. Ale tutaj po prostu somezamiast zamiast everynie będzie działać, spróbuj.
edc65

Hmm, masz rację. Najpierw muszę zrozumieć twoją logikę.
Optymalizator

Nie przejmuj się, jeśli zacznę używać tej [...s].everysztuczki w golfach :)
Optymalizator

2

Perl, 83 bajty

$_=<>;chop;map{$_=ord;$_=($_-$_/112-$_/119-1)/3;die 0 if$l==$_;$l=$_}split//;die 1

Rażące nadużywanie $ _ w Perlu.


1
Jak widać, dozwolone jest przekazywanie interpretera parametrów wiersza poleceń, wystarczy policzyć dodatkowe parametry. (Minimum niezbędne, aby uzyskać dostęp do kodu -ePerl 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'.
manatwork

@manatwork nie potrzebujesz -l, ale wygląda dobrze!
hmatt1

@chilemagic, właśnie próbowałem odtworzyć oryginalny kod, więc dodałem -ljako zamiennik chop. Ale oczywiście masz rację.
manatwork

Dzięki @manatwork, nawet nie pomyślałem o użyciu opcji wiersza poleceń dla Perla.
mcreenan

2

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

from itertools import imap as M
from __builtin__ import bytearray as A, all as E
from operator import ne as D, not_ as N
from re import S, sub as X, search as F

# 68
#def f(s):
# g=[(n-n/115-n/61)/3for n in A(s)]
# return E(M(D,g,g[1:]))

# 67 with regex via regex
#f=lambda s:N(F(X('(\S)(.)',r'|[\1-\2]{2}','  acdfgijlmopstvwz'),s))

# 59 slightly optimized ordinal classifier and regex sequence detector
f=lambda s:N(F(r'(.)\1',A((n-n/23-n/30)/3for n in A(s)),S))

# 69 using itertools.groupby
#from itertools import groupby as G
#from __builtin__ import sum as S, len as L
#f=lambda s:N(S(L(A(g))-1for _,g in G((n-n/115-n/61)/3for n in A(s))))

Python 2 (tylko standardowa biblioteka) - 53 znaki standardowe, aby wyjść z wartości

Tutaj nadużywam faktu, że issubclass(bool,int)tak zmieniając all()na any()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.

from itertools import groupby as G, imap as M
from __builtin__ import bytearray as A, any as E
from __builtin__ import raw_input as I
from sys import exit as Q
from operator import eq as S

g=[(n-n/23-n/30)/3for n in A(I())]
Q(E(M(S,g,g[1:])))

2

J - 42 char

Funkcja przejmująca ciąg po prawej stronie.

*/@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.)

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#3jest równe 3 3 3 3 3 4 3 4 1i I.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 ( */).

   */@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.) 'i indulge in minimizing bytecount'
1
   f =: */@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.)
   f 'im codegolfing all day long'
0
   f '*/@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.)'  NB. no -3 bonus :(
0

2

Rakieta, 119

(define(f t)(for*/and([s(map ~a'(abc def ghi jkl mno pqrs tuv wxyz))][i s][j s])(not(regexp-match(format"~a~a"i j)t))))

Niegolfowany (regexing kombinatoryczny):

(define(f t)
  (for*/and([s (map ~a '(abc def ghi jkl mno pqrs tuv wxyz))]
            [i s]
            [j s])
    (not (regexp-match (format "~a~a" i j) t))))

1

JavaScript - 152

Nie jestem zwycięzcą, ale dałem mu szansę. Beats @Lozzaaa o 4 bajty według czasu publikacji :)

function m(a){c="abc-def-ghi-jkl-mno-pqrstuv-wxyz";j=a.split("");for(z in j)if(j[z]=Math.floor(c.indexOf(j[z])/4),0!=z&&j[z-1]==j[z])return 0;return 1};

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:

m("string here")

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 ...


„jeśli tylko ...” - Widziałeś moją odpowiedź? : P
Optymalizator

Tak. Niestety nie znam ES6 (jeszcze). Było to jednak interesujące.
DankMemes,

Tak, twoje rozwiązanie wykorzystuje ciekawe podejście.
Optymalizator

1

ES6, JavaScript 89 70 znaków

Wiem, że nie jest to zwycięzca, ponieważ przy podejmowaniu przydatnych operacji, takich jak uzyskanie wartości ASCII charakteru, JS stawia wiele nadęć ( .charCodeAt()).

N=s=>[...s].every(c=>l-(l=(c.charCodeAt()-(c>"r")-(c>"y")-1)/3|0),l=1)

Uruchom go w konsoli internetowej najnowszego Firefoksa.

Stosowanie:

N("testing if this works")

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 :)


0

GML (Game Maker Language), 149

s=argument0p=n=-1for(i=0;i<string_length(s);i++){p=n;n=string_char_at(s,i)-97;x=n>17&&n--;x=n>23&&n--‌​;if(!p)x=1if(!(p/3)=!(n/3))x=0}show_message(x)

0

Python 3 - 152 znaków

Nie najkrótszy, jaki mogłem wybrać, ale na razie to wystarczy

k=['abc','def','ghi','jkl','mno','pqrs','tuv','wxyz',' ']
x=input()
l=2>1
for i in range(len(x)-1):
 for j in k:
  if x[i+1] in j and x[i] in j:l=1>2
print(l)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.