Tugas ini agak sederhana, dan menggunakan tiga karakter "operator" yang berbeda. Tugas Anda adalah, diberikan urutan sederhana huruf, melakukan tugas berikut untuk mengkodekan menggunakan <
, >
, *
. Anda dapat memilih untuk menggunakan huruf besar atau kecil, Anda tidak harus menangani keduanya.
Penjelasan Cipher
Sandi sederhana, Anda menggunakan operasi kenaikan dan penurunan untuk melintasi dari huruf 1 ke huruf akhir, dengan *
menjadi fungsi "kirim" Anda. Operator untuk "kenaikan" akan >
dan "penurunan" akan <
.
Contoh menggunakan kata adbc
:
- Mulailah dengan huruf pertama dari kata itu, tuliskan huruf itu.
a
- Selanjutnya, gunakan
>
dan<
(seperti brainfuck) untuk "menavigasi" surat saat ini ke yang berikutnya.a>
akan menghasilkan 'membesarkan'a
oleh 1 ke surat itub
.a<
akan menghasilkanz
karena Anda menurunkan surat (itu membungkus, Anda harus selalu memilih arah yang menghasilkan jumlah operasi TERAKHIR). - Setelah mengeluarkan kombinasi minimal yang benar dari
<
dan>
keluaran a*
untuk menyatakan bahwa kami telah mencapai huruf berikutnya.
Langkah-langkah untuk menyandikan adbc
adalah:
a # a
a>>>* # ad
a>>>*<<* # adb
a>>>*<<*>* # adbc
Contohnya
Langkah-langkah untuk menyandikan aza
adalah:
a # a
a<* # az
a<*>* # aza
Lebih banyak contoh:
"abcdef" = "a>*>*>*>*>*"
"zyaf" = "z<*>>*>>>>>*"
"zzzzzz" = "z*****"
"z" = "z"
"zm" = "z<<<<<<<<<<<<<*" or "z>>>>>>>>>>>>>*" (equidistant)
"zl" = "z>>>>>>>>>>>>*"
"alphabet" = "a>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*"
"banana" = "b<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*" OR "b<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*"
"abcdefghijklmnopqrstuvwxyz" = "a>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*"
"abcdefz" = "a>*>*>*>*>*<<<<<<*"
Aturan
- Kami sedang meng - encode bukan decoding, jadi jangan mengacaukannya.
- Anda mungkin menganggap pesan itu akan berisi surat
[A-Z]
atau[a-z]
, pilihan Anda. - Anda dapat menggunakan karakter non-huruf / numerik / cadangan untuk menunjukkan
*
(EG$
). - Anda harus memiliki akhir
*
, itu tidak tersirat pada pengulangan. - Anda mungkin menganggap tidak ada string kosong, tetapi satu karakter dimungkinkan.
- Jika sama jauhnya dari huruf berikutnya, Anda dapat memilih arah.
- Ini adalah kode-golf , kemenangan byte-count terendah.
Tolong jelaskan jawaban Anda, ini membantu orang lain belajar dengan cara ini.
abcdefghijklmnopqrstuvwxyz
dan bukan inputnya sendiri?zl
harus digunakan>
.alphabet
menurut sayaa>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*
danzl
seharusnyaz>>>>>>>>>>>>*
dan untukbanana
solusi kedua adab<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*
zm
. @ jorg tangkapan bagus, memperbaiki semuanya, adalah upaya manual.Jawaban:
Jelly , 17 byte
Menggunakan karakter spasi sebagai ganti
*
(spasi⁶
,, atau baris baru⁷
,, menyimpan satu byte lebih”*
).Pekerjaan dengan baik huruf besar-satunya atau masukan huruf kecil saja.
Cobalah online! atau lihat test suite (di mana ruang-ruang tersebut diganti dengan
*
untuk memudahkan membaca).Bagaimana?
sumber
8086 kode mesin,
70 6867 byteBagaimana itu bekerja:
sumber
Python 3 , 87 byte
Cobalah online!
Bekerja dengan huruf kecil atau besar.
Program membangun string keluaran
r
saat ia mengulangi karakter dalam string input. Ini menyimpan karakter sebelumnya sebagaip
, dan menghitung operasi tambahan untuk mendapatkan darip
ke karakter baruc
.Interval antara karakter adalah
ord(c)-ord(p)
, dan(ord(c)-ord(p)-13)%26-13
membawanya modulo 26 ke interval[-13..12]
. Hasil negatif berarti lebih pendek untuk mundur, dan hasil positif berarti naik. Ini perlu dikonversi ke string>
atau<
tergantung pada tanda. Daripada menggunakanabs
atau kondisional, kami mengambil keuntungan dari penggandaan string Pythons*n
memberikan string kosong ketikan
negatif. Dalam ungkapan'<'*-d+'>'*d
, bagian yang salah ditandatangani tidak berkontribusi.Keadaan awal ditangani dengan memisahkan input menjadi karakter pertama dan sisanya dengan membongkar Python 3
r,*s=input()
. Karakter awal digunakan untuk mulai membangun string, serta karakter awal "sebelumnya".Terima kasih kepada OVS untuk menyarankan beralih ke Python 3 untuk melakukan membongkar ini.
sumber
Python 3 ,
11093 byteCobalah online!
sumber
JavaScript (ES6),
118109107 byteString input tidak peka huruf besar-kecil.
Bagaimana itu bekerja
Tidak seperti Python, operator modulo JS mengembalikan nomor yang memiliki tanda sama dengan dividen daripada pembagi. Juga,
repeat()
metode JS melempar kesalahan ketika diberi angka negatif, daripada mengembalikan string kosong (dan itu secara signifikan lebih lama dari pada yang sederhana*
).Ini adalah perilaku yang agak tidak menguntungkan untuk tantangan ini. Jadi, sebaiknya kita mengidentifikasi dalam kasus yang tepat kita daripada mengandalkan trik matematika. (Yang tidak berarti bahwa trik semacam itu tidak ada, tetapi aku gagal menemukannya.)
Di bawah ini adalah tabel yang menggambarkan 4 kasus yang memungkinkan, di mana
d
jarak yang ditandatangani antara karakter saat ini dan yang sebelumnya:Uji kasus
Tampilkan cuplikan kode
sumber
PHP, 127 Bytes
Testcases
PHP, 137 Bytes
Testcases
sumber
JavaScript (ES6),
111103 byteAwalnya versi yang mengambil 111 byte sebelum saya mengadaptasi trik pengaturan Arnauld @
n
saat komputasip
, saya pikir mungkin ada trik lain menggunakans
bukann
tapi sudah terlambat jadi saya tidak akan repot .:sumber
Haskell (lambdabot),
161153 byteCobalah online!
Penjelasan:
sumber
EXCEL VBA 130 byte
Jalankan dari jendela Excel VBA Immediate.
Penjelasan:
Sederhana untuk loop yang dengan fungsi String untuk mengulangi ">" atau "<" n berapa kali n adalah perbedaan ascii antara string karakter i dan i + 1.
sumber
Java 7-, 232 byte
Cukup banyak solusi sepele. Tidak dikumpulkan dan berkomentar:
sumber
C, 170 byte
Detil Live
sumber
#define x q<14?q:q+26 e(c){putchar(c);}i,q;m(a,b){q=b-a;i=q?(a>b?x:-x):0;while(i>0)e('>'),i--;while(i<0)e('<'),i++;}f(char*l){e(*l);while(*(l+1))m(*l,*(l+1)),e('*'),l++;}
JavaScript (ES6),
140128129111113 byteSaya menempuh rute berbeda ke solusi JS lainnya tetapi tidak berhasil dengan baik - inilah yang saya miliki sejauh ini:
Asli, 131 byte
Tampilkan cuplikan kode
sumber
([x,...s])=>x+s.map(...)
menghemat 12 byte. Perhatikan bahwa Anda juga harus menambahkan karakter cetak hingga akhir. Saya sarankan menggunakan nomor, yang hanya akan dikenakan biaya 2 byte`1`+1
bukan`*`
.join
akan menghasilkan output yang tidak valid untuk input satu huruf. Namun, memindahkan karakter cetak dalammap
metode hanya biaya 1 byte.([x,...s])=>x+s.map(y=>'<><>'[r=(d=y[c='charCodeAt']()-x[c](x=y))/13+2|0].repeat([d+26,-d,d,26-d][r])+0).join``
for 111 bytesreduce
solusi, tapi itu ternyata 115 byte.C ++,
210190 byteCoba Pertama Saya Di Golf!
k menyimpan yang mana dari <,> atau * untuk dicetak. Pada awalnya ia hanya mencetak elemen pertama dari array kemudian menjalankan satu loop untuk dari pertama ke elemen terakhir dari array. j menyimpan elemen sebelumnya dan kemudian dengan membandingkan jika j lebih dekat ke * a dengan <atau> set k ke <,> masing-masing dan kemudian cetak k kemudian jalankan loop ini sampai j menjadi sama dengan p. Kemudian setelah setiap akhir cetak lingkaran kedua *.
sumber
*p!=0
bisa diganti dengan*p
. Saya cukup yakin ruang dalamchar *a
juga tidak perlu. Anda juga perlu melakukannya#include <iostream>
danusing namespace std;
(walaupun saya pikir mungkin lebih murah untuk hanya menambahkanstd::
) untuk membuat ini jawaban yang lengkap.std::
atauusing namespace std;
Anda mungkin juga perlu#include <iostream>
dalam hitungan byte Anda.05AB1E , 17 byte
Cobalah online!
Penjelasan
Penggunaan
>
,<
dan<space>
untuk menunjukkan kenaikan , penurunan , kirimsumber
Haskell ,
167168126 byteSekarang menggunakan solusi aritmatika xnor. Panggil dengan
e str
manastr :: String
string yang akan dikodekan.sumber
Haskell , 109 byte
Cobalah online! Menggunakan pendekatan xnor . Panggil dengan
f "somestring"
.sumber