Tujuan dari tantangan ini adalah untuk menulis sebuah program yang memenuhi persyaratan berikut:
Program ini bukan palindromik, atau pada dasarnya palindromik (artinya memungkinkan untuk menghapus karakter untuk menjadikannya palindrom tanpa mengubah efek program).
Program ini bukan involusi (artinya tidak menghasilkan input aslinya ketika dijalankan pada outputnya)
Program polaritas terbalik adalah kebalikan dari program normal; jadi ketika program terbalik dijalankan pada output dari program normal, ia mengembalikan input aslinya.
Apa yang dimaksud dengan polaritas terbalik ? Ya, itu berbeda antara bahasa.
- Bagi sebagian besar non-esolang, ini berarti membalik urutan sub-operasi dalam satu operasi, membalik urutan argumen, dan membalikkan isi daftar / array / tupel / kamus kode keras / stacks / tumpukan / antrian / dll, juga sebagai membalik urutan blok kode dan garis yang berdiri sendiri (tetapi bukan garis dalam blok)
Contoh:
Haskell :
x`mod`y
-> y`mod`x
; zipWith ((*3).(+)) [1,2,3] [4,5,6]
->zipWith ((+).(*3)) [6,5,4] [3,2,1]
Python : 2**3
-> 3**2
; for x,y in [(1,2),(3,4),(5,6)]
->for y,x in [(6,5),(4,3),(2,1)]
Untuk bahasa yang memiliki fungsi 1-karakter (seperti Pyth, APL), cukup balikkan string instruksi
Untuk esolang 1 dimensi seperti BF, balikkan instruksi atau bertukar polaritas; swap polaritas adalah
[]
->{}
,+
->-
,-
->+
,>
-><
,<
->>
,.
->,
dan,
->.
(tetapi tidak keduanya)Untuk esolang 2 dimensi seperti Befunge, Anda dapat melakukan refleksi melintasi sumbu x atau y atau diagonal, memutar 180 derajat, atau melakukan kombinasi refleksi dan rotasi
Operasi komutatif diizinkan, tetapi operasi palindromik tidak: 2*x
baik-baik saja, tetapi x+x
buruk. Definisi pembalikan polaritas cukup longgar, tetapi gunakan penilaian Anda untuk apa yang masuk akal; objeknya bukan untuk menemukan celah yang paling pintar, tetapi untuk menemukan solusi yang paling pintar.
Ini adalah kontes popularitas, jadi celah yang sangat cerdas mungkin populer, tetapi cobalah untuk tetap dalam semangat tantangan ini. Pemenang akan diumumkan setelah setidaknya ada 10 solusi dengan setidaknya 1 upvote, dan setidaknya ada satu solusi dengan lebih banyak upvotes daripada ada pengiriman dengan setidaknya 1 upvote; atau dalam 1 bulan, mana yang lebih dulu. Ini adalah tantangan pertama saya, jadi cobalah bersikap adil dan memberi saya umpan balik yang konstruktif, tetapi juga beri tahu saya apakah ini adalah tantangan yang tidak masuk akal atau dengan cara apa pun dikategorikan salah atau ambigu. Jika Anda memiliki pertanyaan tentang bahasa yang tidak cocok dengan lubang pigeon mana pun yang telah saya sebutkan di sini, beri komentar, dan saya akan tunduk pada keinginan komunitas jika ada protes keras untuk klarifikasi atau perubahan peraturan tertentu.
MEMPERBARUI
Sudah tepat 1 bulan sejak kontes ini dimulai (saya kebetulan memeriksanya secara kebetulan, tidak tahu bahwa saya sebenarnya tepat waktu). Karena ini adalah kontes popularitas, pemenangnya ( kalah telak) adalah Pietu1998-Befunge . Meskipun komponen bawah (pembalik teks dan alfabet mundur) keduanya adalah involusi, encoder / decoder tidak, jadi tidak ada masalah di sana. Poin bonus (dalam pikiran saya) untuk mengelola menulis "BEFUNGE" di tengah. Saya pribadi menyukai solusi Zgarb's Theseus yang baru , karena bahasanya terlihat keren (jika dibatasi). Terima kasih kepada semua orang untuk berpartisipasi, dan sementara pemenang telah dipilih, saya meninggalkan kontes ini sepenuhnya terbuka, dan menyambut kiriman yang akan datang
sumber
()
palindromik? Secara teknis, kebalikannya)(
.Jawaban:
Dibalik
Wah, itu pekerjaan, bahkan dengan editor yang saya buat untuk tantangan ini. Inilah yang saya dapatkan, blok 11x12 yang bagus:
Itu melakukan beberapa hal, sayangnya hanya untuk huruf kecil.
Apa yang dilakukannya
Ketika dijalankan secara normal, ia melakukan cipher Caesar pada input.
Ketika dibalik secara horizontal, itu membalik kata sandi. Ini adalah persyaratan untuk tantangan, tetapi tidak berakhir di sini.
Ketika dibalik secara vertikal , ia memasukkan input dengan alfabet terbalik. Ini dapat dianggap sebagai pendekatan yang berlawanan dengan sandi Caesar.
Akhirnya, ketika diputar 180 derajat, itu membalikkan input. Saya merasa itu harus kebalikan dari sesuatu (petunjuk: input).
Bagaimana itu bekerja
Blok ini pada dasarnya terdiri dari empat algoritma semi-tumpang tindih.
Encoder cipher Caesar
Decoder cipher Caesar (dibalik secara horizontal)
Membalik alfabet sandi (dibalik secara vertikal)
Pembalik teks (diputar 180 derajat)
sumber
Brainfuck, 5
Mungkin untuk pertama kalinya, Brainfuck menghasilkan jawaban yang kompetitif pada panjang kode. Malu itu bukan pertanyaan kode-golf.
Memasukkan byte (karakter), menambahkannya, dan menampilkan hasilnya. Koma di akhir menunggu input lain, yang jika diberikan akan diabaikan. Tidak ada dalam spesifikasi tentang penghentian yang tepat: -) *
* (atau tentang melakukan sesuatu yang bermanfaat dengan semua kode di kedua arah)
Hasil khas (karakter kedua jika diberikan diabaikan).
Maju:
B
->C
Balikkan:
B
->A
atauC
->B
sumber
Marbelous
Ini adalah yang sederhana untuk memulai kita. Bunyinya satu karakter dari STDIN, menambah dan mencetaknya.
Jika kita memutar ini 180 ° (tanpa menukar tanda kurung), atau mirror di sumbu x, kita dapatkan
yang membaca byte dari STDIN dan menurunkannya.
Anda bisa mengujinya di sini .
Saya mungkin melihat beberapa program Marbelous yang lebih rumit, tapi saya yakin es1024 akan mengalahkan saya karenanya. ;)
Penjelasan
Ini
00
adalah marmer dengan nilai 0 (yang arbitrer). The]]
perangkat membaca byte dari STDIN - yaitu, jika marmer jatuh melalui mereka, nilai marmer ini diubah menjadi membaca byte. Perangkat++
dan--
hanya menambah atau mengurangi nilai marmer (mod 256) dan biarkan jatuh. Ketika marmer jatuh dari papan, byte ditulis ke STDOUT.Oleh karena itu, kedua perangkat di atas diabaikan begitu saja karena aliran kontrol tidak pernah mencapai mereka.
sumber
}0
dan menggunakannya sebagai subboard?}0
sebagai input baris perintah tepatnya.Marbelous
Dewan ini mengambil satu argumen (
x
) dan mengembalikan(101 * x) mod 256
.Mencerminkan sel di sepanjang sumbu y akan menghasilkan papan yang mengambil satu argumen (
y
) dan kembali(101 * y + 8 * y) mod 256
, yang merupakan kebalikan dari papan pertama.Uji ini di sini . Papan silinder dan perpustakaan Sertakan keduanya harus diperiksa.
Contoh input / output :
Harap dicatat bahwa Marbelous hanya memungkinkan untuk lewat bilangan bulat positif sebagai argumen, dan bilangan bulat ini diteruskan ke dalam program modulo 256 oleh penerjemah.
101
dipilih karena dua alasan: ini adalah yang utama (dan setiap input yang mungkin untuk program ini menghasilkan output yang unik), dan operasi terbalik yang terlibat109
, yang berjarak 8 dari101
.Penjelasan singkat
Kolom yang berisi sel-sel (dari atas ke bawah)
@0 >0 -- 65 @0
menjalankan hal yang sama di kedua papan, dan loop101
kali sebelum menuju ke kanan. Di kedua sisi>0
cabang ada sinkronisasi yang berbeda; mana yang dipilih tergantung pada apakah papan dicerminkan atau tidak.Di setiap sisi, sinkron dengan loop pusat, input berulang kali dijumlahkan, sehingga diperoleh
101*x mod 256
. Pada papan terbalik, dua salinan input juga sedikit digeser dua kali ke kiri (input * 4
), lalu dijumlahkan dan dibiarkan dalam sinkronisasi.Setelah loop tengah selesai, kelereng yang diringkas dikirim untuk dicetak, yang ada di sisi papan (kiri untuk papan asli, tepat untuk cermin). Setelah mencetak,
!!
sel tercapai, mengakhiri papan. Perhatikan bahwa loop yang memberi101 * x
terus berjalan dengan sendirinya sampai papan diakhiri.Dp
cukup cetak hasilnya sebagai angka desimal.sumber
Theseus
Ini mungkin dianggap sebagai celah, tapi saya suka bahasanya, jadi begini. Program ini mendefinisikan fungsi
f
pada bilangan asli yang memetakan 3n hingga 3n + 1 , 3n + 1 hingga 3n + 2 , dan 3n + 2 hingga 3n , untuk setiap n .Theseus adalah bahasa reversibel dengan sintaks mirip Haskell, di mana setiap fungsi tidak dapat dibalik (mendiskontokan masalah dengan non-terminasi). Ini sangat eksperimental, dan dirancang untuk tujuan penelitian. Kode di atas mendefinisikan tipe data untuk bilangan asli, dan fungsinya
f
. Diberikan nomor input, Anda mencocokkan pola ke nomor di sebelah kiri (selalu cocokn
). Kemudian Anda melihat pola di sebelah kanan. Jika pola itu memiliki label (di siniiter
), Anda melanjutkan untuk mencocokkan pola di sisi kiri, dan kembali mengambil nilai yang sesuai di sisi kanan. Ini berulang sampai Anda memiliki nilai yang tidak berlabel di sebelah kanan, dan itu adalah output Anda. Pola di sebelah kiri, dan di kanan, harus lengkap dan tidak tumpang tindih (secara terpisah untuk setiap label). Sekarang, untuk "membalikkan polaritas"f
, saya melakukan hal berikut.f
.f
desain .Hasil:
sumber
tr
Contoh:
Hanya invers sebenarnya pada domain string yang tidak menyertakan 'a' dan 'b'.
sumber
tr abc bca
dengan versi polaritas terbaliktr acb cba
.Jawaban lain Marbelous
Hak asli menggeser input baris perintah (nilai 8 bit), menambahkan yang memimpin jika 1 hilang dengan menggeser. (
0000 0001 -> 1000 0000
)Memutar papan ini sebesar 180 ° (tetapi membiarkan konten setiap sel tetap sama) Mengubah program sehingga tersisa bergeser (
1000 0000 -> 0000 0001
)Anda bisa mengujinya di sini . (Anda harus mengaktifkan 'Tampilkan output sebagai angka desimal')
Penjelasan
Kedua program terdiri dari dua papan, papan utama (yang mendapat input baris perintah) dan
Sb
. Mari kita lihat kedua versi papan utama, hanya melihat sel-sel yang dapat dijangkau dalam orientasi masing-masing (karena kelereng biasanya tidak bisa naik ke atas dan perangkat input tidak di atas):Itu adalah papan yang cukup mudah, keduanya mengambil dua salinan input (yang menggantikan
}0
sel. Aslinya memasukkan satu versi ke perangkat shift kiri<<
versi terbalik memasukkannya ke perangkat shift kanan.>>
Ini melakukan bithift tetapi sayangnya membuang semua bit yang hilang. Di sinilahSb
papan masuk, mereka memeriksa apakah bithifting nilai yang mereka makan akan menghasilkan bit yang hilang dan mengembalikan nilai yang akan ditambahkan ke hasil untuk menetralkan bit yang hilang.Inilah bagian yang relevan dari
Sb
papan asli untuk program asli:Yang ini sangat mudah, `^ 7 'memeriksa nilai bit yang paling signifikan. Jika yang ini adalah 1, melakukan shift kiri akan menyebabkan bit ini hilang. Jadi papan ini menampilkan nilai bit ini sebagai nilai 8 bit yang akan ditambahkan ke hasil bithift.
Untuk versi terbalik,
Sb
harus melihat bit yang paling tidak signifikan dan kembali128
atau0
, ini sedikit lebih rumit:Jika bit paling signifikan (seperti yang diuji oleh
^0
) adalah 0, itu hanya mengembalikan 0. Jika itu adalah satu,^0
akan menghasilkan1
. Ini akan gagal dengan uji kesetaraan0
=0
dan dengan demikian akan didorong ke kanan. Kami kemudian kurangi 2-2
untuk mendapatkan 255, shift kiri>>
untuk mendapatkan 127 dan melakukan biner~~
untuk tidak mendapatkan 128 (kami juga bisa dengan mudah menambahkan satu++
untuk mendapatkan 128, tetapi di mana asyiknya?)sumber