Polariteyi Tersine Çevir


12

Bu zorluğun amacı aşağıdaki koşulları sağlayan bir program yazmaktır:

  • Program palindromik veya esasen palindromik değildir (yani, programın etkilerini değiştirmeden bir palindrom yapmak için karakterleri kaldırmak mümkündür).

  • Program bir inovasyon değildir (yani çıktısında çalıştırıldığında orijinal girdisini üretmez)

  • Ters polariteli programı normal program tersidir; böylece ters program normal programın çıktısında çalıştırıldığında, orijinal girdiyi döndürür.

Ters polarite ne anlama geliyor? Diller arasında farklılık gösterir.

  • Çoğu esolang için, bu, tek bir işlemdeki alt işlemlerin sırasını tersine çevirmek, bağımsız değişkenlerin sırasını tersine çevirmek ve sabit kodlanmış listelerin / dizilerin / tuples / sözlüklerin / yığınların / kuyrukların / vb. kod bloklarının ve bağımsız satırların sırasını tersine çevirerek (ancak blok içindeki satırları değil)

Örnekler:

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

  • 1 karakterlik fonksiyonlara (Pyth, APL gibi) sahip diller için, talimat dizesini ters çevirin

  • BF gibi 1 boyutlu esolangs için, talimatları tersine çevirin veya polariteyi değiştirin; polarite swapları []-> {}, +-> -, --> +, >-> <, <-> >, .-> ,ve ,-> .(ancak ikisi birden değil)

  • Befunge gibi 2 boyutlu esolanglar için, x- veya y-eksenleri boyunca bir yansıma gerçekleştirebilir veya bir diyagonal oluşturabilir, 180 derece döndürebilir veya bir yansıma ve bir dönüş kombinasyonu yapabilirsiniz

Değişmeli işlemlere izin verilir, ancak palindromik olanlara izin verilmez: 2*xiyi, ama x+xkötü. Kutupları tersine çevirmenin tanımı oldukça gevşek, ama mantıklı olan şey konusunda yargınızı kullanın; nesne en akıllı boşlukları bulmak değil, en akıllı çözümü bulmaktır.

Bu bir popülerlik yarışmasıdır, bu yüzden çok zeki bir boşluk popüler olabilir, ancak bu zorluğun ruhu içinde kalmaya çalışın. Kazanan, en az 1 oy veren en az 10 çözüm olduğunda ve en az 1 oy veren başvurulardan daha fazla oy veren en az bir çözüm olduğunda ilan edilecektir; veya 1 ayda, hangisi önce gelirse. Bu benim ilk görevim, bu yüzden adil olmaya çalışın ve bana yapıcı geri bildirim verin, ancak bunun mantıksız bir meydan okuma mı yoksa herhangi bir şekilde yanlış kategorize mi yoksa belirsiz mi olduğunu da bildirin. Burada belirlediğim güvercin deliklerinden herhangi birine uymayan bir dil hakkında sorularınız varsa, yorum yapın ve belirli bir açıklama veya kural değişikliği için güçlü bir çıkıntı varsa, toplumun iradesine eğileceğim.

GÜNCELLEME

Bu yarışmanın başlamasından bu yana tam 1 ay geçti (aslında tam zamanında olduğumu bilmeden şans eseri kontrol ettim). Bu bir popülerlik yarışması olduğu için kazanan (heyelan tarafından) Pietu1998-Befunge'dir . Alttaki bileşenler (metin ters ve geriye doğru alfabe) her ikisi de dahil olsa da, kodlayıcı / kod çözücü değildir, bu yüzden orada bir sorun yoktur. Ortaya "BEFUNGE" yazmayı yöneten bonus puanları (aklımda). Şahsen Zgarb'ın Theseus çözümünün yeniliklerini beğendim , çünkü dil havalı görünüyor (kısıtlanmışsa). Katıldıkları için herkese teşekkürler ve kazanan seçiliyken, bu yarışmayı tamamen açık bırakıyorum ve gelecekteki gönderileri memnuniyetle karşılıyorum.


1
Ters polarite programı ile ne demek istiyorsun , normal programın tersidir ? Çıktı bir şekilde farklılık gösterir mi?
Sp3000

Ters işlemi gerçekleştirir; ters program normal programın çıktısında çalıştırıldığında, orijinal girdiyi döndürür.
archaephyrryx

Hata için üzgünüm; Daha önce duymamıştım ve bana biraz garip geldi, bu yüzden bir Esolang olduğunu varsaymalıydım; Bunu değiştireceğim.
archaephyrryx

1
Muhtemelen belirtilmesi gereken bir şey - ()palindromik mi? Teknik olarak tersi )(.
Sp3000

1
Haskell örneğinde, işlev argümanı neden sonuna kadar karıştırılmıyor? Tersine çevirme, tip güvenliği koruyacak şekilde mi seçilmiş? Polarite ters çevirme işleminin bazı detaylarını seçmemize izin var mı?
John Dvorak

Yanıtlar:


41

Befunge

Vay canına, bu meydan okuma için yaptığım editörle bile bir işti . İşte ne var, güzel bir 11x12 blok:

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

Ne yazık ki sadece küçük harfler için birkaç şey yapar.

Bu ne yapar

Normal olarak çalıştırıldığında , girişte bir Sezar şifresi gerçekleştirir .

abcxyz      -> bcdyza
exampletext -> fybnqmfufyu

Yatay olarak çevrildiğinde, söz konusu şifreyi tersine çevirir. Bu meydan okuma için şarttır, ancak burada bitmiyor.

bcdyza      -> abcxyz
fybnqmfufyu -> exampletext

Dikey olarak çevrildiğinde , girişi ters alfabe ile şifreler. Bu, Sezar şifresine zıt bir yaklaşım olarak düşünülebilir.

abcxyz      -> zyxcba
exampletext -> vcznkovgvcg

Son olarak, 180 derece döndürüldüğünde, girişi tersine çevirir. Bir şey tersine (bir ipucu: giriş) olması gerektiğini hissediyorum.

abcxyz      -> zyxcba
exampletext -> txetelpmaxe

Nasıl çalışır

Blok temel olarak dört yarı örtüşen algoritmadan oluşur.

Sezar şifreleme kodlayıcısı

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

Sezar şifre çözücü (yatay olarak çevrilmiş)

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

Ters alfabe şifresi (dikey olarak çevrilmiş)

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

Metin ters çevirici (180 derece döndürülmüş)

v  <
~      
:>:#,_@
1^  <
>+ |$
   >^

2
Befunge'nin burada küçük bir avantajı olduğunu düşünüyorum, çünkü her zaman sadece sol üst çeyreği kullanabilir ve kodun geri kalanında ne olduğunu tamamen göz ardı edebilirsiniz. Güzel iş olsa!
Martin Ender

1
Vaov! Üçüncü sıraya düştüğüm anlamına gelse de, bunu düzeltmem gerekiyor.
Level River St

18

Brainfuck, 5

,+.-,

Muhtemelen ilk kez, Brainfuck kod uzunluğu konusunda rekabetçi bir cevap üretir. Yazık ki bu bir kod golf sorusu değil.

Bir bayt (karakter) girer, onu artırır ve sonucu çıktılar. Sondaki virgül başka bir girdi bekliyor, verildiyse yok sayılır. Spesifikasyonda uygun fesih hakkında hiçbir şey yoktur: -) *

* (veya her iki yönde de tüm kodlarla faydalı bir şey yapmak hakkında)

Tipik sonuçlar (verilirse ikinci karakter yoksayılır).

İleri: B->C

Ters: B-> Aveya C->B


11

Marbelous

İşte bize başlamak için basit bir tane. STDIN'den bir karakter okur, arttırır ve yazdırır.

--
]]
00
]]
++

Bunu 180 ° döndürürsek (parantezleri değiştirmeden) veya x ekseninde aynalarsak,

++
]]
00
]]
--

STDIN'den bir bayt okur ve azaltır.

Burada test edebilirsiniz .

Bazı daha karmaşık Marbelous programlarına bakabilirim, ama eminim es1024 beni buna yenecek. ;)

açıklama

00(İsteğe bağlıdır) 0 değerine sahip bir bilye. ]]Cihazlar STDIN'den bir byte okumak - mermer içlerinden düşerse,, Marble değeri okuma byte dönüşür. ++Ve --cihazları sadece artış ya da (256 mod) mermer değerini azaltma ve izin içinden düşer. Bir mermer tahtadan düştüğünde bayt STDOUT'a yazılır.

Bu nedenle, üstteki iki cihaz basitçe yok sayılır, çünkü kontrol akışı onlara asla ulaşmaz.


Alternatif olarak, üç orta sıranızı tek bir giriş cihazıyla değiştirebilirsiniz.
overactor

@overactor Yoksa }0bir subboard olarak mı kullanıyorsunuz?
Martin Ender

}0komut satırı girişi olarak kesin.
overactor

5

Marbelous

Bu pano bir argüman ( x) alır ve geri döner (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 !! \\

Hücrelerin y ekseni boyunca yansıtılması, bir ilk argümanın tersi olan bir argüman ( y) alan ve geri dönen bir (101 * y + 8 * y) mod 256kartla sonuçlanır.

.. @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 /\

Bunu burada test edin . Silindirik tahtalar ve Include kütüphaneleri kontrol edilmelidir.

Örnek giriş / çıkış :

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

Lütfen Marbelous'un sadece pozitif tamsayıların argüman olarak geçmesine izin verdiğini ve bu tamsayıların yorumlayıcı tarafından modulo 256 programına aktarıldığını unutmayın.

101iki nedenden ötürü seçildi: bir asal (ve bu programa mümkün olan her girdi benzersiz bir çıktıyla sonuçlanır) ve ters işlem 109, bu da 8 mesafeden uygun bir mesafedir 101.

Kısa açıklama

Hücreleri içeren sütun (yukarıdan aşağıya) @0 >0 -- 65 @0her iki panoda da aynı şekilde çalışır 101ve sağa gitmeden önce süreleri döngüler . >0Dalın her iki tarafında farklı bir senkronizasyon vardır; hangisinin seçileceği, tahtanın yansıtılıp yansıtılmadığına bağlıdır.

Her iki tarafta, merkez döngü ile senkronize olarak, giriş tekrar tekrar toplanır ve böylece elde edilir 101*x mod 256. Ters tahtada, girişin iki kopyası da iki kez sola kaydırılır ( input * 4), sonra toplanır ve bir senkronizörde bırakılır.

Orta halka bittikten sonra, toplanan mermerler baskı için gönderilir, bu da kartın yan tarafındadır (orijinal tahta için sol, yansıtılmış için sağ). Yazdırdıktan sonra !!, kartı sonlandıran bir hücreye ulaşılır. Verilen döngünün 101 * xkart sonlanıncaya kadar kendi kendine çalışmaya devam ettiğini unutmayın .

Dp sonucu ondalık sayı olarak basar.


5

Theseus

Bu bir boşluk olarak kabul edilebilir, ancak dili seviyorum, işte gidiyor. Bu program, her n için 3n ila 3n + 1 , 3n + 1 ila 3n + 2 ve 3n + 2 ila 3n'yif eşleyen doğal sayılardaki bir işlevi tanımlar .

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 , her fonksiyonun tersine çevrilebilir olduğu (Sonlandırmama ile ilgili iskonto sorunları) Haskell benzeri bir sözdizimine sahip geri dönüşümlü bir dildir. Oldukça deneyseldir ve araştırma amaçlı tasarlanmıştır. Yukarıdaki kod, doğal sayılar ve işlev için bir veri türü tanımlar f. Bir giriş numarası verildiğinde, sol taraftaki desenle eşleşirsiniz (her zaman eşleşir n). Sonra sağdaki desene bakın. Bu desenin bir etiketi varsa (buradaiter), sol tarafta desen eşleştirmeye devam edersiniz ve tekrar sağ tarafta karşılık gelen değeri alırsınız. Bu, sağda etiketlenmemiş bir değeriniz olana kadar tekrarlanır ve bu sizin çıktınızdır. Soldaki ve sağdaki desenler kapsamlı ve örtüşmemelidir (her etiket için ayrı ayrı). Şimdi, "kutupluluğunu tersine çevirmek" fiçin aşağıdakileri yapıyorum.

  • Her etiketin iki değerini değiştirin. Bu, anlambilimini değiştirmez f.
  • İşlev gövdesinin sağ ve sol taraflarını değiştirin. Bu, f tasarımın ters fonksiyonunu tanımlar .

Sonuç:

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

3

tr

a b

Misal:

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

Hem 'a' hem de 'b' içermeyen dizelerin etki alanında yalnızca gerçek bir ters.


Aslında etki alanını bundan biraz daha fazla kısıtlamanız gerekir. Örneğin, "bataklık" ile başlarsanız, programınız ve bunun tersi "bataklık" -> "bataklık" -> "aog" verir. Bu nedenle, 'b' içeren herhangi bir dize bir sorundur (veya önce ters programı uygularsanız 'a' içeren).
user19057

tr abc bcaTers polarite sürümü ile kullanabilirsiniz tr acb cba.
Christian Sievers

2

Başka Bir Şahane cevap

Orijinal sağ komut satırı girişini (8 bitlik bir değer) kaydırır ve 1 kaydırarak kaybolursa önden bir değer ekler. ( 0000 0001 -> 1000 0000)

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

Bu devre kartını 180 ° döndürme (ancak her hücrenin içeriğini aynı bırakarak) Programı, vardiyalar bırakacak şekilde değiştirir ( 1000 0000 -> 0000 0001)

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

Burada test edebilirsiniz . ('Çıktıyı ondalık sayı olarak görüntüle' seçeneğini açmanız gerekir)

açıklama

Her iki program da iki karttan oluşur, ana kart (komut satırı girişini alır) ve Sb. Ana kartın her iki versiyonuna da bakalım, sadece kendi yönlerinde ulaşılabilen hücrelere bakalım (çünkü mermer tipik olarak yukarı çıkamaz ve giriş cihazları üstte değildir):

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

Bunlar oldukça basit panolardır, her ikisi de girişin iki kopyasını alır ( }0hücrelerin yerini alır . Orijinal, bir sürümü sol kaydırma cihazına besler <<, ters çevrilmiş sürüm onu ​​sağ kaydırma cihazına >>koyarlar. Bu, Sbpanoların devreye girdiği yerdir, beslendikleri değerin bit değerinin değiştirilmesinin bir miktar kaybolmaya neden olup olmayacağını kontrol ederler ve kaybedilen bite karşı koymak için sonuca eklenecek bir değer döndürürler.

SbOrijinal programın orijinal programının ilgili kısmı :

}0
^7
{0

Bu inanılmaz derecede kolaydır, `^ 7 'en önemli bitin değerini kontrol eder. Bu 1 ise, sola kaydırma yapmak bu bitin kaybolmasına neden olur. Böylece bu kart, bit bitinin sonucuna eklenecek 8 bitlik bir değer olarak bu bitin değerini verir.

Ters çevrilmiş versiyon için, Sben az anlamlı bite bakmak ve geri dönmek zorundadır 128veya 0bu biraz daha karmaşıktır:

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

(Test gibi en önemli bit varsa ^0) 0 bunun bir biri ise, sadece 0 döndürür ^0çıktısı 1. Bu, eşitlik testinde başarısız olur 0 =0ve böylece sağa doğru itilir. Daha sonra -2255 almak için 2 , >>127 almak için sola kaydırmak ve ~~128 elde etmemek için bir ikili işlem gerçekleştiririz (128 elde etmek için de bir tane ++ekleyebiliriz, ancak bunun eğlenceli olduğu yer?)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.