Kata-kata yang Mudah Diketik

30

Persaingan ini berakhir.

Pemenangnya adalah CJam dengan 22 karakter, mengalahkan jawaban TwiNight dengan satu karakter. Selamat, Dennis !

Disebutkan dengan terhormat oleh Falko , yang benar-benar gila dengan impor gratis.

.


Beberapa waktu yang lalu saya ingin tahu bagaimana saya bisa mengetikkan smartphone modern dengan Nokia 3310 saya, dan sementara beberapa jawaban benar-benar baik, saya masih tidak bisa mengimbangi! Mungkin saya harus mengambil pendekatan yang berbeda dan tidak menulis kata-kata yang aneh untuk diketik.

Kami akan memanggil sepotong teks yang mudah diketik jika tidak ada dua huruf berurutan pada tombol yang sama pada keyboard telepon, mengingat tata letak standar:

Keyboard Telepon


Tugas Anda

Tugas Anda adalah menulis program / fungsi yang menerima string sdari stdin / sebagai parameter dan mengembalikan nilai yang sebenarnya jika smudah diketik dan nilai palsu sebaliknya. Masukan hanya akan terdiri dari huruf kecil dan spasi dan dijamin tidak kosong!

Mencetak gol

Ini codegolf, jadi karakter-hitung terendah menang.

Pernyataan impor tidak akan dihitung terhadap skor akhir Anda, jadi jika Anda pernah ingin digunakan std::set_symmetric_difference, liftM4atau itertools.combinationsdalam kode Anda, sekarang adalah waktu!

-3 jika kode sumber Anda mudah diketik, anggap semua yang bukan huruf ada di tombol 0. Lagipula, saya mungkin ingin mengirimkan kode Anda ke beberapa teman!

Testcases

Berikut adalah beberapa testcases untuk memeriksa apakah kode Anda berfungsi sebagaimana dimaksud:

"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

Selamat bermain golf!

Flonk
sumber
Apakah dua ruang berturut-turut buruk?
Martin Ender
@ MartinBüttner ya! Seharusnya mungkin menambahkan testcase untuk itu.
Flonk
9
Saya punya nokia dumbphone, jika saya menekan spasi dua kali, saya mendapat nomor 0.
overactor
1
Pertanyaan terkait: menyusun tata letak keyboard ponsel yang memaksimalkan skor berdasarkan seberapa mudah mengetik kata-kata yang paling sering muncul.
justinpc
1
@ jpcooper seperti keduanya yang disebutkan di sini ? Saya telah menggunakan 8pen dan sangat menyukainya, kecuali bahwa kaca ponsel saya memanas saat menggunakannya (dari kontak, bukan dari aktivitas CPU) dan koefisien gesekan membuatnya sulit digunakan untuk input panjang. Menggunakan s-pen pada Note 3 jauh lebih mudah :)
Eben

Jawaban:

6

CJam, 34 31 27 22 karakter

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

Cobalah online.

Contoh dijalankan

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

Bagaimana itu bekerja

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)                                          ";

Latar Belakang

Inti dari kode terdiri dalam menerapkan peta F untuk setiap karakter C dari string input sehingga gambar simbol pada pencocokan kunci yang sama. Saya menemukan peta yang sesuai dengan mengamati hal-hal berikut:

Peta T: C ↦ (C - 'h') + 13 mengubah string S: = "abcdefghijklmnopqrstuvxyz" sebagai berikut:

[-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]

Untuk kunci 0untuk 6, itu akan cukup untuk membagi T (C) oleh 3 , tapi kami harus menerapkan semacam koreksi karakter dalam s , t , v , y dan z .

Peta D: C ↦ (C - 'h') / 9 mengubah string S menjadi array berikut:

[ -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]

Ini mengoreksi quotients dari s , t , v , y dan z , tanpa mempengaruhi yang lain.

Akhirnya, peta F: C ↦ (T (C) - D (C)) / 3 mengubah string S sebagai berikut:

[-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]

Yang tersisa hanyalah membandingkan karakter yang berurutan. Untuk tujuan itu, kita XOR F (C) dengan gambar karakter sebelumnya - untuk yang pertama, kita XOR F (C) dengan 1 (nilai default dari variabel X ), yang tidak memiliki preimage - dan gandakan semua hasil.

Produk ini akan falsy jika dan hanya jika salah satu faktor adalah nol, yaitu, jika dan hanya jika dua karakter berturut-turut memiliki gambar yang sama dengan F .

Dennis
sumber
Saya pikir byte (Bukan karakter) yang dihitung untuk yang ini adalah 54
@ Pengoptimal Saya pikir kode-golf tag wiki mengatakan byte
Jawaban ini tidak lagi mengandung karakter non-ASCII.
Dennis
@professorfish Tag wiki hanyalah default. Jika tantangan menentukan karakter, itu karakter.
Martin Ender
27

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

Meskipun sekarang sudah agak konyol, saya akan terus menggunakan impor perpustakaan gratis, bahkan __builtin__ perpustakaan:

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

Jadi hanya baris pendek berikut yang dihitung terhadap panjang kode:

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

Penghargaan untuk Markuz untuk ide-ide tentang input() ! Tantangan impor bebas ini selalu memperkenalkan Anda ke beberapa perpustakaan yang kurang dikenal. ;)


Alternatif hanya menggunakan operatorperpustakaan ( 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]))

Saya akan berhenti di sini. Tapi Anda bisa lebih jauh golf versi ini menggunakan sys,pprint dan perpustakaan lain ...


Alternatif tanpa perpustakaan (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)])
Falko
sumber
Dan sekali lagi kami secara independen memposting solusi yang sama dalam Ruby dan Python. Sepertinya kali ini kamu menang. ;) ... Tidak bisakah Anda juga menyimpan 4 byte, dengan menetapkan ord(c)ke variabel (katakanlah o) dan kemudian mengurangi c/112dan c/119bukannya boolean?
Martin Ender
@ MartinBüttner: Ya, sesekali Python bisa mengalahkan Ruby. Sayangnya saya tidak dapat menetapkan variabel dalam lambdaekspresi dengan mudah. Dengan [(o-1-o/112-o/119)/3for o in map(ord,s)]saya berakhir dengan 80 byte lagi.
Falko
Ah saya mengerti. Sakit perbaikan baru sekalipun! : D
Martin Ender
Sangat mengesankan. Dan Anda masih bisa menyimpan 3 byte dengan from sys import argv as s, menggunakan s[1]bukannyainput()
Markuz
mengimpor inputdari __builtin__juga sebenarnya lebih baik: D menyimpan Byte lain.
Markuz
20

Ruby Regex (rasa paling populer), 106 83 byte

Karena regex

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

Saya baru saja memotong perantara (Ruby) dan membuat ini solusi regex murni. Berfungsi dalam banyak rasa dan hanya menemukan kecocokan jika string tidak mengandung dua karakter berturut-turut pada tombol yang sama.

Martin Ender
sumber
Tidak bisakah Anda meletakkannya di {2}luar pergantian, menghemat 22 byte?
Niet the Dark Absol
1
@NiettheDarkAbsol sayangnya tidak, karena dengan begitu ia dapat memilih berbagai alternatif untuk dua pengulangan.
Martin Ender
Aah, tentu saja. Saya tahu ada alasan XD
Niet the Dark Absol
Kudos untuk solusi yang bisa dibaca, dimengerti, golf!
GreenAsJade
12

Bash + coreutils, 49

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

Mengembalikan kode keluar 1 untuk BENAR dan 0 untuk SALAH:

$ 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
$ 
Trauma Digital
sumber
Sangat bagus! Ini akan menjadi 46 karakter di Perl: perl -pE'y/a-z/aaadddgggjjjmmmpppptttwwww/;$_=!/(.)\1/' <(echo "x")Mencetak 1 untuk true dan tidak ada untuk false.
hmatt1
@chememagic Silakan dan kirim jawaban perl :). Jangan lupa menambahkan satu ke skor untuk menggunakan parameter -p-command-line (sesuai aturan kode-golf).
Digital Trauma
Saya pikir saya bisa menemukan cara untuk mempersingkat aaadddgggjjjmmmpppptttwwwwtapi saya sudah menyerah.
Ben Jackson
2
@ BrianJackson saya menemukan cara. Kami benar-benar dapat menggunakan string karakter yang berbeda - 11122233344455566667778888akan dilakukan. Dengan basis 36 menyandikan 19 digit pertama dari angka ini, kita dapat menyimpan 1 karakter!
Digital Trauma
9

APL (Dyalog), 24 23

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

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

Penjelasan

: Mengambil input string dari layar
⎕AV: Ini adalah vektor atom yang pada dasarnya adalah string dari semua karakter yang dikenal APL, yang tentu saja mencakup semua huruf kecil (indeks 18 ~ 43) dan spasi (indeks 5)
: IndexOffungsi. Untuk banyak fungsi dalam APL yang membutuhkan satu atau dua argumen skalar, Anda dapat memberinya larik sebagai pengganti skalar - APL akan melakukan pengulangan untuk Anda. Jadi mengembalikan array numerik indeks. .21-.31×: Kali 0,31 dan kemudian kurangi dari 0,21. Ini adalah sedikit trik yang memetakan huruf pada tombol yang sama (terutama PQRS) ke nomor yang sama (ketika dibulatkan ke bilangan bulat), kecuali Z, yang dipetakan ke grupnya sendiri
¯13⌈: maxdengan -13. Ini membawa Z kembali ke grup dengan WXY
: Round down to integer
2≠/: Pairwise-. Mengembalikan array boolean untuk setiap pasangan berturut-turut.
∧/: DAN bersama-sama semua entri dari array yang dihasilkan.

TwiNight
sumber
Saya akan memposting sesuatu seperti ini, tetapi Anda mengalahkan saya untuk itu. Kunci Sial Z! Anda masih dapat mencukur 1 karakter dengan mengatakan ∧/2≠/(semua pasangan berurutan diketik pada tombol yang berbeda) alih-alih ~∨/2=/(tidak ada pasangan berurutan yang diketik pada tombol yang sama.) APL FTW !!!
Tobia
Ya tkx. Aku berpikir, "Aku seharusnya bisa mencukur 1 char di sini, kenapa aku tidak bisa melakukannya OMGGGG !!!" Tapi saya harus pergi ke kelas jadi saya hanya memposting apa yang saya miliki. Dan, ya, DAMN Z KEY. Sayangnya saya di ponsel saya jadi saya tidak bisa mengeditnya sampai nanti
TwiNight
Dan saya membuat pemikiran sadar tentang Hukum De Morgan dan masih belum bisa mengetahuinya ... Betapa bodohnya
TwiNight
1
Semoga berhasil mengirim SMS kepada teman-teman Anda. ;)
Thane Brimhall
Ini terlihat sangat menarik. Apakah ada cara untuk mencoba kode ini tanpa membeli juru bahasa APL Dyalog? Penerjemah online yang biasanya saya gunakan sepertinya tidak mengerti dialeknya ...
Dennis
7

Perl - 44

Ini pada dasarnya adalah adaptasi Perl dari jawaban DigitalTrauma diposting dengan izinnya. Memotong 2 karakter berkat @KyleStrand.

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

43 karakter +1 untuk -pbendera. y///sama dengan tr///. Mencetak 1untuk yang benar dan tidak untuk yang salah. Saya dapat memposting penjelasan terperinci jika diminta.

Contoh dijalankan:

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 untuk -n bendera. Ia bekerja dengan menggunakan joinuntuk membuat regex (sama seperti Martin ), yang mencukur beberapa byte.

Contoh dijalankan:

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")
hmatt1
sumber
Tidak bisakah Anda mencukur dua karakter dari solusi Perl dengan membiarkan adan ztetap tidak diterjemahkan? y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/Juga, ini tidak akan menangani spasi, bukan?
Kyle Strand
... oh, benar, dua spasi dalam satu baris sudah merupakan dua karakter yang identik dalam satu baris. Salahku.
Kyle Strand
@KyleStrand panggilan yang bagus untuk membiarkan adan ztetap sama. Jawaban yang diperbarui!
hmatt1
4

JavaScript - 159 156 byte

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;}

Mengembalikan 1 untuk truey dan 0 untuk falsy.

Kalau saja saya bisa menyingkirkan kata kunci.

Lozzaaa
sumber
Setidaknya Anda dapat menyingkirkan beberapa spasi putih dan jika :) 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}
Pengoptimal
Anda menggunakan banyak hal menarik dalam jawaban Anda yang belum pernah saya lihat sebelumnya. Saya biasanya menulis di C ++ tapi saya pikir saya akan memberikan JS suntikan karena lebih cepat untuk menguji online.
Lozzaaa
Saya hanya menemukan tempat ini hari ini dan berpikir saya akan mencobanya.
Percobaan
Anda dapat membuat kode Anda lebih pendek dengan mengganti !=in for loop dengan a <.
ProgramFOX
Ya itu dalam optimasi Optimizer :) apa etiket penggunaan saran orang dalam jawaban saya? Sekarang ada entri JavaScript lain yang bisa saya kalahkan dengan menerima modifikasi itu.
Lozzaaa
4

c, 74 byte

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

Mengembalikan status keluar non-nol untuk TRUE dan 0 untuk FALSE:

$ 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
$ 
Trauma Digital
sumber
Anda dapat menyimpan 3 byte dengan mengubah whileto for(;c=~getchar();d=c/3), dan byte lain dengan mengubah first ifmenjadi ?:operator.
Allbeert
@ Allbeert - Terima kasih. Tanda kurung sekitar c=getchar()diperlukan karena ~memiliki prioritas lebih tinggi daripada =. Namun, saya akan mengambil dua byte lainnya :)
Digital Trauma
Untuk yang terakhir, apakah sesuatu seperti exit(d!=c/3);bukannya if(d==c/3)exit(0);bekerja?
@professorfish Itu akan membuat jalan keluar pada titik itu tanpa syarat, yang saya tidak mau
Digital Trauma
Anda dapat menyimpan satu karakter dengan r * = d ^ c / 3
Alchymist
3

Ruby 1.8, 89 83 81 78 byte

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

Ini adalah kiriman lain. Yang memalukan saya, ini mengalahkan regex. :(

Ini mengambil string melalui argumen baris perintah dan mencetak boolean.

Adapun algoritma, saya menggeser surat setelah psatu dan setelah zdua, dan kemudian saya memeriksa bahwa tidak ada tabrakan setelah pembagian integer oleh 3.

PS: Ini adalah pertama kalinya, yang menggunakan Ruby 1.8 mempersingkat kode (karena cara yang lebih pendek untuk mendapatkan kode karakter).

Martin Ender
sumber
3

Cobra - 80

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

JavaScript (ES6) 66 74

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

Lingkaran dalam menemukan grup untuk setiap karakter. Secara konseptual adalah 'mengurangi' tetapi 'peta' lebih pendek. Lingkaran luar membandingkan kelompok karakter berturut-turut dan keluar dengan false jika mereka sama.

Uji di Firefox / Firebug console

;["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)))

Keluaran

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
edc65
sumber
Anda dapat melakukan .somealih - alih setiap. Karena walaupun gagal satu kali, jawabannya salah.
Pengoptimal
@ Opptizer somedan everyinterchangeble, mengutak-atik kondisi. Tapi di sini sederhananya somebukannya everytidak akan berhasil, coba saja.
edc65
Hmm, kamu benar. Saya perlu memahami logika Anda terlebih dahulu.
Pengoptimal
Tolong jangan pedulikan jika saya mulai menggunakan [...s].everytrik ini di golf saya :)
Pengoptimal
2

Perl, 83 byte

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

Membuat penyalahgunaan $ _ dalam Perl.

mcreenan
sumber
1
Seperti yang dapat Anda amati, diizinkan untuk mengirimkan parameter baris perintah ke penerjemah, cukup Anda harus menghitung parameter tambahan. (The minimal yang dibutuhkan untuk mengakses kode, -edi Perl, gratis.) 71 karakter alternatif dengan parameter baris perintah: perl -nlaF -e 'map{$_=ord;$_=($_-$_/112-$_/119-1)/3;die 0 if$l==$_;$l=$_}@F;die 1'.
manatwork
@manatwork Anda tidak membutuhkannya -l, tetapi terlihat bagus!
hmatt1
@chememagic, saya hanya mencoba mereproduksi kode asli yang setara, jadi saya menambahkan -lsebagai pengganti chop. Tapi tentu saja kamu benar.
manatwork
Terima kasih @manatwork, saya bahkan tidak berpikir untuk menggunakan opsi baris perintah untuk Perl.
mcreenan
2

Dua tugas rumit dalam Python; mendeteksi rantai, dan menugaskan kelompok. Keduanya dapat dibantu menggunakan numpy, tetapi tidak di perpustakaan standar.

Python 2 (hanya perpustakaan standar) - 59 karakter berfungsi

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 (hanya perpustakaan standar) - 53 karakter stdin untuk keluar dari nilai

Di sini saya menyalahgunakan fakta itu issubclass(bool,int), jadi mengubah all()agar any()saya mendapatkan nilai keluar yang valid, memotong not()dari nilai kembali. Penghapusan fungsi overhead membuat versi regex tertinggal dalam ukuran.

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:])))
Yann Vernier
sumber
2

J - 42 char

Fungsi mengambil string di sebelah kanan.

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

Pertama-tama kita memetakan alfabet ( u:97+i.26) ke dalam angka 0 hingga 25, semua karakter lain (termasuk spasi) menuju 26 ( i.). Kemudian kami memetakan ( {~) tiga elemen pertama memetakan ke tombol pertama, tiga berikutnya ke tombol berikutnya, dan seterusnya melalui tombol-tombol pada pad telepon, pastikan untuk memetakan ruang / tanda baca lainnya ke tombol terpisah di akhir . ( 4 3 4 1,~5#3sama dengan 3 3 3 3 3 4 3 4 1dan I.mengubahnya menjadi array 27-item di mana tiga yang pertama adalah kunci 1, dll.) Lalu kami memeriksa ketimpangan berpasangan ( 2~:/\) dan DAN semua hasilnya bersama-sama ( */).

   */@(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
algoritme hiu
sumber
2

Racket, 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))))

Tidak disatukan (regexing kombinatorik):

(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))))
Matthew Butterick
sumber
1

JavaScript - 152

Bukan pemenang, tetapi saya mencobanya. Ketukan @Lozzaaa sebesar 4 byte pada waktu posting :)

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};

Lewati semua tes.
Mengambil keuntungan dari kurangnya pengetikan JS untuk membuat array multi-tipe, dan ini mengambil keuntungan dari indexOf yang mengembalikan -1 untuk dukungan ruang.

Pemakaian:

m("string here")

Diasumsikan hanya huruf dan spasi alfabet huruf kecil. Mengembalikan 1 untuk true, 0 untuk false.

Mungkin jika saya tahu ES6 saya bisa mencoba tantangan kedua ...

DankMemes
sumber
"jika saja ..." - Apakah Anda melihat jawaban saya? : P
Optimizer
Ya saya lakukan. Saya tidak tahu ES6 (belum), sayangnya. Namun, ini menarik untuk dibuat.
DankMemes
Ya, solusi Anda menggunakan pendekatan yang menarik.
Pengoptimal
1

ES6, JavaScript 89 70 karakter

Saya tahu ini bukan pemenang karena ketika datang ke operasi praktis seperti mendapatkan nilai karakter ASCII, JS menempatkan banyak mengasapi ( .charCodeAt()).

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

Jalankan di Web Console dari Firefox terbaru.

Pemakaian:

N("testing if this works")

Fungsi mengembalikan benar atau salah.

EDIT : Golf banyak menggunakan[...x].every trik yang dipelajari dari @ edc65 (Terima kasih!)

Saya akan mencoba golf lebih banyak :)

Pengoptimal
sumber
0

GML (Bahasa Pembuat Game), 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)
Timtech
sumber
0

Python 3 - 152 karakter

Bukan yang terpendek yang bisa saya lakukan, tetapi itu akan berlaku untuk saat ini

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)
Peluruhan Beta
sumber