Ikan tercinta yang berenang melalui kode > <> (bahasa pemrograman esoterik) telah dikeluarkan dari lingkungan alaminya. Perubahan ini telah membuatnya tidak mampu bergerak seperti biasanya: apa yang dulunya adalah gerakan toroidal telah dibatasi pada gerakan kiri-ke-kanan yang sederhana. Tetapi program <> masih ditulis seolah-olah ikan mampu bergerak melalui mereka. Adalah tugas Anda, programmer terkasih, untuk menulis sebuah program untuk membuat linierisasi program>>. Dan lakukan dalam byte sesedikit mungkin; ikan tidak memiliki ingatan yang sangat besar.
Gerakan di> <>
Dalam> <>, gerakan adalah toroidal dan satu karakter pada satu waktu. Ini berarti bahwa ikan (penunjuk) dapat "membungkus" dari ujung garis kembali ke awal. Di> <>, ikan juga mampu bergerak dari atas ke bawah, dari bawah ke atas, dan dari kanan ke kiri, berbeda dengan cara kebanyakan penunjuk bergerak. Jadi pola pergerakan ini akan valid:
>>>^ >>>v
>>>^ v
dan itu akan berakhir pada loop tak terbatas (looping kembali ke garis atas setelah melewati bagian bawah tanpa batas).
Ikan bergerak dalam kisi panjang sama dengan max (panjang baris) dan tinggi sama dengan jumlah baris.
Bagaimana Anda mengetahui ke arah mana ikan bergerak? Perintah-perintah ini mengubah vektor arah gerakan (mis. (-1,0)
Berarti kanan-ke-kiri):
Command | Direction Change
---------------------------
> | (1,0) (default)
< | (-1,0)
^ | (0,1)
v | (0,-1)
/ | (x,y) -> (y,x)
\ | (x,y) -> (-y,-x)
| | (x,y) -> (-x,y)
_ | (x,y) -> (x,-y)
# | (x,y) -> (-x,-y)
; | (0,0)
Sebagaimana dicatat, ikan mulai bergerak dari kiri ke kanan, yaitu dengan vektor arah (1,0)
. Ikan mulai menguraikan perintah mulai dengan perintah pertama yang dilihatnya dan mengubah arahnya jika perintah cocok dengan salah satu pengubah arah yang disebutkan di atas.
Ikan berhenti bergerak ketika melihat a ;
dan mengakhiri program.
Memasukkan
Input akan menjadi program yang valid (misalnya tidak berulang) yang diberikan melalui STDIN. Anda juga dapat membaca file jika Anda mau. Garis-garis dari setiap program tidak akan harus memiliki panjang yang sama.
Input diberikan sebagai string, dengan baris baru memisahkan setiap baris dalam program.
Program tidak akan berulang, yang juga berarti mereka akan selalu berakhir dengan a ;
.
Keluaran
Keluaran akan menjadi program yang dilinearisasi. Artinya, Anda harus mengembalikan semua karakter (termasuk pengubah arah) yang akan dilihat ikan jika menjalankan program "secara normal." Ini semua karakter dalam jalurnya ke;
.
Jika input memiliki garis dengan panjang yang tidak sama dan ikan pada akhirnya bergerak sepanjang garis yang lebih pendek dari panjang garis terpanjang, Anda harus memperlakukan itu seolah-olah ikan bergerak di atas ruang (lihat kasus uji).
Mereka yang akrab dengan> <> akan tahu bahwa pengubah arah bukan satu-satunya cara untuk melakukan gerakan di dalamnya, tetapi demi kesederhanaan memperlakukan input seolah-olah mereka adalah satu - satunya cara untuk mempengaruhi gerakan.
Aturan
- Celah standar berlaku
- Anda dapat menulis program atau fungsi lengkap
- Input diberikan melalui STDIN atau file sebagai string berisi baris program yang dipisahkan oleh baris baru (
\n
)- Anda dapat mengambil input secara berbeda, sesuai alasan (jangan ragu untuk bertanya kepada saya apakah Anda memiliki jenis input tertentu dalam pikiran). Anda mungkin tidak mengisi input dengan spasi sehingga panjang garis cocok.
- Merujuk ini meta posting tentang masukan fleksibel. Seperti halnya postingan, konsensus umum harus sefleksibel mungkin dengan alasan.
- Output adalah string tunggal melalui STDOUT atau dikembalikan oleh fungsi (tergantung pada apa yang Anda pilih untuk dilakukan, lihat Aturan 2)
Uji Kasus
v >v
>abcv//;
gfed<^ih
v>abcv<defghi^//>v;
v >v
>abcv//;
gfed<^
v>abcv<defg ^//>v;
abcdef;
abcdef;
abcd|;
abcd|dcba;
abcd#;
abcd#dcba;
abcd\;
_
abcd\_\dcba;
^;
>abcde/
^jihg<
^ >abcde/ <ghij^a;
;
;
Jawaban:
Röda ,
405393392391371366361236234232230223200 byteCobalah online!
Periksa output!
Penjelasan (kedaluwarsa)
Suntingan
%
alih-alih memeriksa apakah x atau y melebihi batas, yang membuka jalan bagi 2 lebih!`\`
sebagai ganti"\\"
c=""
ke baris kedua dan kemudian menghapus baris baru yang mengikutinyawhile
(terima kasih kepada @fergusq untuk mengetahui hal itu)a=X
keluar dari pernyataan if+1
pada akhirindexOf
dan kode yang direstrukturisasi untuk menghemat 2 byteuntil[c=";"]
bukanwhile[c!=";"]
l.=[" "]*L
sumber
x=((x+X)%#l)
alih-alihx+=X
. Sayangnya,(-1)%#l
masih kembali-1
.y
terlalu:y=y%#f
.key
sebagai ganticmp
dan{...}while[...]
bukan gunakanwhile[...]do ... done
.Python 2,
262243237235234233231221219218217 byteMengambil input sebagai
['<line_1>', '<line_2>', ...]
Cobalah secara Online!
-19 byte terima kasih kepada @math_junkie
-6 byte terima kasih kepada @ThisGuy
-2 byte dengan mengekstraksi
max(map(L,i))
ke variabel (karena secara teori digunakan dua kali).-1 byte dengan mengurangi berapa kali
i[y][x]
muncul.-1 byte dengan menggunakan
'\x00'
jadi saya tidak perlu melakukan[1:]
bagiano[1:]
dalam output-2 byte dengan menggunakan
\0
bukannya\x00
-10 byte terima kasih kepada @KritixiLithos untuk menyadari bahwa saya dapat memuat sebanyak yang saya inginkan di sisi kanan karena ekstra akan diabaikan
(tidak ada perubahan byte) memperbaiki bug karena variabel yang diekstraksi berada di luar loop
-2 byte karena sekarang saya hanya menggunakan
len
2 kali jadi menetapkan ulang dibutuhkan 2 byte tambahan-2 byte dengan menggunakan
while';'not in o
alih-alihwhile o[-1]!=';'
, dan menggunakano=''
bukano='\0'
. Ini tidak hanya menghemat 2 byte tetapi juga menghilangkan null byte terkemuka yang secara teknis tidak benar-benar valid.Penjelasan
sumber
try
sejakfind
kembali-1
jika tidak ditemukan: TIOlen
untuk variabel misalnyaL
untuk menyimpan 3 byte dan 4 lainnya dengan mengubah tugas multiline0
menjadi 1 barisx=y=k=0
.Ruby,
274200187183Memotong beberapa karakter lagi dengan menjatuhkan array momentum,
d
,.Saya cukup bangga dengan yang ini. Ini sangat menyenangkan! Dibutuhkan dalam array string dan mengembalikan string yang tepat.
Berkomentar di bawah.
sumber
PHP 7,
291260 bytesumber
JavaScript,
242236235231220 byteCobalah online!
sumber