Ayna quine (veya başım ağrıyor)


32

Kodunuzu geriye doğru yazdırın - ters quine okuyordum Ve geri kodunuz da çalıştırılabilirse, bunun daha ilginç olabileceğini düşündüm . Bu yüzden bu zorluk diğerinin tüm kurallarına ve gereksinimlerine sahip olacak, ancak tersine çevrildiğinde geçerli bir kaynak olmalıdır (aynı veya başka bir dilde ve hala kaynağını geriye doğru yazdırmak zorundadır).

Tüm kurallar ve ters quine mücadelesinden puanlama geçerlidir, bu nedenle bu soruya verilen tüm cevaplar buna cevap verecektir (ama aynı zamanda puan da değil).

Düzenle:

İstek üzerine, tüm kurallar şimdi buraya kopyalanır.

Kurallar:

  • yürütüldüğü zaman p 'p' p'nin geriye doğru olduğu ve yürütüldüğü zaman p 'p ürettiği bir p yazın.
  • Başka dosyalar kullanmamak (örneğin reverse.txt)
  • Minimum kod uzunluğu iki karakterdir.
  • Programınız bir palindrom olamaz.

puanlama:

  • İnternetten veri çekme kullanıyorsanız +50.
  • Kendi kaynak kodunuzu okursanız +25.
  • Karakter başına +1 puan.
  • En düşük puan kazanır.

eval(eval(eval(eval(eval(eval(eval(eval(eval(p)))))))))
Andrew Larsson

Ben sadece [...] 'in çıkışını yürütme çıktısını yürütme çıktısını çalıştırabileceğinizi söylüyorum (p'nin çıktısını yürütme işleminin yürütülmesi) (geriye doğru sıra dışında herhangi bir quine ile aynı).
Andrew Larsson

@AndrewLarsson Gerçekten de, p yapıyorum kavramının kanıtı perl olarak c ve p 'ile yazılacak.
Hildred

Oh, harika olurdu!
Andrew Larsson

1
Evet, bunu çok geç gördüm. Bir kopya değil.
Johannes Kuhn

Yanıtlar:


22

GolfScript, 46 karakter

0{`".~#"+.-1%+\.!@@}.~##~.}@@!.\+%1-.+"#~."`{1

Evet, bu çirkin, ama işe yarıyor. Çıktı tersine çevrilmiş kodu eşittir ve ayrıca orijinal kodu tekrar çıkaran geçerli bir GolfScript programıdır.

Tamam, nasıl inşa ettiğimi açıklamaya çalışayım. İlk önce quine'den başladım {".~"}.~ve bu cevabın aynısını tersine çevirmek için değiştirdim . Çıktıyı kendi başına çalıştırılabilir bir quine yapmak için, tersine çevirmeden önce kodun bir kopyasını aldım ve kodun #sonuna bir son ekledim, böylece sonunda tersine çevrilmiş sürüm yalnızca bir yorum haline geldi. Böylece, palindromik quine elde ederiz:

{`".~#"+.-1%}.~##~.}%1-.+"#~."`{

Ancak, kurallara göre palindromlara izin verilmiyor, bu yüzden simetriyi bir şekilde kırmam gerekiyordu. Ben en kolay yolu dahil etmek olacağını düşündüm 0kodunda (kendi içinde, GolfScript bir quine olan) ve bunu çevirmek 1ile !ters kopya oluşturduktan sonra. Kalan karmaşıklığın çoğu, her şeyi doğru sıraya getirmek için sadece çirkin yığın manipülasyonudur.


Tersine döndüğünde golf yazısı mı yoksa başka bir dil mi?
Hildred

Evet, GolfScript her iki yönde de var. Nitekim hariç 0ve 1başında ve sonunda, kodun kalan bir palindrom olduğunu.
Ilmari Karonen

9
Vay. Tamam, artık bu SE için yeterince akıllı hissetmiyorum :(
Cruncher

21

Perl ve C 6478 1955

#!/usr/bin/perl -i//
$_=<<'rahc';eval $_; #//
print scalar reverse "#!/usr/bin/perl -i//\n\$_=<<'rahc';eval \$_; #//\n${_}rahc\n" #//
__END__
__END__ enifed#
};)"{ = ][cn\rahcn\n\"(p
};)'n\'( rahctup) 1 == 21%b ( fi
;)d(p;)]1-b[c,",d%",)d(foezis,d( ftnirpns{)b--;b;)c(foezis=b( rof
;)c(p;]9[d rahc;b tni{)(niam diov
}};)]1-b[c(rahctup )]1-b[c(fi{)b--;b;)c(nelrts=b(rof;b tni{)c*rahc(p diov
>h.gnirts< edulcni#
>h.oidts< edulcni#
;}
,0
,53,33,74,711,511,411,74,89,501,011,74,211
,101,411,801,23,54,501,74,74,01,63,59,16
,06,06,93,411,79,401,99,93,95,101,811,79
,801,23,63,59,95,23,53,74,74,01,211,411
,501,011,611,23,511,99,79,801,79,411,23,411
,101,811,101,411,511,101,23,43,53,33,74,711
,511,411,74,89,501,011,74,211,101,411,801,23
,54,501,74,74,29,011,29,63,59,16,06,06
,93,411,79,401,99,93,95,101,811,79,801,23
,29,63,59,95,23,53,74,74,29,011,63,321
,59,521,411,79,401,99,29,011,43,23,53,74
,74,01,59,59,96,87,86,59,59,01,59,59
,96,87,86,59,59,23,101,011,501,201,101,001
,53,01,521,95,14,43,321,23,16,23,39,19
,99,011,29,411,79,401,99,011,29,011,29,43
,04,211,01,521,95,14,93,011,29,93,04,23
,411,79,401,99,611,711,211,14,23,94,23,16
,16,23,05,94,73,89,23,04,23,201,501,01
,95,14,001,04,211,95,14,39,94,54,89,19
,99,44,43,44,001,73,43,44,14,001,04,201
,111,101,221,501,511,44,001,04,23,201,611,011
,501,411,211,011,511,321,14,89,54,54,95,89
,95,14,99,04,201,111,101,221,501,511,16,89
,04,23,411,111,201,01,95,14,99,04,211,95
,39,75,19,001,23,411,79,401,99,95,89,23
,611,011,501,321,14,04,011,501,79,901,23,001
,501,111,811,01,521,521,95,14,39,94,54,89
,19,99,04,411,79,401,99,611,711,211,23,14
,39,94,54,89,19,99,04,201,501,321,14,89
,54,54,95,89,95,14,99,04,011,101,801,411
,611,511,16,89,04,411,111,201,95,89,23,611
,011,501,321,14,99,24,411,79,401,99,04,211
,23,001,501,111,811,01,26,401,64,301,011,501
,411,611,511,06,23,101,001,711,801,99,011,501
,53,01,26,401,64,111,501,001,611,511,06,23
,101,001,711,801,99,011,501,53,01,95,521,01
{ = ][c
rahc

Düzenle:

Kısa açıklama: perl'den iki ilginç çizgi ikinci ve üçüncü. İkinci satırda, birincisi belgenin geri kalanını bir dize okuyan iki ifade vardır. İkinci dize evals. Üçüncü satır her şeyi geriye doğru yazdırır. her şey göz ardı edilir. c tarafından programa bir dizi, bir dizi ve bir dizge olarak basılan bir diziye sahipsiniz ve gerisi bir yorum.


1
wat. : Ey Kafam patladı. Ama bunun içinde 6536 karakter sayıyorum ...
Doorknob

Ne ... nasıl ... 0_0
Şapkalı Adam

@DoorknobofSnow Yanlış sürümü saydım. Ancak burada daha kısa bir sürüm var.
Hildred

Bu inanılmaz! Bence Haskell / C başka bir uygulanabilir kombinasyon olabilir.
theonlygusti

@ theonlygusti, eğer gönderirseniz ve ben derleyebilirsem, onu affedeceğim.
hildred

8

Ruby 145

DATA.read.tap {| a | a.reverse, a.tr ("\ x79 \ x59", "\ x59 \ x79")} koyar
y
__SON__
__DNE__
Y:
}) "97x \ 95x \", "95x \ 97x \" (rt.a, esrever.a stup | a | {pat.daer.ATAD

Asıl fikir basittir: kaynak kodun ilk yarısını geriye koyup, sonra yakuttan __END__okunabilir DATA. Sonra bu verinin tam tersini yazdırın, ardından verileri yazdırın ve orijinal kaynak kodunu geri alın

Sorun, bunun bir palindrom haline gelmesidir (ilk satırın bir bitiş çizgisine ihtiyacı olduğuna dikkat edin), bu yüzden simetriyi kırmamız gerekiyor. Sadece :ykoda bir sembol ekledim ve bu sembolü işlemler arasında küçük harf ve büyük harf arasında dönüştürecek ve böylece iki işlemden sonra orijinal durumuna geri döndürecek bazı kodlar ekledim .

Test bir: onlar yapılabilir

$ ruby rq2.rb > rq2t.rb
$ ruby rq2t.rb > rq2tt.rb

İkinci sınama: iki çalışmanın sonucu orijinal kaynağı döndürür

$ diff rq2.rb rq2tt.rb
$

Üçüncü test: kod bir palindrome değil (orta sıra farklı)

$ diff rq2.rb rq2t.rb
3c3
< :y
---
> :Y
6c6
< Y:
---
> y:

4

> <>, 21 19 bayt

'rd3*70.r l?!;o90.<

Burada dene!

Kolaylık sağlamak için *> <> yorumlayıcısını kullanır, ancak bu geçerlidir> <> kodu.


Hataya izin verilirse, 16 baytta yapılabilir:

'd3*}70.!r  !|o|

Burada dene!


@JoKing teşekkür ederim! Sabah 7 oldu ve bunu bir araya getirmek için çok yorgundum. Birkaç saat içinde düzenleyeceğim.
Discordian

4

Gol> <> , 11 bayt

":5-}H}+5:'

Bir bütün bayt kesildi! neredeyse bir palindrom, fakat teknik olarak '+' ve '-' yüzünden değil, haha!

Çevrimiçi deneyin!

Aşağıdaki ikisi çalışmaz ya da en azından mücadelenin spesifikasyonlarına uymuyor, ancak yukarıdaki kod çalışıyor.

biraz daha genç sürüm, 12 bayt

"r2ssrH}+5:'

Sadece bir çift alıntı kullanarak ve 5 oranında artırarak bir bayt kapalı Golf! Ve bu yeni sürüm daha az palindrom gibi gözüküyor.

Çevrimiçi deneyin!

eski sürüm, 13 bayt

"r2ssrHrss7r'

Önceki JoKing'in işaret ettiği bir sorun vardı, bunun için teşekkür ederim, şimdi çalışıyor, fakat 4 ekstra baytlık fiyatla ...

Çevrimiçi deneyin!


1

Yardım, WarDoq! (27 bayt)

Kaynak kodu okunması nedeniyle 25 bayt eklendi.

<space>q

Nasıl çalışır:
<space>- boşluk olmayan karakterle biten bir yorum
q- baskı kaynak kodunu tersine çevirir (q "boşluk")

ters:

q<space>

Nasıl çalışır:
q- kaynak kodunu tersine çevirir (şimdilik q)
<space>- boşluksuz karakterde biten bir yorum ve q komutunun başına bir karakter ekleyen ("boşluk" q yaparak)

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.