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:
Tugas Anda
Tugas Anda adalah menulis program / fungsi yang menerima string s
dari stdin / sebagai parameter dan mengembalikan nilai yang sebenarnya jika s
mudah 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
, liftM4
atau itertools.combinations
dalam 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!
Jawaban:
CJam,
34312722 karakterCobalah online.
Contoh dijalankan
Bagaimana itu bekerja
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:
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:
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:
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 .
sumber
Python 2 -
80, 68, 64, 61, 58, 50, 48, 45, 4442Meskipun sekarang sudah agak konyol, saya akan terus menggunakan impor perpustakaan gratis, bahkan
__builtin__
perpustakaan:Jadi hanya baris pendek berikut yang dihitung terhadap panjang kode:
Penghargaan untuk Markuz untuk ide-ide tentang
input()
! Tantangan impor bebas ini selalu memperkenalkan Anda ke beberapa perpustakaan yang kurang dikenal. ;)Alternatif hanya menggunakan
operator
perpustakaan (98, 8379):Saya akan berhenti di sini. Tapi Anda bisa lebih jauh golf versi ini menggunakan
sys
,pprint
dan perpustakaan lain ...Alternatif tanpa perpustakaan (105):
sumber
ord(c)
ke variabel (katakanlaho
) dan kemudian mengurangic/112
danc/119
bukannya boolean?lambda
ekspresi dengan mudah. Dengan[(o-1-o/112-o/119)/3for o in map(ord,s)]
saya berakhir dengan 80 byte lagi.from sys import argv as s
, menggunakans[1]
bukannyainput()
input
dari__builtin__
juga sebenarnya lebih baik: D menyimpan Byte lain.RubyRegex (rasa paling populer),10683 byteKarena regex
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.
sumber
{2}
luar pergantian, menghemat 22 byte?Bash + coreutils, 49
Mengembalikan kode keluar 1 untuk BENAR dan 0 untuk SALAH:
sumber
perl -pE'y/a-z/aaadddgggjjjmmmpppptttwwww/;$_=!/(.)\1/' <(echo "x")
Mencetak 1 untuk true dan tidak ada untuk false.aaadddgggjjjmmmpppptttwwww
tapi saya sudah menyerah.11122233344455566667778888
akan dilakukan. Dengan basis 36 menyandikan 19 digit pertama dari angka ini, kita dapat menyimpan 1 karakter!APL (Dyalog),
2423Penjelasan
⍞
: 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)⍳
:IndexOf
fungsi. 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⌈
:max
dengan -13. Ini membawa Z kembali ke grup dengan WXY⌊
: Round down to integer2≠/
: Pairwise-≠
. Mengembalikan array boolean untuk setiap pasangan berturut-turut.∧/
: DAN bersama-sama semua entri dari array yang dihasilkan.sumber
∧/2≠/
(semua pasangan berurutan diketik pada tombol yang berbeda) alih-alih~∨/2=/
(tidak ada pasangan berurutan yang diketik pada tombol yang sama.) APL FTW !!!Perl - 44
Ini pada dasarnya adalah adaptasi Perl dari jawaban DigitalTrauma diposting dengan izinnya. Memotong 2 karakter berkat @KyleStrand.
43 karakter +1 untuk
-p
bendera.y///
sama dengantr///
. Mencetak1
untuk yang benar dan tidak untuk yang salah. Saya dapat memposting penjelasan terperinci jika diminta.Contoh dijalankan:
Perl - 81
+1 untuk
-n
bendera. Ia bekerja dengan menggunakanjoin
untuk membuat regex (sama seperti Martin ), yang mencukur beberapa byte.Contoh dijalankan:
sumber
a
danz
tetap tidak diterjemahkan?y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/
Juga, ini tidak akan menangani spasi, bukan?a
danz
tetap sama. Jawaban yang diperbarui!JavaScript -
159156 byteMengembalikan 1 untuk truey dan 0 untuk falsy.
Kalau saja saya bisa menyingkirkan kata kunci.
sumber
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}
!=
in for loop dengan a<
.c, 74 byte
Mengembalikan status keluar non-nol untuk TRUE dan 0 untuk FALSE:
sumber
while
tofor(;c=~getchar();d=c/3)
, dan byte lain dengan mengubah firstif
menjadi?:
operator.c=getchar()
diperlukan karena~
memiliki prioritas lebih tinggi daripada=
. Namun, saya akan mengambil dua byte lainnya :)exit(d!=c/3);
bukannyaif(d==c/3)exit(0);
bekerja?Ruby 1.8,
89838178 byteIni 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
p
satu dan setelahz
dua, 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).
sumber
Cobra - 80
sumber
JavaScript (ES6) 66
74Lingkaran 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
Keluaran
sumber
.some
alih - alih setiap. Karena walaupun gagal satu kali, jawabannya salah.some
danevery
interchangeble, mengutak-atik kondisi. Tapi di sini sederhananyasome
bukannyaevery
tidak akan berhasil, coba saja.[...s].every
trik ini di golf saya :)Perl, 83 byte
Membuat penyalahgunaan $ _ dalam Perl.
sumber
-e
di 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'
.-l
, tetapi terlihat bagus!-l
sebagai penggantichop
. Tapi tentu saja kamu benar.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
Python 2 (hanya perpustakaan standar) - 53 karakter stdin untuk keluar dari nilai
Di sini saya menyalahgunakan fakta itu
issubclass(bool,int)
, jadi mengubahall()
agarany()
saya mendapatkan nilai keluar yang valid, memotongnot()
dari nilai kembali. Penghapusan fungsi overhead membuat versi regex tertinggal dalam ukuran.sumber
J - 42 char
Fungsi mengambil string di sebelah kanan.
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#3
sama dengan3 3 3 3 3 4 3 4 1
danI.
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 (*/
).sumber
Racket, 119
Tidak disatukan (regexing kombinatorik):
sumber
JavaScript - 152
Bukan pemenang, tetapi saya mencobanya. Ketukan @Lozzaaa sebesar 4 byte pada waktu posting :)
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:
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 ...
sumber
ES6, JavaScript
8970 karakterSaya tahu ini bukan pemenang karena ketika datang ke operasi praktis seperti mendapatkan nilai karakter ASCII, JS menempatkan banyak mengasapi (
.charCodeAt()
).Jalankan di Web Console dari Firefox terbaru.
Pemakaian:
Fungsi mengembalikan benar atau salah.
EDIT : Golf banyak menggunakan
[...x].every
trik yang dipelajari dari @ edc65 (Terima kasih!)Saya akan mencoba golf lebih banyak :)
sumber
GML (Bahasa Pembuat Game), 149
sumber
Python 3 - 152 karakter
Bukan yang terpendek yang bisa saya lakukan, tetapi itu akan berlaku untuk saat ini
sumber