Prendi posizione contro lunghe file di quine


28

oppure: crea un quine verticale

Ispirato da Prendi posizione contro le lunghe file .

Il tuo compito è costruire un quine verticale con la lunghezza della linea più corta possibile.

punteggio

La lunghezza della linea più breve (escluse le nuove linee) vince, con i criteri del come pareggio.

La lunghezza della linea viene determinata come la linea più lunga del programma escluso il carattere di interruzione di riga.

Per esempio:

$_=
Q.
P

ha una lunghezza della linea di 3 e un conteggio dei byte di 8, mentre:

Q
$
_
P

Ha una lunghezza della linea pari a 1 e un conteggio dei byte di 7 (presupponendo che non ci sia nuova riga finale).

Regole

Le quine devono soddisfare la definizione di comunità di una quine .

Sono vietate le scappatoie standard .


La regola della sfida a cui si ispira si applica anche qui? (" Tutte le interruzioni di riga devono essere significative. Le interruzioni di riga che possono essere rimosse e le linee adiacenti direttamente concatenate senza impatto sull'output, devono essere rimosse. ")
Kevin Cruijssen,

6
@KevinCruijssen No, volevo che questa sfida avesse un po 'più di libertà per incoraggiare le linee più corte! Era l'unica cosa che volevo cambiare nell'altra sfida!
Dom Hastings,

Risposte:


31

Lingua , lunghezza riga 0, ≈ 1,01 × 10 805 byte

Il codice sorgente è costituito da

10124204951141713202533972929121310016060433092338061822344361345785088607872212687519180665846846689047959498775873817205954910072327976407177053174071436371843670134990737172675632938993247496933911137703773908536875512359091727633452506044935740750830240213878294804481182083555147915724921824921475110508228264569693355158523956426011218344830576542194309867719995259333487662608933990607888012376767799159279952780093033761421596267435996052643805835600325453580090964941176722519904997142820547696122795384058768166716813179490118821654787005844786013890425692181280317909786461426684986082270532414940905922244777135016193088362341771414388821075092853157152933099269703875111747946164773211049512395358715902962437487134522781505709420586981997748912591875626029183292826655753251235587052422561943

linefeed, che codifica il programma brainfuck che segue.

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

Il codice sorgente è per lo più identico al quine Lenguage ammorbidito dalle radiazioni di @jimmy23013 , meno .alla fine, con la ++++++++++.[-]sostituzione .per stampare gli avanzamenti riga anziché i byte null e le corrispondenti modifiche alla sezione dati alla riga 1.


Sapevo che era inevitabile! Volevo una domanda inclusiva però. Mi chiedo se qualcuno può battere questo ...
Dom Hastings,

Signore, questa lingua è la definizione del motivo per cui il bowling non è ben accolto, questo è sicuramente fantastico ... Non riesco a credere che "Hello World" richiederebbe"about 1.75*10**76 yottabytes in ASCII"
Urna di polpo magico


Puoi giocare a golf oltre il 99% del codice usando]++++++++ ++.-->
jimmy23013 il

28

JavaScript, lunghezza linea 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
)
`

Versione più leggibile che sembra essere anche una quine (rimosse le nuove righe estranee):


[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)`

Spiegazione

Accidenti. Accomodati a fare un giro qui, perché questo sarà un viaggio infido ...

Ho trascorso molto tempo a cercare di capire come risolvere questa sfida con la lunghezza 1 - nessun built-in (direttamente, comunque), parole chiave o persino funzioni freccia - prima di rendermi conto che è facilmente possibile con JSF *** , che può valutare qualsiasi codice JavaScript evitando token multi-byte. Ma una soluzione JSF sarebbe facilmente lunga migliaia di byte, se non decine o centinaia di migliaia. Per fortuna, non ci limitiamo a solo: ()[]+!abbiamo tutta l'ASCII a nostra disposizione!

Ho deciso di iniziare giocando a golf gli elementi costitutivi essenziali di JSF, i personaggi che possono essere integrati in stringhe per "sbloccare più funzionalità", per così dire. Non possiamo usare direttamente le stringhe per ottenere caratteri, poiché ciò richiederebbe linee di lunghezza 3. Quindi, invece, rubiamo un trucco da JSF, ottenendo alcuni caratteri dai letterali che possono essere creati con token a byte singolo:

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

Da questi possiamo espandere verso l'esterno, a partire da [].find, che è un oggetto Funzione. La conversione di questo in una stringa function find() { ...ci dà l'accesso a c, o, spazio ( _), e le parentesi ( ye z). Forse ancora più importante, ora abbiamo accesso alla sua constructor, la Functionfunzione - che, per quanto possa sembrare iniziale, ci dà la possibilità di eseguire il codice costruendo una stringa, passandola a Function(), e quindi chiamando la funzione generata.

Dovrei probabilmente menzionare il metodo generale utilizzato dal programma stesso. A partire dal 2015, JavaScript ha questa caratteristica davvero interessante chiamata " modelli con tag " , che non solo consente di creare nuove righe senza caratteri di escape nelle stringhe, ma ci permette anche di chiamare direttamente una funzione con una stringa letterale (in un certo senso; myFunc`abc`;è approssimativamente equivalente a myFunc(["abc"])). Se inseriamo la funzione call come ultima cosa nel programma, la struttura generale sarà simile a questa:

code;func`code;func`

Tutto ciò che funcdeve fare è quindi generare il suo argomento, seguito da un backtick, quindi di nuovo dal suo argomento e da un secondo backtick. Supponendo che abbiamo l'argomento ae un backtick archiviato f, possiamo farlo con il codice alert(a+f+a+f). Tuttavia, al momento, ci manca +e il backtick stesso. +(memorizzato in P) non è difficile; rubiamo un altro trucco da JSF, costruendo la stringa 1e23, convertendola in un numero, quindi di nuovo in una stringa, dando "1e+23".

Ottenere un backtick è un po 'più complicato. All'inizio, ho cercato di ottenere String.fromCharCode, ma trovando che Csi è rivelato quasi altrettanto difficile. Fortunatamente, atobè abbastanza facile da ottenere ( Function("return atob")(); bè generato da 0+{}, che dà [object Object]) e può dare qualsiasi carattere ASCII, se viene trovata una stringa magica adeguata. Un breve script mi ​​ha dato 12Acome una delle opzioni, che può essere facilmente trovata in 12Array(un po 'più breve da generare, grazie a [].constructor[n+a+m+e]; msi trova in 0 .constructor+0:) "function Number() { ...".

Alla fine, mettiamo tutto insieme. Assegniamo il backtick alla variabile f, ma poiché non possiamo usarlo direttamente nella stringa della funzione, invece impostiamo la variabile qsulla lettera fe la usiamo invece. Questo rende la nostra stringa finale a+l+e+r+t+y+a+P+q+P+a+P+q+z, o "alert(a+f+a+f)". Quindi lo Function()inseriamo, il risultato è il nostro codice finito e, voilà, abbiamo un quine JavaScript con non più di un carattere per riga!


La mia testa è terribile al momento, quindi per favore informati su eventuali errori che ho fatto o cose che mi sono perso in questa spiegazione, e ti risponderò dopo aver riposato ...


Bello! Anche se in realtà non è un programmatore JS, posso indovinare l'essenza di ciò che ho letto su JSFuck, ma vorrei una spiegazione soprattutto di quella f=linea.
Ørjan Johansen,

1
@ ØrjanJohansen Siamo spiacenti, ho cercato di scrivere una spiegazione per tutto, ma non sta andando molto bene, quindi risponderò rapidamente alla tua domanda: è un modo contorto per impostare fun singolo backtick. La linea stessa è equivalente a f=atob("12Array")[1]. L'altro trucco è che in qrealtà è impostato sulla lettera fnella prima riga, quindi nella F(...)riga posso usarlo per inserire la lettera fnella stringa valutata, poiché la variabile fnon è più impostata su quella lettera. Il a+l+e+r+t+y+a+P+q+P+a+P+q+zequivale a "alert(a+f+a+f)".
ETHproductions

Bene, ora lo capisco! Potresti menzionare cosa 0+{}e 0[E]stringere per ottenere be m.
Ørjan Johansen,

Bello davvero! Molto più piccolo del mio tentativo , anche se abbiamo usato un approccio simile!
Dom Hastings,

@DomHastings Così a lungo il collegamento non funziona nemmeno ;-)
ETHproductions

15

Haskell , lunghezza linea 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':
'=':
[]}

Provalo online! Non sono a conoscenza di un modo per aggirare putStr, quindi la lunghezza della linea di 6. Le parentesi graffe esterne consentono di sbarazzarsi del rientro richiesto altrimenti dopo una nuova riga all'interno di una singola dichiarazione.



12

CJam , lunghezza riga 1, 16 13 byte

"
_
p
"

_
p

Provalo online!

È un piccolo miracolo che l'inserimento di nuove righe nella quine standard{"_~"}_~ anche una quine standard più corta "_p"␊_pfaccia la cosa giusta. (Grazie, Martin!) La nuova riga finale è necessaria.

Spiegazione (con • come newline)

"•_•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.

Al termine, viene stampato ciò che rimane nella pila ( •_•p•), producendo un output totale "•_•p•"••_•p•.


2
Tutto quello che devo dire è ... • _ •
corsiKa

6

Haskell + CPP, lunghezza linea 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\
=\
"\

Provalo online! L'uso del flag -CPPche abilita il pre-processore C ci consente di usare una barra rovesciata alla fine di una riga per continuare sulla riga successiva.

Il codice attuale è main=putStr$(:"\\\n")=<<s++show s;s="<data>".

Modifica: un casual -468 byte grazie a Ørjan Johansen !


1
Salva un sacco di scappare per cambiarlo in main=putStr$(:"\\\n")=<<s++show s;s="<data>". Provalo online!
Ørjan Johansen,

5

Ruggine, lunghezza della linea: 5, byte: 301 299

Provalo online

Nonostante l'aspetto, questo non è un linguaggio di programmazione esoterico, c'è solo un sacco di rumore di linea di formato.

La lunghezza verticale di 5 è stata scelta per poter essere utilizzata print. Non penso che ci sia un modo per stampare che avrebbe una lunghezza verticale più breve, dichiarando che le funzioni C usano la externparola chiave, stdoutè lunga 6 byte, writeè lunga 5 byte, no_mainè lunga 7 byte (principale è di solito una funzione;)).

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,
'}'
)}

Non è lunghezza orizzontale ?
Anatolyg,

@anatolyg fixed
Konrad Borowski il

L'annidamento di stringhe non elaborate senza l'evidenziazione della sintassi rende impossibile interpretarlo. Non credo che cargo fmtsarebbe d'aiuto anche qui ...
CAD97

@ CAD97 Se quello che vuoi è l'evidenziazione della sintassi, play.rust-lang.org lo evidenzia correttamente ed è per questo che l'ho usato al posto di TIO per il link "Provalo online".
Konrad Borowski il



2

JavaScript (ES6), lunghezza riga 3, 17 byte

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

2

Rosso , lunghezza linea: 10, 49 byte

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

Provalo online!

Questo in realtà è un Rebol Quine

Spiegazione: Red / Rebol's moldsegue lo stile di codifica di mettere 4 offset di spazio.

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


2

RProgN 2 , L = 1, B = 15 byte

«
Ø
.
`
-
S
`
.

Questo è equivalente al programma:

«Ø.`
-S`
.

Abbattersi

«prima spinge una funzione che rappresenta implicitamente il resto del programma nello stack, quindi continua l'esecuzione. Ø.aggiunge una stringa vuota alla funzione, che la stringe. Ciò si restringerà sempre come il programma equivalente, a causa del fatto che le newline non sono operative. `\n-Rimuove tutte le nuove righe dalla stringa, ora simile a «Ø.`=S`.. Squindi lo converte in una pila di singoli caratteri e si `\n.unisce alla pila di newline, restituendo il programma previsto.

Provalo online!


2

Sottocarico , lunghezza della linea 1, 20 byte

(
:
a
S
S
)
:
a
S
S

Provalo online!

Questa è solo la stringa standard Underload con le nuove righe aggiunte. Richiede un'implementazione come quella TIO che ignora i caratteri di comando sconosciuti.

La parte in ()è una stringa letterale messa nello stack, la :duplica, aavvolge la voce dello stack superiore tra parentesi e Sstampa.


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
"
}

Provalo online!

Verifica .


1

Javascript (ES6 REPL), programma completo, lunghezza riga: 3, conteggio byte: 31

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

Questa è una porta della risposta di @ kamoroso94 a un programma completo autonomo.

Se qualcuno trova un modo per eliminare alcuni byte senza aggiungere altro alla lunghezza della linea, sentiti libero di commentare :)


Si noti che questo non genera ancora nulla, a meno che non lo si esegua in un REPL. Lo chiamerei JavaScript (ES6 REPL)
ETHproductions

oh spara, modo di usare la console di Chrome ...
Brian H.

1

Pip , lunghezza della linea 1, 35 byte


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

Provalo online!

Basato sul più breve nota Quine Pip, V Y"`V Y`.RPy". La principale difficoltà nel schiacciarlo alla lunghezza della linea 1 è RPche non può essere divisa su due linee. Ma in questo caso, tutto RP(repr) fa è racchiudere la stringa tra virgolette doppie, cosa che possiamo fare direttamente.

Ecco una spiegazione basata su una versione orizzontale:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.