Tantangan ini dibuat untuk merayakan bahasa esoteris pertamaku, Backhand !
Backhand adalah bahasa satu dimensi dengan aliran penunjuk non-linear. Pointer bergerak tiga langkah sekaligus, hanya menjalankan setiap instruksi ketiga.
Program 1..1..+..O..@
akan menambahkan 1 + 1 dan output 2 sebelum mengakhiri. Instruksi perantara dilewati, begitu 1<>1()+{}O[]@
juga program yang sama.
Ketika pointer akan keluar dari ujung kaset, itu sebaliknya membalikkan arah dan melangkah ke arah lain, begitu [email protected]+.
juga program yang sama. Perhatikan bahwa itu hanya menghitung instruksi akhir sekali. Ini memungkinkan kita untuk mengompres sebagian besar program linier ke bawah, seperti1O+1@
Tantangan Anda di sini adalah menulis program atau fungsi yang mengambil string, dan menampilkan instruksi yang akan dieksekusi jika program ditafsirkan seperti Backhand (Anda tidak perlu menangani instruksi Backhand yang sebenarnya). Anda hanya akan output sampai pointer mendarat pada karakter terakhir dari string (di mana titik eksekusi biasanya akan mundur).
Tapi tunggu , itu belum semuanya! Ketika program Anda sendiri diinterpretasikan dengan cara ini, kode yang dihasilkan harus menampilkan salah satu di bawah ini:
(Mostly) works
Turing complete
'Recreational'
(kutipan bisa berupa'
atau"
, tetapi tidak keduanya)Perfectly okay
Only a few bugs
Misalnya, jika kode sumber Anda code 2 backhand
, maka program ce cankb od2ahd
harus menampilkan salah satu dari frasa ini.
Kasus uji:
"1 1 + O @" -> "11+O@"
"1O+1@" -> "11+O@"
"HoreWll dlo!" -> "Hello World!"
"abcdefghijklmnopqrstuvwxyz" -> "adgjmpsvyxurolifcbehknqtwz"
"0123456789" -> "0369" (not "0369630369")
"@" -> "@"
"io" -> "io" (Cat program in Backhand)
"!?O" -> "!?O" (Outputs random bits forever in Backhand)
"---!---!" -> "-!-----!"
Dan program referensi yang ditulis, tentu saja, Backhand ( ini mungkin agak buggy Oke, saya pikir saya sudah memperbaikinya).
Aturan
- Celah Standar dilarang
- Input dari program pertama hanya akan berisi ASCII dan baris baru yang dapat dicetak (yaitu, byte
0x20
-0x7E
dan 0x0A) - Anda dapat memilih apakah program kedua Anda dikonversi dari yang pertama dengan byte atau karakter UTF-8.
- Program kedua:
- Case tidak masalah, jadi output Anda bisa jadi
pErFectLy OKay
jika Anda mau. - Berapapun spasi / spasi spasi awal (baris baru, tab, spasi) juga oke.
- Program kedua harus bahasa yang sama dengan yang pertama, meskipun tidak harus format yang sama (program / fungsi)
- Saya senang memasukkan saran dari komentar pada frasa tambahan (asalkan tidak terlalu pendek)
- Case tidak masalah, jadi output Anda bisa jadi
- Karena ini kode-golf , tujuan Anda adalah mendapatkan jawaban terpendek untuk bahasa Anda!
- Dalam dua minggu, saya akan memberikan hadiah 200 untuk jawaban Backhand terpendek.
sumber
"---!---!"
(atau string apa pun di mana karakter terakhir muncul lebih dari satu kali)Jawaban:
R , 187 byte
Cobalah online!
Satu ruang di bagian akhir dibutuhkan agar
\n
tidak pernah dicetak ketika program diterapkan pada dirinya sendiri.Penjelasan
Bagian 1:
Tidak Disatukan:
Bagian 2:
Fungsi menghasilkan ini ketika bekerja di seluruh program:
sumber
Python 2 ,
1631301271211159996 byteCobalah online!
Output:
sumber
Perl 6 ,
10186 byteWow, -25 byte terima kasih kepada nwellnhof dengan secara drastis memperbaiki program pertama
Cobalah online!
Saya berharap lebih banyak orang mengambil keuntungan dari rebound seperti ini. Program Backhanded adalah
Yang berkomentar saja
{"(Mostly) works"}
.sumber
05AB1E ,
43403837 byte-2 byte (40 → 38) berkat @Emigna .
Cobalah online . (PS: Alihkan bahasa dari 05AB1E (legacy) ke 05AB1E untuk test case
0123456789
. Versi legacy lebih cepat, tetapi ini menunjukkan hasil yang salah untuk input angka dengan angka nol di depan.)Program 'backhanded' akan menjadi:
Yang akan ditampilkan
perfectly okay
dalam huruf kecil penuh.Cobalah online.
Program dasar penjelasan:
Penjelasan program 'backhanded':
Langkah demi langkah hal berikut terjadi:
„ÃеÝ
: STACK menjadi["perfectly okay"]
[
: Mulai infinite loopN©
: STACK menjadi["perfectly okay", 0]
I
: STACK tetap["perfectly okay", 0]
karena tidak ada input#
: STACK menjadi["perfectly okay"]
, dan loop berlanjutN
: STACK menjadi["perfectly okay", 0]
#
: STACK menjadi["perfectly okay"]
, dan loop berlanjutN©
: STACK menjadi["perfectly okay", 1]
I
: STACK tetap["perfectly okay", 1]
karena tidak ada input#
: STACK menjadi["perfectly okay"]
, dan loop terputus karena1
(kebenaran)perfectly okay
Lihat langkah-langkah di sini dengan debugger di TIO diaktifkan.
Lihat ini ujung 05AB1E saya (bagian Cara menggunakan kamus? ) Untuk memahami mengapa
„€€Ã€„Ѐ€µ'€Ý
adalahthe pointed
,dm one
, danbeen
dan„ÃеÝ
adalahperfectly okay
.Versi 38-byte lama:
Cobalah online . (PS: Alihkan bahasa dari 05AB1E (legacy) ke 05AB1E untuk kasus uji
0123456789
dan@
. Versi legacy lebih cepat, tetapi ini menunjukkan hasil yang salah untuk input angka dengan nol di depan atau input char tunggal.)Program 'backhanded' akan menjadi:
(Di mana
q
keluar dari program dan membuat segala sesuatu yang lain tanpa operasi.)Cobalah online.
sumber
/
harus `\`?N>3*©
alih-alihXU
menghemat 2. Saya juga merasa harus ada cara melakukan semua pencetakan dalam loop, yang akan menghemat lebih banyak byte./
seharusnya\
.. Dan terima kasih untuk -2. Saya memang punya perasaan bisa bermain golf lebih jauh. Tampaknya terlalu lama untuk fungsionalitas dasar mencetak setiap nilai ke-3 termasuk bangkit kembali.[ûDN3*©è?®IgD#<ÖNĀ*#
tanpa if-else sebelumnya, yaitu 2 byte lebih pendek dari if-else dengan loop. Sayangnya, kita masih membutuhkanq
program backhand, jadi 38 byte juga . Tetapi saya merasa bahwa break pasti dapat ditingkatkan entah bagaimana mengingat input single-char, indeks 0, dan pembagian dengan panjang-1 pada saat yang sama ..Python 2 , 130 byte
Cobalah online!
sumber
JavaScript (ES6), 130 byte
Upaya awal. Tidak terlalu memuaskan.
Cobalah online!
Ketika kode diproses dengan sendirinya, karakter berikut ini diisolasi:
pemberian yang mana:
sumber
Jelly , 34 byte
Program penuh atau tautan monadik yang menerima daftar karakter yang dicetak atau dihasilkan (masing-masing).
Cobalah online! Atau lihat test-suite .
Kode Backhand-parsed adalah:
Program penuh atau tautan niladic yang mencetak atau menghasilkan (masing-masing) Turing selesai .
Bagaimana?
kode Backhand-parsed adalah:
sumber
Pesona Rise , 294 byte
Cobalah online!
Versi tidak terkompresi (dan hampir dapat dibaca):
Cobalah secara Online!
Ini ... sedekat yang aku bisa.
Menekannya lebih jauh akan membutuhkan mencari cara untuk menangani berbagai titik pertukaran bertukar tanpa membuatnya bertabrakan dengan hal-hal lain. Baris pertama (yang merupakan satu-satunya bagian yang harus dilewati sebagai input untuk dirinya sendiri) harus tetap terpisah: seluruh string tidak dapat masuk pada baris kedua tanpa menimbulkan masalah (
_
untuk spasi yang diperlukan):Itu
?
tidak dapat dipindahkan dari!
yang itu sendiri tidak dapat dipindahkan dari\
dan tidak ada pesan yang diizinkan yang memungkinkan salah satu dari ketiga karakter ini pada posisi ini.Alternatifnya adalah dengan menggunakan pengalihan aliran, tetapi itu mengarah ke masalah di baris bawah:
Karena kita harus menghindari loop switch di program utama.
Masalah Dikenal:
abcdefghijklmnopqrstuvwxyz
tetapi tidak keseluruhan sumbernya sendiri). Dan ada batasan terlepas dari berapa banyak penggabungan yang terjadi. Dapat menangani hingga 58 byte input apa adanya (selain itu, meningkatkan jumlah IP memerlukan mencari tahu cara membuatnya bergabung tanpa menggunakan lebih banyak ruang). Dapat memuat dua entri IP lagi pada loop-return line (di sebelah kanan padaU
on-line yang dimulai\y<<
pada versi yang tidak terkompresi, atau satu kiri pada baris di atasy<<
dalam versi yang dikompresi) meningkatkan panjang max input menjadi 78.1\ \ 1\ \ +\ \ O\ \ @
). Ini adalah batasan parsing input bahasa.0
s (seperti ketika diubah menjadi angka di tumpukan,0
hilang). Sekali lagi, keterbatasan penguraian input bahasa.Bagaimana itu bekerja
Masuk:
Loop utama (apa pun yang muncul stack didahului oleh dup):
@
. Benar: hentikan. (Hentikan perintah yang dijalankan)Lingkaran sekunder:
sumber