Dalam tantangan ini, Anda diberikan dua kata: Tugas Anda adalah untuk menentukan apakah mereka berbatasan .
Dua huruf berdekatan jika:
- Mereka adalah surat yang sama, atau
- Mereka berbatasan secara leksikografis.
Misalnya, J berdekatan dengan I , J , dan K saja. Z tidak berdekatan dengan A
Dua kata berdekatan jika:
- Mereka memiliki panjang yang sama, dan
- Setiap huruf berdekatan dengan huruf unik dengan kata lain.
Misalnya, CAT berdekatan dengan SAD , seperti C> D, A> A, T> S .
GRATIS tidak berdekatan dengan GRRD (setiap E membutuhkan surat untuk dipasangkan) .
Input output
Anda melewati dua string, dan Anda harus mengembalikan nilai kebenaran jika berbatasan, jika tidak nilai palsu. Anda harus kembali dalam satu menit untuk semua kasus uji di bawah ini.
Anda dapat mengasumsikan bahwa string hanya akan berisi huruf besar, huruf alfabet.
Dua string dapat diteruskan sebagai daftar, atau digabungkan, dengan atau tanpa tanda kutip.
Uji Kasus
Benar:
A A
A B
C B
DD CE
DE FC
ABCD BCDE
AACC DBBB
DJENSKE FDJCLMT
DEFGHIJKL HJLEHMCHE
IKLIJJLIJKKL LJLJLJLJLJHI
ACEGIKMOQSUWY BLNPRDFTVHXJZ
QQSQQRRQSTTUQQRRRS PQTTPPTTQTPQPPQRTP
ELKNSDUUUELSKJFESD DKJELKNSUELSDUFEUS
Falsy:
A C
A Z
B J
JK J
CC BA
CE D
DJENSKE GDJCLMT
DEFGHIJKL HJLHMCHE
IJKLIJKLKIJL LIJLLHJLJLLL
AWSUKMEGICOQY RSHXBLJLNQDFZ
QQSQQRRQSTTUQQQRRS PQTTPPTTQTPQPPQRTT
ELKNSDUVWELSKJFESD DKJELKNSUELSDUFEUS
Ini adalah kode-golf , jadi jawaban terpendek yang valid menang!
sumber
"A A"
?{'string1' 'string2'}
dapat diterima juga?Jawaban:
CJam,
141312 byteCobalah online! atau verifikasi semua kasus uji sekaligus .
Algoritma
Misalkan s dan t adalah dua kata yang diurutkan dengan panjang yang sama. Agar s dan t berbatasan leksikografis (LA), perlu dan memadai bahwa semua pasangan karakter yang bersesuaian juga LA.
Kondisi ini jelas cukup untuk semua kata, dan diperlukan untuk kata-kata panjang 1 .
Sekarang, anggap s dan t memiliki panjang n> 1 , dan biarkan a dan b menjadi karakter pertama, resp., Dari s dan t .
Karena s dan t adalah LA, ada beberapa pemetaan bijective φ antara karakter s dan karakter t sehingga x dan φ (x) adalah LA untuk semua x dalam s , yang berarti bahwa | x - φ (x) | ≤ 1 untuk semua x dalam s .
Misalkan c = φ (a) dan d = φ -1 (b) . Karena sebuah 's dan b ' s minimalitas, sebuah ≤ d (1) dan b ≤ c (2) .
Selanjutnya, karena b dan d , dan a dan c , dan LA, d ≤ b + 1 (3) dan c ≤ a + 1 (4) .
Dengan menggabungkan (1) dan (3) , dan (2) dan (4) , kita mendapatkan bahwa ≤ d ≤ b + 1 dan b ≤ c ≤ a + 1 , dari mana kita menyimpulkan bahwa a - 1 ≤ b ≤ a +1 dan, oleh karena itu, bahwa a dan b adalah LA.
Sekarang, dengan menggabungkan (1) dan (4) , dan (2) dan (3) , kita mendapatkan c - 1 ≤ a ≤ d dan d - 1 ≤ b ≤ c , dari mana kita menyimpulkan bahwa c - 1 ≤ d ≤ c +1 dan, oleh karena itu c dan d adalah LA.
Jadi, jika kita mendefinisikan ulang φ oleh φ (a) = b dan φ (d) = c , | x - φ (x) | ≤ 1 akan tetap berlaku untuk semua x dalam s dan, khususnya, untuk semua x dalam s [1:] .
Dengan cara ini, s [0] = a dan t [0] = b , dan s [1:] dan t [1:] , adalah LA.
Karena s [1:] memiliki panjang n - 1 , ini membuktikan perlunya dengan induksi.
Kode
sumber
C->Y, D->X
, dan itu bisa saja tidak disilangkan.MATL , 10
1217byteIni menggunakan pendekatan Dennis : mengurutkan pertama dan membandingkan karakter dalam posisi yang cocok.
Input adalah larik string, dengan format
{'CAT 'SAD'}
.Output adalah array dari nol dan satu. Hasilnya adalah kebenaran jika berisi semua (ini disetujui untuk menjadi kebenaran).
Menggunakan rilis saat ini (10.2.1) , yang lebih awal dari tantangan ini.
EDIT: Fungsi
Xl
telah diubah namanya menjadi|
versi bahasa yang lebih baru (dano
tidak lagi diperlukan). Tautan di bawah ini mencakup modifikasi tersebut.Cobalah online!
Penjelasan :
Pendekatan lama, yang menerima string sebagai input terpisah: 12 byte :
EDIT : kode dalam tautan telah dimodifikasi sesuai dengan perubahan dalam bahasa; lihat komentar di atas.
Cobalah online !
Penjelasan :
sumber
[1 0 1]
itu salah dalam MATL. Itu berguna.[0 0]
itu benar?C, 233 byte
Anda dapat mengujinya dengan menyimpannya
adj.h
lalu menggunakanadj.c
file ini :Kemudian kompilasi menggunakan
gcc adj.c -o adj
. Outputnya adalah:sumber
Python 2, 90 byte
Fungsi anonim yang sederhana, saya harus memiliki pemeriksaan yang terpisah untuk panjang karena
zip
hanya akan digabungkan. Ada fungsi serupa diitertools
(zip_longest
) yang akan mengisi string kosong, tapi itu akan cukup mahal.Menguji dengan
menghasilkan:
sumber
JavaScript (ES6), 86
90 94Edit 4 byte disimpan thx @Neil
Edit 2 4 byte simpan thx @ Mwr247
Catatan: pemeriksaan kedekatan pada sepasang huruf. Ambil pasangan sebagai basis 36 angka n , jika hurufnya sama, maka
n = a*36+a = a*37
. Jika ada perbedaan 1 makan = a*36+a+1 = a*37+1
ataun = a*36+a-1 = a*37-1
. Jadin % 37
harus 0, 1 atau 36. Dann%37%36
harus 0 atau 1.Catatan 2: tambah '0' digunakan untuk memastikan bahwa a dan b memiliki panjang yang sama. Itu lebih pendek
a.length==b.length
sumber
''
yang pertama'0'
karena tidak mengubah nilai parse.b
jenis Anda dengan referensi karakter:(a,b)=>[...[...a].sort(),0].every((x,i)=>parseInt(x+([...b].sort()[i]||0),36)%37%36<2)
= 86 byteJavaScript ES6,
117 byte116 byte111 byte,109 byteUji Kasus
Kredit
sumber
[...s]
bukans.split('')
?Pyth,
3731 byteCobalah secara online dengan semua kasus uji!
Dipotong 6 byte dengan menggunakan notasi pengurangan yang dipersingkat (
-F
alih-alih.U-bZ
)Solusi yang diinspirasi oleh Dennis
Pengiriman pertama ke codegolf!
Penjelasan
Kita dapat membagi ekspresi menjadi dua bagian, yang dibandingkan dengan
&
untuk menghasilkan hasilnya. Saya akan mencoba menjelaskan dengan menulis beberapa pseudo-PythonPertama-tama kita periksa bahwa panjang kedua kata itu sama
Kemudian, kami menerapkan metode Dennis:
Kami kemudian menggunakan
-
operator untuk memfilter semua elemen dari daftar yang tidak ada dalam[Z1
([0, 1]
), dan memeriksa bahwa hasilnya adalah daftar kosong denganqY
sumber
JavaScript (ES6), 87 byte
Menggunakan pemeriksaan rentang simetris nol-sentris dengan membaginya dengan nilai maks, kemudian memotong dengan bitwise "atau" (
|
). Lebih pendek daripada harus melakukan dua cek, atau satu denganMath.abs()
.sumber
Haskell,
6763 byteContoh penggunaan:
f "FREE" "GRRD"
->False
.Cara kerjanya (catatan:
f
sebagian bebas dari titik dan parameter keduab
tidak muncul dalam definisi):Sunting: @xnatau ditemukan 4 byte untuk disimpan. Terima kasih!
sumber
id x
bukan hanyax
? Atau bagaimana[pred x..succ x]
?\x->map($x)[pred,id,succ]
, jadiid
itu hanya sisa. Tentu saja..
mengalahkan semuanya. Terima kasih!C, 172 byte
Uji Kasus
sumber
PowerShell, 140 byte
Mungkin lebih pendek. Saat ini tidak bersaing dengan Python atau JavaScript, tetapi menggunakan pendekatan yang sedikit berbeda, jadi saya pikir saya akan mempostingnya.
Penjelasan
Kode ini benar-benar membingungkan bagi seseorang yang tidak fasih menggunakan PowerShell, jadi saya akan mencoba memecahnya menjadi bahasa Inggris sebaik mungkin ...
Kami mulai dengan mengambil input
param($a,$b)
seperti biasa.Seluruh sisa kode sebenarnya adalah satu pernyataan, dan dapat dipecah
(...)-and(...)
untuk menguji dua pernyataan Boolean dengan-and
operator.Paren kiri dapat dipecah
(... -eq ...)
untuk menguji kesetaraan dua objek. Dalam contoh ini, objek adalah.Count
s (yaitu, panjang) dari dua array char baru. Setiap paren bagian dalam($a=[char[]]$a|sort)
mengambil kata input asli, memasangnya kembali sebagai char-array, lalu mengurutkannya dan menyimpan kembali ke variabel yang sama. Kami melakukan itu untuk keduanya$a
dan$b
. Dengan demikian sisi kiri memverifikasi bahwa kata-kata yang dimasukkan memiliki panjang yang sama. Jika panjangnya tidak sama, setengah dari pernyataan Boolean luar ini akan gagal danFalse
akan menjadi output.Pindah ke sisi kanan, kami lagi menguji dua pernyataan Boolean dengan
(... -and ...)
. Sisi kiri menguji apakah sesuatu lebih besar dari atau sama dengan negatif 1 dengan-ge-1
. The sesuatu adalah zeroth-elemen array dibangun$c
, yang dibuat oleh:0..($a.count-1)
|%{...}
$a
dan mengurangi nilai ASCII dari karakter yang diindeks dalam$b
|sort
diedit dengan nilai numerikSisi lain dari pernyataan mengambil nilai maksimal
$c[-1]
array dan memastikan itu kurang dari atau sama dengan 1 dengan-le1
.Jadi, jika dua string input berdekatan,
$c
array akan menjadi seperti@(-1,-1,-1...0,0,0...1,1,1)
. Jadi elemen pertama adalah elemen-1
terakhir1
. Jika mereka tidak berdekatan, perbedaan nilai ASCII untuk pasangan tertentu akan menjadi< -1
atau> 1
, sehingga setengah dari tes Boolean luar akan gagal, danFalse
akan menjadi output.Hanya jika kedua belah pihak lulus akan
True
menjadi output, dan karenanya string adalah LA.sumber
Rust,
269264 byteDiperluas:
Kasus uji:
sumber
APL, 59 byte (karakter)
(61 jika kita harus menyediakan {and}, 63 dengan f ←)
Saya bukan APLer terhebat, tapi itu terlalu menyenangkan.
(0=+/2≤|¨∊-/{⎕av⍳⍵}¨(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵])∧=/⍴¨∊¨⍺⍵
=/⍴¨∊¨⍺⍵
Apakah inputnya sama panjang?∧
dan semua yang di bawah ini(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵]
urutkan kedua input dan bentuk menjadi sepanjang terpanjang dari keduanya (mereka membungkus jika Anda membuatnya lebih lama dari mereka)|¨∊-/{⎕av⍳⍵}
konversikan kedua vektor char menjadi vektor int dari nilai ascii mereka, lakukan pengurangan vektor dan absolut semua nilai0=+/2≤
jumlahkan nilai yang lebih besar dari atau sama dengan dua dan periksa apakah hasilnya sama dengan 0sumber
K (oK) , 27 byte
Larutan:
Cobalah online!
Contoh:
Penjelasan:
Pertama, urutkan setiap string, lalu pad dengan panjang yang sama, lalu ambil satu dari yang lain (nilai ASCII dari karakter), hasil kuadrat karena tidak ada built-in
abs
, ambil perbedaan maksimum dan periksa apakah kurang dari 2.sumber
J, 27 byte
ungolfed
dijelaskan
&(3&u:@/:~)
mengurutkan kedua argumen, dan mengonversinya menjadi angka ascii,:
menciptakan matriks 2 xn, di mana n adalah jumlah karakter dari argumen-/
kurangi satu baris dari yang lain, berikan daftar panjang n yang mewakili jarak karakter yang sesuai(2>|)
mengembalikan 1 jika nilai absolut dari jarak kurang dari 2, 0 sebaliknya*/
mengalikan semua0
s dan1
s bersama-sama: karenanya, hasil akhirnya adalah 1 jika semua pasangan karakter terkait berdekatan.Cobalah online!
sumber