Membalik Polaritas

12

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*xbaik-baik saja, tetapi x+xburuk. 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

archaephyrryx
sumber
1
Apa yang Anda maksud dengan program polaritas terbalik adalah kebalikan dari program normal? Apakah output berbeda dalam beberapa hal?
Sp3000
Ia melakukan operasi terbalik; ketika program terbalik dijalankan pada output dari program normal, ia mengembalikan input aslinya.
archaephyrryx
Maaf atas kesalahannya; Saya belum pernah mendengarnya sebelumnya, dan itu terasa agak aneh bagi saya, jadi saya pasti mengira itu adalah Esolang; Saya akan mengubahnya.
archaephyrryx
1
Hanya sesuatu yang mungkin harus ditentukan - apakah ()palindromik? Secara teknis, kebalikannya )(.
Sp3000
1
Dalam contoh Haskell mengapa argumen fungsi tidak dikocok sampai akhir? Apakah pembalikan dipilih sedemikian rupa sehingga menjaga keamanan tipe? Apakah kami boleh memilih beberapa detail operasi pembalikan polaritas?
John Dvorak

Jawaban:

41

Dibalik

Wah, itu pekerjaan, bahkan dengan editor yang saya buat untuk tantangan ini. Inilah yang saya dapatkan, blok 11x12 yang bagus:

v$,g6<6g,$v
v,$ _^_ $,v
1W>v\B\v>L1
~T+:1E1:-O~
+F00-F-02L+
>:|6gUg6|:>
{a@>^N^>@z`
>1+|@G$| +>
:^9< E<  ^1
~>7^@_,#:>:
 xD>65 ^=P~
v,-\+**<  v

Itu melakukan beberapa hal, sayangnya hanya untuk huruf kecil.

Apa yang dilakukannya

Ketika dijalankan secara normal, ia melakukan cipher Caesar pada input.

abcxyz      -> bcdyza
exampletext -> fybnqmfufyu

Ketika dibalik secara horizontal, itu membalik kata sandi. Ini adalah persyaratan untuk tantangan, tetapi tidak berakhir di sini.

bcdyza      -> abcxyz
fybnqmfufyu -> exampletext

Ketika dibalik secara vertikal , ia memasukkan input dengan alfabet terbalik. Ini dapat dianggap sebagai pendekatan yang berlawanan dengan sandi Caesar.

abcxyz      -> zyxcba
exampletext -> vcznkovgvcg

Akhirnya, ketika diputar 180 derajat, itu membalikkan input. Saya merasa itu harus kebalikan dari sesuatu (petunjuk: input).

abcxyz      -> zyxcba
exampletext -> txetelpmaxe

Bagaimana itu bekerja

Blok ini pada dasarnya terdiri dari empat algoritma semi-tumpang tindih.

Encoder cipher Caesar

v$,g6<
v,$ _^
1 >v\
~ +:1
+ 00-
>:|6g
{a@>^

Decoder cipher Caesar (dibalik secara horizontal)

v$,g6<
v,$ _^
1 >v\
~ -:1
+ 20-
>:|6g
`z@>^

Membalik alfabet sandi (dibalik secara vertikal)

v,-\+**<
   >65 ^
~>7^
:^9<
>1+|@
   >^

Pembalik teks (diputar 180 derajat)

v  <
~      
:>:#,_@
1^  <
>+ |$
   >^
PurkkaKoodari
sumber
2
Saya kira Befunge memiliki sedikit keuntungan di sini, karena Anda selalu dapat menggunakan kuadran kiri atas dan sepenuhnya mengabaikan apa yang ada di sisa kode. Kerja bagus!
Martin Ender
1
Wow! Saya HARUS membatalkan ini, meskipun itu berarti saya drop down ke tempat ketiga.
Level River St
18

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-> Aatau C->B

Level River St
sumber
11

Marbelous

Ini adalah yang sederhana untuk memulai kita. Bunyinya satu karakter dari STDIN, menambah dan mencetaknya.

--
]]
00
]]
++

Jika kita memutar ini 180 ° (tanpa menukar tanda kurung), atau mirror di sumbu x, kita dapatkan

++
]]
00
]]
--

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 00adalah 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.

Martin Ender
sumber
Sebagai alternatif, Anda dapat mengganti tiga baris tengah Anda dengan satu perangkat input.
overactor
@ overactor Atau maksud Anda }0dan menggunakannya sebagai subboard?
Martin Ender
}0sebagai input baris perintah tepatnya.
overactor
5

Marbelous

Dewan ini mengambil satu argumen ( x) dan mengembalikan (101 * x) mod 256.

.. @5 .. }0 }0 @1 .. @0 .. @2 .. 
.. /\ Dp << \\ .. &0 >0 &1 .. .. 
!! @3 .. << }0 .. \/ -- \/ .. }0 
@4 .. .. &0 @1 /\ &0 65 &1 /\ @2 
/\ Dp .. @4 .. .. @3 @0 @5 !! \\

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.

.. @2 .. @0 .. @1 }0 }0 .. @5 ..
.. .. &1 >0 &0 .. \\ << Dp /\ ..
}0 .. \/ -- \/ .. }0 << .. @3 !!
@2 /\ &1 65 &0 /\ @1 &0 .. .. @4
\\ !! @5 @0 @3 .. .. @4 .. Dp /\

Uji ini di sini . Papan silinder dan perpustakaan Sertakan keduanya harus diperiksa.

Contoh input / output :

Original Board:      Mirrored Board:
Input   Output       Input    Output
025     221          221      025
042     146          146      042
226     042          042      226

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.

101dipilih karena dua alasan: ini adalah yang utama (dan setiap input yang mungkin untuk program ini menghasilkan output yang unik), dan operasi terbalik yang terlibat 109, yang berjarak 8 dari 101.

Penjelasan singkat

Kolom yang berisi sel-sel (dari atas ke bawah) @0 >0 -- 65 @0menjalankan hal yang sama di kedua papan, dan loop 101kali sebelum menuju ke kanan. Di kedua sisi >0cabang 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 memberi 101 * xterus berjalan dengan sendirinya sampai papan diakhiri.

Dp cukup cetak hasilnya sebagai angka desimal.

es1024
sumber
5

Theseus

Ini mungkin dianggap sebagai celah, tapi saya suka bahasanya, jadi begini. Program ini mendefinisikan fungsi fpada bilangan asli yang memetakan 3n hingga 3n + 1 , 3n + 1 hingga 3n + 2 , dan 3n + 2 hingga 3n , untuk setiap n .

data Num = Zero | Succ Num

iso f :: Num <-> Num
  | n                          <-> iter $ Zero, n
  | iter $ m, Succ Succ Succ n <-> iter $ Succ m, n
  | iter $ m, Succ Succ Zero   <-> back $ m, Zero
  | iter $ m, Succ Zero        <-> back $ m, Succ Succ Zero
  | iter $ m, Zero             <-> back $ m, Succ Zero
  | back $ Succ m, n           <-> back $ m, Succ Succ Succ n
  | back $ Zero, n             <-> n
  where iter :: Num * Num
        back :: Num * Num

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 cocok n). 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.

  • Tukar kedua nilai dari setiap label. Ini tidak mengubah semantik dari f.
  • Tukar sisi kanan dan kiri di badan fungsi. Ini mendefinisikan fungsi terbalik dari f desain .

Hasil:

iso f :: Num <-> Num
  | iter $ n, Zero             <-> n
  | iter $ n, Succ m           <-> iter $ Succ Succ Succ n, m
  | back $ Zero, m             <-> iter $ Succ Succ Zero, m
  | back $ Succ Succ Zero, m   <-> iter $ Succ Zero, m
  | back $ Succ Zero, m        <-> iter $ Zero, m
  | back $ Succ Succ Succ n, m <-> back $ n, Succ m
  | n                          <-> back $ n, Zero
  where iter :: Num * Num
        back :: Num * Num
Zgarb
sumber
3

tr

a b

Contoh:

$ echo "apple" | tr a b
bpple
$ echo "bpple" | tr b a
apple

Hanya invers sebenarnya pada domain string yang tidak menyertakan 'a' dan 'b'.

histokrat
sumber
Anda sebenarnya perlu membatasi domain sedikit lebih dari itu. Misalnya, jika Anda mulai dengan "rawa", program Anda dan kebalikannya memberi "rawa" -> "rawa" -> "rawa". Jadi setiap string yang mengandung 'b' adalah masalah (atau mengandung 'a', jika Anda menerapkan program terbalik terlebih dahulu).
user19057
Anda dapat menggunakan tr abc bcadengan versi polaritas terbalik tr acb cba.
Christian Sievers
2

Jawaban lain Marbelous

Hak asli menggeser input baris perintah (nilai 8 bit), menambahkan yang memimpin jika 1 hilang dengan menggeser. ( 0000 0001 -> 1000 0000)

{0 ..
~~ ..
>> {0
-2 =0
.. ^0
\/ }0
}0 Sb
<< ..
\\ ..
:Sb
// ..
Sb >>
}0 ..
^7 }0
{0 \/

Memutar papan ini sebesar 180 ° (tetapi membiarkan konten setiap sel tetap sama) Mengubah program sehingga tersisa bergeser ( 1000 0000 -> 0000 0001)

\/ {0
}0 ^7
.. }0
>> Sb
.. //
:Sb
.. \\
.. <<
Sb }0
}0 \/
^0 ..
=0 -2
{0 >>
.. ~~
.. {0

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):

original:      flipped:
   }0          }0
}0 Sb          .. }0
<< ..          >> Sb
\\ ..          .. //

Itu adalah papan yang cukup mudah, keduanya mengambil dua salinan input (yang menggantikan }0sel. 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 sinilah Sbpapan 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 Sbpapan asli untuk program asli:

}0
^7
{0

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, Sbharus melihat bit yang paling tidak signifikan dan kembali 128atau 0, ini sedikit lebih rumit:

}0
^0 ..
=0 -2
{0 >>
.. ~~
.. {0

Jika bit paling signifikan (seperti yang diuji oleh ^0) adalah 0, itu hanya mengembalikan 0. Jika itu adalah satu, ^0akan menghasilkan 1. Ini akan gagal dengan uji kesetaraan 0 =0dan dengan demikian akan didorong ke kanan. Kami kemudian kurangi 2 -2untuk 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?)

overactor
sumber