Ambil sikap menentang garis quine panjang

28

atau: Bangun quine vertikal

Terinspirasi oleh Berpegang teguh pada antrean panjang .

Tugas Anda adalah membuat quine vertikal dengan panjang garis sesingkat mungkin.

Mencetak gol

Panjang garis terpendek (tidak termasuk baris baru) menang, dengan kriteria sebagai tie-breaker.

Panjang garis ditentukan sebagai garis terpanjang dalam program Anda kecuali karakter garis putus.

Sebagai contoh:

$_=
Q.
P

memiliki panjang garis 3 dan hitungan byte 8, sementara:

Q
$
_
P

Memiliki panjang garis 1 dan hitungan byte 7 (dengan asumsi tidak ada baris baru).

Aturan

Quine harus memenuhi definisi komunitas quine .

Celah standar dilarang.

Dom Hastings
sumber
Apakah aturan tantangan yang diilhami dari berlaku di sini juga? (" Semua jeda baris harus bermakna. Jeda baris yang dapat dihapus dan garis yang berdekatan langsung digabungkan tanpa berdampak pada output, harus dihapus. ")
Kevin Cruijssen
6
@KevinCruijssen Tidak, saya ingin tantangan ini memiliki sedikit lebih banyak kebebasan untuk mendorong panjang garis yang lebih pendek! Itu adalah satu hal yang ingin saya ubah di tantangan lain!
Dom Hastings

Jawaban:

31

Bahasa , panjang garis 0, ≈ 1,01 × 10 805 byte

Kode sumber terdiri dari

10124204951141713202533972929121310016060433092338061822344361345785088607872212687519180665846846689047959498775873817205954910072327976407177053174071436371843670134990737172675632938993247496933911137703773908536875512359091727633452506044935740750830240213878294804481182083555147915724921824921475110508228264569693355158523956426011218344830576542194309867719995259333487662608933990607888012376767799159279952780093033761421596267435996052643805835600325453580090964941176722519904997142820547696122795384058768166716813179490118821654787005844786013890425692181280317909786461426684986082270532414940905922244777135016193088362341771414388821075092853157152933099269703875111747946164773211049512395358715902962437487134522781505709420586981997748912591875626029183292826655753251235587052422561943

linefeeds, yang menyandikan program brainfuck yang mengikuti.

>>++++++++>+++>+++>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>++++++++>++++>++++++++>++++>+++++++>++>+++>+>+++>++>+++>+++>+>+>+>+>+>+>+>+>++++>++++>+++++++>+>++++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++++>+>+>+>+>+>+>+>+>+>+>++++++++>++++>+++++++>+++++++>+>+>+++>+>+>+>++++++++>+++>+++++++>+>+++>+>+++>+>+++>+>++++++++>++++>++++++++>++++>++++++++>++++>++++>+>+++>+++>++>+++++++>+++++++>+>+>+>++++++++>+++>+>++++++++>++++>+>+++>++>+++++++>++>+++++++>++++>++++>++++++++>+++>++++++++>+++>+++>+>++++>++++>++>+++++++>+++>+++>++++++++>++++>+>+++>++>+++++++>++++>++++>+++++++>+++>+++>+++>+++>++++++++>++++>++++>+>+++>+>+++>++>+++++++>+++++++
[
    [->+>+<<]
    >>>>[<<[->+<]>>[-<<+>>]>]
    <<[-[->+<]+>]+++
    [[->>+<<]<]<
]
+>+>+>+
[>]+++>++
[
    [<]++++++++++.[-]
    >[-]>[-]>[-]>[-]
    <+[<<++++++++>>->+>-[<]<]
    ++++++++>++++++++>+++++++>>
]

Kode sumber sebagian besar identik dengan quine Lenguage yang dilembutkan oleh @ jimmy23013 , dikurangi .di akhir, dengan ++++++++++.[-]mengganti .untuk mencetak linefeeds alih-alih null byte, dan perubahan yang sesuai dengan bagian data pada baris 1.

Dennis
sumber
Saya tahu itu tidak terhindarkan! Saya memang menginginkan pertanyaan inklusif. Aku ingin tahu apakah ada yang bisa mengalahkan ini ...
Dom Hastings
Tuhan, bahasa ini adalah definisi mengapa bowling kode tidak diterima dengan baik, itu pasti keren ... Tidak percaya "Hello World" akan membutuhkan"about 1.75*10**76 yottabytes in ASCII"
Magic Octopus Mm
Anda dapat bermain golf lebih dari 99% dari kode dengan menggunakan]++++++++ ++.-->
jimmy23013
28

JavaScript, panjang baris 1, 960 956 928 byte


[
t
,
r
,
u
,
e
,
f
,
a
,
l
,
s
]
=
!
0
+
[
!
1
]
;
[
,
n
,
d
,
,
q
,
i
]
=
t
.
a
+
t
V
=
[
]
[
f
+
i
+
n
+
d
]
;
[
,
,
,
c
,
,
,
o
,
,
_
,
,
,
,
,
y
,
z
]
=
V
+
0
F
=
V
[
E
=
c
+
o
+
n
+
s
+
t
+
r
+
u
+
c
+
t
+
o
+
r
]
P
=
(
1
+
e
+
2
+
3
-
4
+
t
)
[
2
]
f
=
F
(
r
+
e
+
t
+
u
+
r
+
n
+
_
+
a
+
t
+
o
+
(
0
+
{
}
)
[
3
]
)
(
)
(
3
*
4
+
[
]
[
E
]
[
n
+
a
+
(
0
[
E
]
+
0
)
[
9
+
2
]
+
e
]
)
[
1
]
F
(
a
,
a
+
l
+
e
+
r
+
t
+
y
+
a
+
P
+
q
+
P
+
a
+
P
+
q
+
z
)
`
[
t
,
r
,
u
,
e
,
f
,
a
,
l
,
s
]
=
!
0
+
[
!
1
]
;
[
,
n
,
d
,
,
q
,
i
]
=
t
.
a
+
t
V
=
[
]
[
f
+
i
+
n
+
d
]
;
[
,
,
,
c
,
,
,
o
,
,
_
,
,
,
,
,
y
,
z
]
=
V
+
0
F
=
V
[
E
=
c
+
o
+
n
+
s
+
t
+
r
+
u
+
c
+
t
+
o
+
r
]
P
=
(
1
+
e
+
2
+
3
-
4
+
t
)
[
2
]
f
=
F
(
r
+
e
+
t
+
u
+
r
+
n
+
_
+
a
+
t
+
o
+
(
0
+
{
}
)
[
3
]
)
(
)
(
3
*
4
+
[
]
[
E
]
[
n
+
a
+
(
0
[
E
]
+
0
)
[
9
+
2
]
+
e
]
)
[
1
]
F
(
a
,
a
+
l
+
e
+
r
+
t
+
y
+
a
+
P
+
q
+
P
+
a
+
P
+
q
+
z
)
`

Versi yang lebih mudah dibaca yang juga merupakan quine (newlines asing dihapus):


[t,r,u,e,f,a,l,s]=!0+[!1];[,n,d,,q,i]=t.a+t
V=[][f+i+n+d];[,,,c,,,o,,_,,,,,y,z]=V+0
F=V[E=c+o+n+s+t+r+u+c+t+o+r]
P=(1+e+2+3-4+t)[2]
f=F(r+e+t+u+r+n+_+a+t+o+(0+{})[3])()(3*4+[][E][n+a+(0[E]+0)[9+2]+e])[1]
F(a,a+l+e+r+t+y+a+P+q+P+a+P+q+z)`
[t,r,u,e,f,a,l,s]=!0+[!1];[,n,d,,q,i]=t.a+t
V=[][f+i+n+d];[,,,c,,,o,,_,,,,,y,z]=V+0
F=V[E=c+o+n+s+t+r+u+c+t+o+r]
P=(1+e+2+3-4+t)[2]
f=F(r+e+t+u+r+n+_+a+t+o+(0+{})[3])()(3*4+[][E][n+a+(0[E]+0)[9+2]+e])[1]
F(a,a+l+e+r+t+y+a+P+q+P+a+P+q+z)`

Penjelasan

Wah. Duduklah di sini, karena ini akan menjadi perjalanan yang berbahaya ...

Saya menghabiskan banyak waktu untuk mencari tahu bagaimana menyelesaikan tantangan ini dengan panjang 1 — tidak ada built-in (secara langsung, toh), kata kunci, atau bahkan fungsi panah — sebelum menyadari bahwa itu mungkin dengan JSF *** , yang dapat dilakukan dengan mudah. mengevaluasi kode JavaScript apa pun sambil menghindari token multi-byte. Tetapi solusi JSF akan dengan mudah panjangnya ribuan byte, jika tidak puluhan atau ratusan ribu. Untungnya, kami tidak terbatas hanya pada — ()[]+!kami memiliki semua ASCII yang kami miliki!

Saya memutuskan untuk memulai dengan bermain-main blok bangunan penting JSF — karakter yang dapat dibangun menjadi string untuk "membuka lebih banyak fitur," jadi untuk berbicara. Kami tidak dapat menggunakan string secara langsung untuk mendapatkan karakter, karena itu membutuhkan garis panjang 3. Jadi, kami mencuri trik dari JSF, mendapatkan beberapa karakter dari literal yang dapat dibangun dengan token byte tunggal:

JSF***   Used here   Value        Chars unlocked
!![]     !0          true         true
![]      !1          false        fals
[][[]]   t.a         undefined    ndi

Dari ini kita dapat memperluas ke luar, dimulai dengan [].find, yang merupakan objek Function. Konversi ini untuk string function find() { ...memberi kita akses ke c, o, ruang ( _), dan tanda kurung ( ydan z). Mungkin yang lebih penting, kami sekarang memiliki akses ke nya constructor, yang Functionfungsi-yang, inceptional kedengarannya, memberikan kita kemampuan untuk mengeksekusi kode dengan membangun string, lewat ke Function(), dan kemudian memanggil fungsi yang dihasilkan.

Saya mungkin harus menyebutkan metode keseluruhan yang digunakan oleh program itu sendiri. Pada 2015, JavaScript memiliki fitur yang sangat keren ini disebut " tagged templates ," yang tidak hanya memungkinkan baris baru yang tidak terhapus dalam string, tetapi juga memungkinkan kita memanggil fungsi dengan string literal secara langsung (dengan cara; myFunc`abc`;kira-kira setara dengan myFunc(["abc"])). Jika kita menempatkan pemanggilan fungsi sebagai hal terakhir dalam program, struktur umum akan terlihat seperti ini:

code;func`code;func`

Yang funcharus dilakukan adalah mengeluarkan argumennya, diikuti backtick, lalu argumennya lagi, dan backtick kedua. Dengan asumsi kita memiliki argumen adan backtick tersimpan f, kita dapat menyelesaikan ini dengan kode alert(a+f+a+f). Namun, saat ini, kami hilang +dan backtick itu sendiri. +(disimpan dalam P) tidak sulit; kami mencuri trik lain dari JSF, membuat string 1e23, mengonversi ke angka, lalu kembali ke string, memberi "1e+23".

Mendapatkan backtick sedikit lebih rumit. Pada awalnya, saya mencoba mendapatkan String.fromCharCode, tetapi Cternyata ternyata hampir sama sulitnya. Untungnya, atobcukup mudah untuk memperoleh ( Function("return atob")(); bdihasilkan dari 0+{}, yang memberi [object Object]) dan dapat memberikan arang ASCII, jika string sihir yang tepat ditemukan. Sebuah script singkat memberi saya 12Asebagai salah satu pilihan, yang dapat mudah ditemukan di 12Array(a bit lebih pendek untuk menghasilkan, berkat [].constructor[n+a+m+e]; mditemukan dalam 0 .constructor+0: "function Number() { ...").

Akhirnya, kami menggabungkan semuanya. Kami menetapkan backtick ke variabel f, tetapi karena kami tidak dapat menggunakannya secara langsung dalam string fungsi, kami malah mengatur variabel qke huruf fdan menggunakannya. Ini membuat string terakhir kita a+l+e+r+t+y+a+P+q+P+a+P+q+z, atau "alert(a+f+a+f)". Kami kemudian mengumpankan ini ke Function(), memberi makan kode jadi kami ke hasilnya, dan voila, kami memiliki quine JavaScript dengan tidak lebih dari satu char per baris!


Kepalaku merasa tidak enak saat ini, jadi tolong tanyakan tentang kesalahan yang telah saya buat atau hal-hal yang saya lewatkan dalam penjelasan ini, dan saya akan menghubungi Anda setelah saya beristirahat ...

Produksi ETH
sumber
Bagus! Meskipun benar-benar bukan programmer JS, saya bisa menebak intinya dari apa yang saya baca tentang JSFuck, tapi saya ingin penjelasan terutama dari f=baris itu.
Ørjan Johansen
1
@ ØrjanJohansen Maaf, saya sudah mencoba menulis penjelasan untuk semuanya, tapi tidak berjalan dengan baik jadi saya hanya akan menjawab pertanyaan Anda dengan cepat: ini adalah cara berbelit-belit untuk mengatur fbacktick tunggal. Garis itu sendiri setara dengan f=atob("12Array")[1]. Trik lainnya adalah bahwa qsebenarnya diatur ke huruf fdi baris pertama, sehingga di F(...)baris itu, saya bisa menggunakannya untuk meletakkan huruf fdi string yang dievaluasi, karena variabel ftidak lagi diatur ke huruf itu. Ini a+l+e+r+t+y+a+P+q+P+a+P+q+zsetara dengan "alert(a+f+a+f)".
ETHproduksi
Hebat, sekarang saya memahaminya! Anda mungkin menyebutkan apa 0+{}dan 0[E]menyesuaikan untuk mendapatkan bdan m.
Ørjan Johansen
Bagus dong! Jauh lebih kecil daripada upaya saya , meskipun kami menggunakan pendekatan simar!
Dom Hastings
@HomHastings Selama tautannya tidak berfungsi ;-)
ETHproduksi
15

Haskell , panjang baris 6, 400 343 336 byte

{main=
putStr
$s++(s
>>=(++
":\n")
.show)
++
"[]}";
s='{':
'm':
'a':
'i':
'n':
'=':
'\n':
'p':
'u':
't':
'S':
't':
'r':
'\n':
'$':
's':
'+':
'+':
'(':
's':
'\n':
'>':
'>':
'=':
'(':
'+':
'+':
'\n':
'"':
':':
'\\':
'n':
'"':
')':
'\n':
'.':
's':
'h':
'o':
'w':
')':
'\n':
'+':
'+':
'\n':
'"':
'[':
']':
'}':
'"':
';':
'\n':
's':
'=':
[]}

Cobalah online! Saya tidak mengetahui adanya jalan putStrmemutar, sehingga panjang garis 6. Kurung kurawal luar memungkinkan untuk menyingkirkan indentifikasi yang diperlukan setelah baris baru dalam satu deklarasi.

Laikoni
sumber
12

> <> , 22 byte, panjang baris 1

/
v
o
a
o
^
}
-
d
:
"

Cobalah online!

-6 byte terima kasih kepada Emigna .

Erik the Outgolfer
sumber
12

CJam , panjang baris 1, 16 13 byte

"
_
p
"

_
p

Cobalah online!

Ini adalah keajaiban kecil bahwa memasukkan baris baru ke dalam standar quine standar yang{"_~"}_~ lebih pendek quine "_p"␊_pmelakukan hal yang benar. (Terima kasih, Martin!) Baris baru yang tertinggal diperlukan.

Penjelasan (dengan • sebagai baris baru)

"•_•p•"        Push that string.
       ••      Do nothing.
         _     Duplicate the string.
          •    Do nothing.
           p   Pop it and print it with quotes and a newline: "•_•p•"•
            •  Do nothing.

Pada penghentian, apa yang tersisa di tumpukan dicetak ( •_•p•), menghasilkan total output "•_•p•"••_•p•.

Lynn
sumber
2
Yang harus saya katakan adalah ... • _ •
corsiKa
6

Haskell + CPP, panjang baris 2, 705 237 byte

m\
a\
i\
n\
=\
p\
u\
t\
S\
t\
r\
$\
(\
:\
"\
\\
\\
\\
n\
"\
)\
=\
<\
<\
s\
+\
+\
s\
h\
o\
w\
 \
s\
;\
s\
=\
"\
m\
a\
i\
n\
=\
p\
u\
t\
S\
t\
r\
$\
(\
:\
\\
"\
\\
\\
\\
\\
\\
\\
n\
\\
"\
)\
=\
<\
<\
s\
+\
+\
s\
h\
o\
w\
 \
s\
;\
s\
=\
"\

Cobalah online! Menggunakan bendera -CPPyang memungkinkan pra-prosesor C memungkinkan kita untuk menggunakan garis miring terbalik di akhir baris untuk melanjutkannya di baris berikutnya.

Kode aktualnya adalah main=putStr$(:"\\\n")=<<s++show s;s="<data>".

Sunting: Santai -468 byte berkat Ørjan Johansen !

Laikoni
sumber
1
Menghemat banyak pelarian untuk mengubahnya main=putStr$(:"\\\n")=<<s++show s;s="<data>". Cobalah online!
Ørjan Johansen
5

Karat, panjang garis: 5, byte: 301 299

Cobalah online

Terlepas dari tampilannya, ini bukan bahasa pemrograman esoterik, hanya ada banyak derau format line.

Panjang vertikal 5 dipilih untuk dapat digunakan print. Saya tidak berpikir ada cara untuk mencetak yang akan memiliki panjang vertikal lebih pendek, menyatakan fungsi C menggunakan externkata kunci, stdoutpanjangnya 6 byte, panjang write5 byte, panjang no_main7 byte (utama biasanya fungsi;)).

fn
main
(){
let
t=(
r#"fn
main
(){
let
t=("#
,r#")
;
print
!(
r#"{}
r#"{
}"{}
,r#"{
}"{},
r#"{
}"{}
{}{}{
}{
}""#,
r#"
,t.0,
t.0,
'#',
t.1,
'#',
t.2,
'#',
t.1,
'#',
t.2,
'}'
)"#
)
;
print
!(
r#"{}
r#"{
}"{}
,r#"{
}"{},
r#"{
}"{}
{}{}{
}{
}"#
,t.0,
t.0,
'#',
t.1,
'#',
t.2,
'#',
t.1,
'#',
t.2,
'}'
)}
Konrad Borowski
sumber
Bukankah itu panjang horizontal ?
anatolyg
@anatolyg diperbaiki
Konrad Borowski
Bersarang string mentah tanpa penyorotan sintaksis membuat ini tidak mungkin untuk ditafsirkan. Saya pikir cargo fmtbahkan tidak akan membantu di sini ...
CAD97
@ CAD97 Jika yang Anda inginkan adalah penyorotan sintaks, play.rust-lang.org menyoroti ini dengan benar, itulah sebabnya saya menggunakannya sebagai ganti TIO untuk tautan "Coba online".
Konrad Borowski
4

05AB1E , Panjang baris: 1, Jumlah Byte: 43

2
"
D
3
4
«
ç
¶
ì
ý
Ô
"
D
3
4
«
ç
¶
ì
ý
Ô


Cobalah online!

Emigna
sumber
2

JavaScript (ES6), panjang baris 3, 17 byte

f=
_=>
`f=
${f
}`
kamoroso94
sumber
2

Merah , panjang garis: 10, 49 byte

s: [prin [
    "s:"
    mold s
    "do s"
]] do s

Cobalah online!

Ini sebenarnya adalah quine Rebol

Penjelasan: Merah / Rebol moldmengikuti gaya pengkodean menempatkan 4 spasi offset.

s: [prin [     ; s is a block; print the following: 
    "s:"       ; literal "s:"
    mold s     ; the representation of the block itself - all between []
    "do s"     ; literal "do s"
]] do s        ; evaluate the block
Galen Ivanov
sumber
2

RProgN , 3 byte, panjang baris 1

0
0

Cobalah online!

Salinan jawaban Dennis di sini (angkat dia juga)

Ini sesuai dengan definisi quine yang tepat saat ini, karena 0 pertama mengkodekan 0 kedua dan sebaliknya.

Jo King
sumber
3
Sayang sekali kami belum mencapai konsensus tentang definisi yang lebih baik: - /
ETHproduksi
@ ETHproductions Nah, ada beberapa dukungan untuk definisi ini .
Martin Ender
2

RProgN 2 , L = 1, B = 15 byte

«
Ø
.
`
-
S
`
.

Ini setara dengan program:

«Ø.`
-S`
.

Kerusakan

«pertama mendorong fungsi yang secara implisit mewakili sisa program ke stack, dan kemudian melanjutkan eksekusi. Ø.menambahkan string kosong ke fungsi, yang membuatnya menjadi string. Ini akan selalu ketat seperti program equivilent, karena baris baru menjadi no-ops. `\n-Menghapus semua baris baru dari string, sekarang tampak seperti «Ø.`=S`.. Skemudian mengonversinya menjadi tumpukan karakter tunggal, dan `\n.bergabung dengan tumpukan dengan baris baru, mengembalikan program yang diharapkan.

Cobalah online!

ATaco
sumber
2

Underload , panjang jalur 1, 20 byte

(
:
a
S
S
)
:
a
S
S

Cobalah online!

Ini hanya standar Underload quine dengan baris baru ditambahkan. Membutuhkan implementasi seperti TIO yang mengabaikan karakter perintah yang tidak dikenal.

Bagian dalam ()adalah string literal yang diletakkan di tumpukan, :menduplikatnya, amembungkus entri tumpukan atas dalam tanda kurung, dan Smencetak.

Ørjan Johansen
sumber
2

Perl 5 , 259 byte


$
_
=
p
.
r
.
i
.
n
.
t
.
q
{

'
$
_
=
p
.
r
.
i
.
n
.
t
.
q
{
'
,
&
{
I
.
"
X
0
y
h
~
"
^
"
E
O
0

y
"
.
x
}
(
$
_
,
6
,
-
1
)
,
'
}
;
&
{
I
.
"
X
0
o
k
h
~
"
.
(
Y
|
p
)
^
"
E
O
0
|
f
s
o
"
}
'
}
;
&
{
I
.
"
X
0
o
k
h
~
"
.
(
Y
|
p
)
^
"
E
O
0
|
f
s
o
"
}

Cobalah online!

Verifikasi .

Dom Hastings
sumber
1

Javascript (ES6 REPL), program lengkap, panjang garis: 3, byte-hitung: 31

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

Ini adalah port jawaban @ kamoroso94 untuk program lengkap mandiri.

Jika ada yang menemukan cara untuk menghapus beberapa byte tanpa menambahkan lebih ke panjang-line, jangan ragu untuk berkomentar :)

Brian H.
sumber
Perhatikan bahwa ini masih tidak benar-benar menghasilkan apa pun, kecuali jika Anda menjalankannya dalam REPL. Saya akan menyebutnya JavaScript (ES6 REPL)
ETHproduk
oh menembak, cara yang digunakan untuk konsol chrome ...
Brian H.
1

Pip , panjang garis 1, 35 byte


V
Y
"
[
`
V
Y
`
y
]
.
C
:
3
.
4
"

Cobalah online!

Berdasarkan Pip Quine terpendek dikenal, V Y"`V Y`.RPy". Kesulitan utama dalam memadatkannya ke garis panjang 1 adalah RP, yang tidak dapat dibagi menjadi dua garis. Tetapi dalam kasus ini, semua RP(repr) yang dilakukan adalah membungkus string dengan tanda kutip ganda, yang dapat kita lakukan secara langsung.

Berikut penjelasan berdasarkan versi horizontal:

V Y"[`V Y`y].C:3. 4"
  Y"               "  Yank this string into the variable y
V                     and eval it
                      The code that is eval'd:
    [      ]           Build a list containing:
     `V Y`              this Pattern object (used for regex, but here useful as a
                          string-like object that doesn't need double quotes)
          y             y, the whole string
               3. 4    Concatenate 3 and 4 to make 34 (since the 2-digit number won't work
                         in the vertical version)
             C:        Convert to ASCII character (: forces the precedence lower than .)
            .          Concatenate the " to the end of each list element
                      The resulting list is printed, concatenated together, with a
                        trailing newline
DLosc
sumber
1

Befunge-98 , 41 byte

^
@
,
,
a
-
1
*
5
7
|
 
#
!
a
#
:
,
^
$
"

Cobalah online!

Benar-benar hanya quine normal yang berbalik ke samping, dengan beberapa hal tambahan untuk mencetak baris baru.

Jo King
sumber