Alihkan quine

10

Dalam varian quine ini, program Anda harus menampilkan kode sumbernya yang dialihkan melintasi diagonal dari kiri atas ke kanan bawah. Sebagai contoh:

program anda
di
empat baris

output

 yof
 ono
 u u
 r r
    
 p l
 r i
 o n
 g e
 r s
 a
 m

Spasi putih dalam output tidak sewenang-wenang. Spasi muncul dalam dua situasi: di mana ada spasi di dokumen asli (mis. Antara rdan ldi kolom keempat) dan di mana perlu untuk membubuhi karakter (misalnya semua spasi di kolom pertama.) Keduanya diperlukan, dan spasi tidak dapat muncul di mana saja lain di output.

Satu baris baru yang tertinggal dalam output secara opsional dapat diabaikan. Mengejar baris baru dalam kode sumber tidak berpengaruh pada output, dan baris baru terdepan dalam kode sumber harus ditangani seperti pada contoh di atas. Asumsikan bahwa setiap karakter yang bukan baris baru memiliki lebar satu kolom dan tinggi satu baris, meskipun untuk karakter seperti tab ini dapat mengakibatkan output yang jelek.

Solusi Anda harus memiliki setidaknya dua baris dengan setidaknya dua karakter non-baris baru masing-masing, dan tidak boleh transpos sendiri (output tidak dapat identik dengan sumber.)

Quina kecurangan yang membaca dari file yang berisi kode sumbernya, menarik data dari URL, menggunakan quining built-in, dan sebagainya tidak diizinkan.

Ini adalah kode golf: kode terpendek dalam byte menang.

Luke
sumber
Apakah ini perlu quine sejati?
lirtosiast
2
@ThomasKwa Berbeda dengan?
Martin Ender
@ MartinBüttner Mungkin ada bahasa tempat literal digema ditransformasikan Untuk berjaga-jaga.
lirtosiast
@ThomasKwa Tidak apa-apa asalkan mengikuti semua aturan yang ditentukan.
Luke
Apakah penggunaan perpustakaan eksternal (seperti Lodash dalam Javascript) dilarang?
Mama Fun Roll

Jawaban:

5

CJam, 14 byte

{`"_~".+N*}
_~

Uji di sini.

Meskipun lebih pendek, mungkin sedikit kurang menarik daripada solusi Fission.

Penjelasan

{       e# Quine framework. Runs the block while another copy of it is on the stack.
  `     e# Stringify the block.
  "_~"  e# Push the remaining code as a string.
  .+    e# Element-wise append... essentially puts the two strings in a grid and 
        e# transposes it.
  N*    e# Join with linefeeds.
}_~
Martin Ender
sumber
10

Fission , 17 byte

Masih bahasa favorit saya untuk quines ...

'"
!0
0+
;!
DN
"!

Cobalah online!

Penjelasan

Ini sangat mirip dengan quine Fission dasar . Bahkan, jika bukan karena aturan "harus memiliki setidaknya dua baris dengan setidaknya dua karakter non-baris baru", saya bisa mengubah dan mengganti Rdengan D. Aturan itu membuat segalanya sedikit lebih menarik, karena kita perlu mencetak baris lain.

Aliran kendali dimulai Ddengan atom tunggal menuju selatan. Karena itu hits "itu akan membungkus dan mencetak

'!0;D

untuk STDOUT, mirip dengan bagaimana hal itu di quine normal. '!kemudian setel massa atom ke kode karakter !. Ini 0adalah teleporter yang mengangkut atom ke kolom kedua, di mana masih bergerak ke selatan.

Dengan +kami menambah massa atom ke nilai ". !N!kutipan cetak, linefeed, kutipan. STDOUT sekarang terlihat seperti ini:

'!0;D"
"

Setelah melilit, atom mengenai yang lain "dan sekarang mencetak baris kedua kata demi kata:

'!0;D"
"0+!N!

Kami sudah selesai sekarang. Atom menggunakan teleporter sekali lagi, dan mendarat di ;mana menghancurkannya dan dengan demikian mengakhiri program.

Saya kira bit paling rapi di sini adalah meletakkan satu "di bagian bawah dan yang lain di bagian atas sehingga saya dapat mencetaknya sekaligus tanpa harus menetapkan nilai !sekali lagi (karena akan ditimpa dengan memasukkan mode string lagi).

Martin Ender
sumber
3

Javascript ES6, 90 byte

$=_=>[...(_=`$=${$};$()`.split`
`)[0]].map((x,y)=>_.map(v=>[...
v][y]).join``).join`
`;$()

Tidak buruk, tidak buruk.

Penjelasan

Inilah kerangka kerja standar quine:

$=_=>`$=${$};$()`;$()

Untuk memodifikasi, saya hanya membagi string quine sepanjang baris baru dan karakter untuk membuat matriks karakter, diubah menggunakan 2 fungsi peta, dan bergabung untuk membuat output.

Mama Fun Roll
sumber
3

Stax , 23 byte

"34bL:f2MMm
"34bL:f2MMm

Cobalah online!

Adaptasi "34bL"34bLquine, yang didasarkan pada ide yang digunakan dalam quines dalam banyak bahasa.

Weijun Zhou
sumber
2

Befunge-93 , 57 byte

^
_^
,@
+,
5*
52
,+
*9
28
+|
9
8#
|!
 ,
##
!:
,^
#
:
^
""

Ini berfungsi dengan meletakkan setiap karakter di kolom pertama di tumpukan (kecuali kutipan itu sendiri), lalu mencetak setiap item dari tumpukan. Setelah itu, ia mencetak kutipan, mencetak baris baru, dan kemudian pindah ke kolom kedua. Itu melakukan hal yang sama tanpa mencetak baris baru.

Anda dapat mengujinya di tautan dalam judul, tetapi Anda harus menyalin-tempel kode ke jendela sendiri. Jika Anda menekan tombol 'lambat', itu akan menunjukkan jalur yang diambil pointer dan tumpukan pada saat itu.

Kevin W.
sumber
Mungkinkah lebih pendek untuk memindahkan kutipan di kolom kedua ke atas seperti yang saya lakukan dalam jawaban Fission saya?
Martin Ender
Saya dapat memindahkan kutipan ke atas dan menyusun ulang kolom kedua dan membuatnya masih berfungsi, tetapi akhirnya masih menjadi 57 byte karena kolom pertama masih harus sama tingginya
Kevin W.
Hm oke, saya pikir itu memungkinkan Anda untuk menghasilkan "satu kali saja, sehingga Anda bisa menggeser beberapa kode dari kolom pertama ke yang kedua.
Martin Ender
1

Python 2, 91 75 69 byte

s='#%r;print"s#\\n="+"\\n".join(s%%s)';print"s#\n="+"\n".join(s%s)
##

Cobalah online

Penjelasan:

Ini menggunakan modifikasi dari quine standar:

s='s=%r;print s%%s';print s%s

Setelah modifikasi:

s='s=%r;print"\\n".join(s%%s)';print"\n".join(s%s)

Ini akan cukup jika satu baris diizinkan. Kemudian, saya menambahkan dua karakter ke baris ke-2 untuk memenuhi persyaratan itu. The #karakter pada baris kedua bisa diganti dengan apa pun, asalkan Anda mengubah mereka dalam baris pertama, juga, dan itu membuat program sintaksis valid.

Untuk mencetaknya dengan benar sekarang, saya harus mencetak #pada akhir dari dua baris pertama. Jadi saya menghapus dua karakter pertama dari string s, dan mencetaknya dengan #sebelum mencetak s%s. Saya meletakkan salah satu #di awal suntuk menyimpan beberapa byte dengan menghapus literal baris baru.

mbomb007
sumber