Dua string adalah "setara Caesar" jika jarak (menghitung) antara karakter yang sesuai adalah sama. Ya, saya mengarang istilah ini. Ini sebuah contoh:
"Abc" dan "Cde" setara karena
distance from a-c == 2
distance from b-d == 2
distance from c-e == 2
Kapitalisasi tidak membuat perbedaan.
"Halo" dan "Dunia" tidak setara dengan Caesar karena
distance from h-w == 15
distance from e-o == 10
distance from l-r == 6
distance from l-l == 0
distance from o-d == 15
"Abcd" dan "Yzab" adalah setara dengan Caesar karena
distance from a-y = 24
distance from b-z = 24
distance from c-a = 24 (it wraps around)
distance from d-b = 24
Anda harus menulis program lengkap yang mengambil dua string dari STDIN, dan mencetak nilai kebenaran jika mereka setara dengan Caesar, dan nilai palsu jika tidak.
Input yang valid
Karena kapitalisasi tidak menjadi masalah, maka dapat diterima jika program Anda meminta input untuk semua huruf kecil, semua huruf besar, atau campuran apa pun yang Anda inginkan, selama ini ditentukan dalam jawaban Anda.
Input tidak akan memiliki spasi atau tanda baca.
Inputnya akan sama panjangnya.
Jawaban:
Pyth, 9 byte
Dua string diharapkan dalam huruf kecil, baris baru dipisahkan.
Demonstrasi.
Bagaimana itu bekerja:
.r
adalah fungsi terjemahan putar Pyth. Ini memetakan setiap elemen dalam argumen pertama dari kejadian pertama dalam argumen kedua ke entri berikutnya dalam argumen kedua. Dalam hal ini, argumen kedua adalahG
, huruf kecil, jadi ini setara dengan pergeseran Caesar dari 1.Menempatkan
=
di depan fungsi membuatnya di tempat. Dengan demikian,=.rzG
menetapkan pergeseran Caesar satuz
per satu kez
. Catatan yangz
diinisialisasi ke baris input pertama di Pyth.Ungkapan ini digunakan di dalam peta.
m=.rzGG
menerapkan transformasi ini hinggaz
26 kali, sekali untuk setiap elemenG
, dan menyimpan hasilnya dalam daftar. Ini memberikan daftar semua kemungkinan pergeseran Caesarz
.Terakhir,
}w
periksa apakah baris input berikutnya ada dalam daftar itu.sumber
CJam,
171211 byte1 byte disimpan oleh Dennis.
Uji di sini.
Mengharapkan string pertama menjadi huruf kecil dan yang kedua menjadi huruf besar. Cetakan
1
untuk string setara Caesar dan0
sebaliknya.Penjelasan
Alasan kami memerlukan string pertama dalam huruf kecil dan yang kedua dalam huruf besar adalah untuk memastikan bahwa perbedaan selalu positif. Kalau tidak, mengambil modulo mungkin mengembalikan sesuatu yang negatif dan tidak akan selalu unik, bahkan untuk string setara Caesar.
sumber
26f%
untuk menyimpan satu byte.!
saya tidak akan memiliki 0 atau 1 tetapi array kosong atau tidak kosong.Python2,
68677069 BytesPython3,
6766 BytesAgak sulit untuk ungolf, jadi jelaskan saja bagiannya:
zip(*raw_input().split())
mengambil input, membaginya menjadi daftar dua kata, dengan asumsi kata dipisahkan oleh spasi. Setelah itu setiap kata dilewatkan sebagai parameterzip
fungsi, dengan menggunakan*
operator. Thezip
fungsi akan membuat daftar surat-pasang, untuk huruf di posisi yang sama.(ord(y)-ord(x))%26for x,y in ...
Ini hanya mengubah daftar 2 huruf menjadi ekspresi generator dari jarak antara huruf-huruf itu.{...}
mengurangi ekspresi ini menjadi satu set, pada dasarnya membuang duplikatlen(...)<2
memeriksa apakah hanya ada satu item yang tersisa di set (atau 0 untuk string kosong), yang pada dasarnya berarti semua huruf memiliki jarak yang sama.print
menampilkan nilai ituBerkat xnor untuk mengingatkan saya
set(...)
dapat diganti dengan{...}
dan ruang sebelumnyafor
tidak diperlukan. Juga terima kasih kepada Josay untuk<=1
untuk<2
optimasi.sumber
<=1
menjadi '<2'.{...}
daripadaset((...))
. Kode Anda harus benar-benar mencetak hasilnya.lambda
untuk menghemat menulisprint
ataureturn
.for
; Python lexer membelah dengan benar26for
.APL (15)
Perlu huruf menjadi huruf besar, dan mencetak salah satu
1
atau0
, seperti:Penjelasan:
↑⍞⍞
: membaca dua baris dari keyboard, dan mengatur karakter dalam matriks N × 2.⎕A⍳
: untuk setiap karakter, temukan di posisi mana ia berada⎕A
(alfabet huruf besar).-⌿
: untuk setiap kolom, kurangi nilai kedua dari nilai pertama26|
: ambil mod-26 dari masing-masing angka tersebut.≢∪
: temukan jumlah nilai unik dalam daftar1=
: bandingkan dengan1
.sumber
J, 19 byte
Surat pada posisi yang sama harus memiliki huruf yang sama.
Setelah mengkonversi kedua string input ke representasi codepoint mereka dengan
&(3&u:)
kami membandingkan1
dengan panjang#
inti~.
dari modulo 2626|
dari perbedaan-
dua array. Nub akan menjadi1
jika semua jarak Caesar adalah sama.Pemakaian:
Cobalah online di sini.
sumber
Julia,
918783 bytePenjelasan + tidak dikumpulkan:
Ini mengambil keuntungan dari fakta bahwa string dalam Julia dapat diperlakukan sebagai array karakter dan bahwa operasi aritmatika dapat dilakukan pada nilai karakter. String input dapat memiliki campuran kapitalisasi yang Anda inginkan, selama kapitalisasi pada setiap posisi cocok dengan string.
sumber
C99,
92 byte dengan bug10192 byteCukup mudah; mengasumsikan kata-kata datang sebagai argumen pertama dan kedua, masing-masing. Disusun dengan
-std=c99
.sumber
Javascript ( ES7 Draft ), 87 byte
Membutuhkan input untuk kasus yang sama.
sumber
CJam, 13 byte
Ini membutuhkan karakter pertama dalam setiap kata yang dalam huruf besar, yang lain dalam huruf kecil.
Coba di sini . ( Firefox di sini .)
Sayang sekali varian APL tidak mendukung aritmatika karakter ...
Penjelasan
sumber
Perl, 80
Sunting : Pengoptimalan yang gagal telah dimasukkan ke dalam kode golf. Sekarang ini cocok dengan versi yang ungolfed. (Namun demikian, jumlah byte benar.)
Jalankan dengan Perl versi 5.10 (
perl -M5.10.0
atauperl -E …
) untuksay()
. Versi sedikit diperluas:Output kode
1
(benar dalam Perl) jika string adalah setara Caesar, dan string kosong (falsy dalam Perl) jika tidak. Jika interpretasi ini terlalu longgar, saya perlu menambahkan 2 byte untuksay$p+0
, yang dicetak1
atau0
.Huruf karakter harus sesuai dengan input.
sumber
-i
untuk mengambil string kedua, yang akan menyimpannya dalam variabel$^I
. Selain itu, menggunakan-E
alih-alih-e
saat menjalankan pada baris perintah akan membuat Andasay
gratis, sehingga Anda dapat menggunakannya tanpa menambahkan byte. Coba jalankan ini:perl -iteststring -E'say$^I'
Anda mungkin dapat mempersingkat ini dengan-i
triknya.-i
triknya rapi (dan saya tidak tahu itu!). Dalam hal ini saya tidak berpikir itu membantu karena$^I
lebih lama daripada<>
.-M5.10.0
toh tidak menghitung byte . (Tapi saya sebutkan-E
saklar di edit)Matlab,
4948 byteIni sangat cepat. Sayangnya mendapatkan string dari stdin cukup mahal.
Perhatikan bahwa, seperti kebanyakan jika tidak semua jawaban, peka huruf besar kecil.
EDIT: mencukur satu byte dengan mendefinisikan fungsi anonim!
sumber
Prolog, 56 byte
Tidak semua kombinasi kasus didukung.
pemakaian
Cobalah online di sini
sumber
C, 97 byte
sumber
d
dan mendeklarasikana
tipe parameter di luar seperti ini:d,r;main(int c,char**a){
→r;main(d,a)char**a;{
Scala, 57 byte
Sedikit lebih lama dari yang lain, dan pada dasarnya setara, tetapi dalam gaya bahasa yang berbeda!
Saya juga memiliki versi ini (56 byte):
Tapi saya tidak tahu apakah kerja x $ 1 itu kebetulan atau karena desain ...
sumber
x$1
kerjanya tanpax
pernah didefinisikan?Python 2, 80 byte
Membawa 2 string yang sama-mirip dari stdin yang dipisahkan oleh spasi:
Diuji pada kasus uji berikut:
sumber
Python 2 -
241237188147 BytesMengambil input sebagai string huruf kecil yang dilampirkan dalam tanda kutip, dipisahkan oleh ruang. Harus ada cara yang lebih baik ..
Tidak digabungkan (byte 260-ganjil)
sumber
"
tambahan 4 dalam input Anda.R, 83
84Cukup banyak sama dengan solusi lainnya. Ubah string menjadi vektor bilangan bulat. Mod selisih vektor dengan 26. Lakukan unik atas daftar sebagai memeriksa panjangnya adalah 1. Ia berharap case menjadi sama dalam karakter yang sesuai di setiap string.
Ia menunggu dua string dimasukkan
sumber
<2
daripada==1
.1
atau0
Matlab / Oktaf,
5352Semua input harus dari kasus yang sama.
Sayangnya, Matlab tidak begitu baik dengan input pengguna. Sebagai pegangan anonim, ini bisa hanya 35 byte:
Matlab memperlakukan karakter string sebagai vektor angka. Melakukan pengurangan membuat kita berbeda, dan
unique
mengubah vektor itu menjadi vektor yang hanya berisi nilai unik. Jika hanya ada satu angka, kata-kata tersebut setara caeser dan isscalar mengembalikan 1, jika tidak maka akan mengembalikan 0.sumber
bash,
7148Menggunakan program Unix "standar"
caesar(6)
.Versi baru (dengan banyak bantuan dari @DigitalTrauma):
1
untuk benar atau tidak untuk salah.Jika input melalui argumen baris perintah diizinkan, ini dapat dipersingkat menjadi 39 byte :
Versi lama untuk catatan:
sumber
read a b;seq -f"caesar %g <<<$a" 26|bash|grep $b
Hasilnya adalah dalam$?
variabel builtin, di mana 0 == SALAH dan 1 == BENAR, sesuai dengan semantik shell standar.seq -f | bash
bit. Hasilnya$?
tidak valid dengan membaca tantangan saya, tetapi sama seperti kode saya, milik Anda tidak menghasilkan apa pun yang salah dan sesuatu yang benar (kecuali dalam kasus garis batas dua string input kosong). Bagaimanapun, akan terasa seperti curang untuk menggunakan semua ini dalam jawaban saya, mungkin Anda harus mengirimkan milik Anda sendiri.[ 0 == 0 ] ; echo $?
dan[ 0 == 1 ] ; echo $?
> <> (Ikan) , 50 byte
Mengharapkan surat pada posisi yang sama memiliki kasus yang sama.
Penjelasan
i:3b*(?v
membaca kata pertama ke stack88+0.
memberikan lompatan perulangan~ri-&
menghapus~
ruang pemisah dari tumpukan, membalikkan tumpukanr
(huruf pertama akan berada di atas), membaca huruf pertama dari kata keduai
, menghitung offset dari huruf pertama kata pertama-
dan menyimpannya dalam register&
.l?!^i-&:&-2d*%0)?v
membaca setiap huruf berikutnya dari kata kedua yang mengurangkannya dari huruf yang sesuai dengan kata pertama yang berada di bagian atas tumpukan mengurangi offset yang&:&-
disimpan dalam register dan memeriksa apakah hasilnya 0 mod 262d*%
. Jika tidak mencetak 0 dan berakhir0n;
.c1.
memberikan lompatan perulangan.1n;
.sumber
KDB (Q), 35 byte
Penjelasan
Uji
sumber
Java 281
diperluas:
Saya bisa menghemat 14 byte jika saya menyingkirkan mengubah semuanya menjadi huruf besar, tapi saya merasa lebih lengkap untuk meninggalkannya.
sumber
Jelly , 5 byte
Cobalah online!
Menghasilkan bilangan bulat positif untuk setara, 0 sebaliknya
Bagaimana itu bekerja
sumber