Cubically terlalu membosankan untuk secara manual menulis kode apa pun. Tantangan Anda adalah menerjemahkan teks ASCII menjadi kode sumber Cubically.
Secara kubik
Ini hanyalah perombakan cepat dari Cubically; yang repositori memiliki panduan yang lebih lengkap dan detail.
Secara kubik adalah esolang yang saya tulis beberapa waktu lalu, dirancang untuk menyakitkan untuk digunakan. Ini berisi dua buah memori, Rubik's Cube 3x3x3 dan register yang disebut "notepad".
Penyimpanan
Kubus Rubik internal diinisialisasi seperti ini:
000
000 top face
000
111222333444 left, front, right, and back faces, respectively
111222333444
111222333444
555
555 down face
555
Setelah melakukan putaran 90 ° searah jarum jam pada wajah kanan, kubus memori akan terlihat seperti ini:
002
002
002
111225333044
111225333044
111225333044
554
554
554
Perintah
Karakter non-integer menetapkan perintah default. Untuk setiap integer sebelum perintah default ditetapkan sekali lagi, perintah dilakukan dengan integer itu. Misalnya, x524y312
akan melakukan perintah x
dengan 5, lalu dengan 2, lalu dengan 4, kemudian melakukan perintah y
dengan 3, lalu dengan 1, lalu dengan 2.
Bilangan bulat yang digunakan perintah mewakili indeks wajah. Jadi x0
akan tampil x
di wajah UP (0-diindeks). x1
akan tampil x
di wajah KIRI (1-diindeks), dan sebagainya.
Melakukan perintah apa pun dengan 6
akan melakukan perintah itu pada nilai notepad. Melakukan perintah apa pun dengan bilangan bulat apa pun di atas 6 akan menghasilkan kesalahan.
Berikut adalah beberapa contoh perintah:
R1
- putar wajah KANAN 90 ° searah jarum jam sehingga kubus internal akan terlihat seperti contoh kedua di atasR11
- putar wajah KANAN searah jarum jam 90 ° dua kali, identik denganR2
+0
- tambahkan semua nilai wajah UP ke notepad+000
- tambahkan semua nilai wajah UP ke notepad tiga kali@6
- cetak wajah yang diindeks 6 tidak ada (memori) sebagai karakter%4
- cetak jumlah semua nilai pada wajah BACK sebagai integer
Daftar lengkap perintah dan sintaks tersedia di repositori .
Tantangan
Anda akan mengambil teks ASCII sebagai input dan mencetak program Cubically sebagai output.
Contoh (dicuri dari sini dan sini ):
Input -> Output
Hello, World! -> +53@6+1F2L2+0@6L2F2U3R3F1L1+2@66L3F3R1U1B3+0@6:4U1R1+00@6-000@6*0-4+000@6-00@6+2-000000@6-5+4000@6-00@6/0+00@6:0+0/0+00@6
1$2$3$4$5$6$7$8$9$10$ -> B1+2/2%6@4+00/0%6@4+00/1%6@4+21/1%6@4+30/0%6@4+22/1%6@4+22/1%6@4+40/1%6@4+52/1%6@4+42/1%6@4
Aturan
- Program Anda mungkin tidak mengandung kamus yang berisi terjemahan untuk 100 testcases.
- Program Anda harus selesai dalam waktu kurang dari 180 detik (tidak ada program kekerasan yang membutuhkan waktu berminggu-minggu).
- Program Anda harus menampilkan kode Cubically valid yang selesai dalam waktu kurang dari 180 detik.
- Program Anda akan mengambil input melalui input standar, kecuali jika Anda ingin mengacaukan dengan driver tes.
- Program Anda harus menampilkan kode yang tidak menghasilkan apa-apa selain input program Anda ketika dijalankan. ಠ_ಠ
Mencetak gol
Anda akan menguji program Anda dengan 100 pseudorandom string dengan panjang pseudorandom. (Skrip bash disediakan yang akan melakukan ini untuk Anda.) Berikut adalah skor Anda:
- Biarkan panjang program output menjadi o .
- Biarkan panjang string input menjadi l .
- Biarkan variabel r menjadi hasil dari o / l .
- Temukan rata-rata semua r : (r 1 + r 2 + r ... + r 100 ) / 100 .
Uji dengan skrip ini. Anda harus memodifikasinya seperti yang diperintahkan. Perhatikan bahwa program tidak memeriksa apakah outputnya kode Cubically valid. Jika skrip tidak berfungsi, saya dapat membantu. Ping saya di ruang obrolan Cubically .
sumber
@6
- mencetak jumlah wajah tanpa indeks 6 yang tidak ada (karakter)" menjadi lebih akurat? Apakah%4
juga jumlah? Apakah+
perintah menjumlahkan wajah lalu menambahkannya ke semua nilai atau ...?@6
/%6
langsung mencetak nilai notepad sebagai karakter / integer.@x
/%x
(di mana x adalah wajah yang ada) menambahkan semua nilai padax
wajah -indexed dan mencetak penjumlahan sebagai karakter / integer.+
menambahkan semua nilai pada wajah yang ditentukan ke register.Jawaban:
C ++ 11, Skor : 6,37
Cobalah online! (menghasilkan kode Cubically dari ASCII) dan (jalankan kode Cubically)
Penjelasan:
{0,9,18,27,36,45}
ke{6, 15, 27, 26, 19, 42}
. Apa yang membuat set jumlah wajah berguna adalah bahwa gcd adalah 1, jadi dengan identitas Bézout ada cara untuk membangun angkad
dari jumlah (atau perbedaan) dari angka-angka itu.ch
dan nilai notepad saat ini adalahn
, maka marid = ch - n
, kita dapat menjalankan perintah Cubically dalam bentuk+{digits from 0 to 5}-{digits from 0 to 5}
sehingga nilai notepad menjadich
. Kemudian jalankan%6
untuk mencetak nilai notepad.d
sebagai jumlah / perbedaan angka dalam set jumlah wajah, saya menggunakan algoritma Knapsack untuk semua angka dari 0 hingga 128. Misalnya, untukd=1
, program didapat27 - 26 = 1
, jadi ia mencetak+2-3
, yaitu27 - 26 = 1
. Yang bisa dilihat saat menjalankan program dengan inputabc
, output programsumber
@
secara implisit -@6
dapat disingkat menjadi@
semua kasus.Lua, Skor :
85.9113.5013.2012.709.419.329.839.669.129.068.03 (Rata-rata)Cobalah online!
Oke, saya rasa saya tidak bisa mengoptimalkan ini lagi.
Versi ini berulang melalui setiap karakter, menambahkan c% 9 (dengan c adalah nilai desimal karakter) dengan melakukan
:5+2/1
, lalu menambahkan bagian-bagian yang dapat dibagi dengan 9 dengan menambahkan nilai wajah itu. Misalnya::2/1+551@
untuk mencetak "e", di mana:2/1
menambahkan 2,+551
menambahkan 99 (9 * (5 + 5 + 1), atau 9 * 11), dan@
mencetak hasilnya. Input dibaca denganio.read()
.Optimalisasi mencakup penambahan / pengurangan langsung setelah pencetakan jika perbedaan antara karakter adalah kelipatan dari 9, membagi nilai saat ini jika memungkinkan daripada pengaturan c% 9 dari awal, dan mengulangi karakter dengan mencetak nilai saat ini lagi daripada menghitung ulang. Selain itu, saya telah menerapkan metode Kamil untuk langsung mencetak wajah apa pun yang sudah berisi nilai target, dan saran MD XF untuk tidak menggunakan
:
di awal, tetapi sebaliknya hanya mulai dengan a+
.sumber
local inp = io.read()
menjadilocal inp = io.read("*all")
. Itu memperbaiki masalah.:5+124
, Anda hanya bisa menulis+5124
, yang mungkin akan mendapatkan skor sedikit jika Anda mengubah dengan benar.Secara kubik , Skor : 86,98
Cobalah online!
Ternyata, yang Anda butuhkan adalah loop kondisional, wajah sama dengan 1, dan perilaku End-Of-Input yang konsisten.
Menambahkan / mengurangi wajah LEFT adalah untuk mendapatkan loop untuk mengakhiri ketika EOF dibaca.
sumber
@
secara implisit -@6
dapat disingkat menjadi@
semua kasus.C # (.NET Core) , Skor:
129.9811.7310.829.6210.3310.3210,20-1.2 poin dari saran MD XF untuk digunakan
@6666...
alih-alih@6@6@6@6...
untuk pengulangan karakter, dan urutan inisialisasi superiorCobalah online!
Versi terbaru saya sebenarnya melakukan manipulasi kubus! Yay!
Yang pertama
Console.Write
ada manipulasi tetap yang berhasil dilakukan MD XF yang menciptakan kubus ini:Arti penting dari kubus ini adalah bahwa salah satu sisinya memiliki jumlah 1, yang memungkinkan manipulasi Notepad pada skala yang lebih kecil dari kelipatan sembilan, dan khususnya menyederhanakan gerakan relatif daripada perlu mulai dari nol setiap karakter; dalam algoritme ini, penjumlahan dan pengurangan digunakan untuk mengambil jalur terpendek antar karakter.
Inisialisasi versi MD XF menyebabkan sisi 2 memiliki jumlah 14, yang menghemat banyak byte output untuk jarak ASCII antara 14 dan 20.
Sekarang dapat menangani input dengan baris baru internal, Console.Read () mendapatkan karakter individual hingga Akhir File; lihat tautan TIO yang seharusnya memiliki input
Mencukur beberapa pecahan suatu titik dengan segera mengeluarkan karakter jika nilai ASCII-nya kebetulan sudah ada di satu sisi.
Test Script milik MDXF
Pengajuan sebelumnya di sini dan penjelasannya:
Ini agak membosankan, tetapi sejauh yang saya tahu itu berhasil. Memang saya hanya mencoba
Hello, World!
tetapi saya menjalankan output di TIO Cubically interpreter dan mengeluarkan "Hello, World!" jadi saya menganggap itu berhasil.Daripada benar-benar memanipulasi kubus sama sekali, notepad hanya bertambah dengan jumlah dari 1 wajah (9) berulang kali hingga memiliki nilai yang tepat untuk setiap karakter, kemudian mencetaknya.
sumber