Wystaw się przeciwko długim liniom quine


28

lub: Zbuduj pionowy quine

Zainspirowany przez: Stań przy długich liniach .

Twoim zadaniem jest zbudowanie pionowej kabiny o możliwie najkrótszej długości linii.

Punktacja

Zwycięża najkrótsza linia (z wyłączeniem nowych linii), z kryterium jako rozstrzygającym.

Długość linii jest określana jako najdłuższa linia w twoim programie, z wyłączeniem znaku końca linii.

Na przykład:

$_=
Q.
P

ma długość linii 3 i liczbę bajtów 8, podczas gdy:

Q
$
_
P

Ma długość linii 1 i liczbę bajtów 7 (zakładając, że nie ma końca nowej linii).

Zasady

Quines musi spełniać wspólnotową definicję quine .

Standardowe luki są zabronione.


Czy obowiązuje tu także zasada wyzwania, które jest inspirowane? („ Wszystkie podziały linii muszą być znaczące. Podziały linii, które można usunąć, a sąsiednie linie bezpośrednio połączone bez wpływu na wynik, muszą zostać usunięte. ”)
Kevin Cruijssen

6
@KevinCruijssen Nie, chciałem, aby to wyzwanie miało trochę więcej swobody w zachęcaniu do krótszych długości linii! To była jedna rzecz, którą chciałem zmienić w drugim wyzwaniu!
Dom Hastings,

Odpowiedzi:


31

Lenguage , długość linii 0, ≈ 1,01 × 10 805 bajtów

Kod źródłowy składa się z

10124204951141713202533972929121310016060433092338061822344361345785088607872212687519180665846846689047959498775873817205954910072327976407177053174071436371843670134990737172675632938993247496933911137703773908536875512359091727633452506044935740750830240213878294804481182083555147915724921824921475110508228264569693355158523956426011218344830576542194309867719995259333487662608933990607888012376767799159279952780093033761421596267435996052643805835600325453580090964941176722519904997142820547696122795384058768166716813179490118821654787005844786013890425692181280317909786461426684986082270532414940905922244777135016193088362341771414388821075092853157152933099269703875111747946164773211049512395358715902962437487134522781505709420586981997748912591875626029183292826655753251235587052422561943

linefeeds, który koduje następujący program do pieprzenia mózgów.

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

Kod źródłowy jest w większości identyczny z zmiękczonym promieniowaniem quine Lenguage @ minus .na końcu, z ++++++++++.[-]zastąpieniem .wydruku linii zamiast bajtów zerowych i odpowiednich zmian w sekcji danych w linii 1.


Wiedziałem, że to nieuniknione! Chciałem jednak mieć pytanie włączające. Zastanawiam się, czy ktokolwiek może to pokonać ...
Dom Hastings

Panie, ten język jest definicją tego, dlaczego kręgle kodu nie są dobrze odbierane, to na pewno fajny ... Nie mogę uwierzyć, że „Hello World” wymagałoby"about 1.75*10**76 yottabytes in ASCII"
Magic Octopus Urn


Możesz ]++++++++ ++.-->
zagrać w

28

JavaScript, długość linii 1, 960 956 928 bajtów


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

Bardziej czytelna wersja, która również jest quine (usunięto zbędne znaki nowej linii):


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

Wyjaśnienie

Uff Wybierz się tutaj na przejażdżkę, ponieważ będzie to zdradziecka podróż ...

Spędziłem dużo czasu próbując dowiedzieć się, jak rozwiązać to wyzwanie z długością 1 - bez wbudowanych (bezpośrednio, w każdym razie), słów kluczowych, a nawet funkcji strzałek - zanim zdałem sobie sprawę, że jest to możliwe z JSF *** , który może oceń dowolny kod JavaScript, unikając jednocześnie tokenów wielobajtowych. Ale rozwiązanie JSF z łatwością miałoby tysiące bajtów, jeśli nie dziesiątki lub setki tysięcy. Na szczęście nie ograniczamy się tylko do - ()[]+!mamy do dyspozycji wszystkie ASCII!

Postanowiłem zacząć od gry w golfa w podstawowe elementy JSF - postaci, które można zbudować z ciągów znaków, aby „odblokować więcej funkcji”. Nie możemy używać ciągów bezpośrednio do pobierania znaków, ponieważ wymagałoby to wierszy o długości 3. Zamiast tego kradniemy sztuczkę z JSF, uzyskując kilka znaków z literałów, które można zbudować za pomocą tokenów jednobajtowych:

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

Z nich możemy rozwinąć na zewnątrz, zaczynając od [].find, który jest obiektem funkcji. Konwersja to ciąg function find() { ...daje nam dostęp do c, oprzestrzeń ( _) i nawiasy ( yi z). Co ważniejsze, mamy teraz dostęp do swojego constructor, z Functionfunkcją-które inceptional jak się może wydawać, daje nam możliwość wykonywania kodu budując łańcuch, mijając go Function(), a następnie wywołaniu funkcji generowane.

Powinienem chyba wspomnieć o ogólnej metodzie stosowanej przez sam program. Począwszy od 2015 r. JavaScript ma tę naprawdę fajną funkcję zwaną „ szablonami otagowanymi ”, która nie tylko pozwala na nieoznaczone znaki nowej linii w ciągach, ale także pozwala nam wywoływać funkcję z dosłownym ciągiem znaków (w pewnym sensie; myFunc`abc`;jest mniej więcej równoważna myFunc(["abc"])). Jeśli umieścimy wywołanie funkcji jako ostatnią rzecz w programie, ogólna struktura będzie wyglądać następująco:

code;func`code;func`

Wszystko, funcco należy zrobić, to wypisanie argumentu, następnie kliknięcie wstecz, następnie argument ponownie i drugi zwrot. Zakładając, że mamy argument ai zapisany backtick f, możemy to zrobić za pomocą kodu alert(a+f+a+f). Jednak w tej chwili brakuje, +a sam backtick. +(przechowywane w P) nie jest trudne; kradniemy kolejną sztuczkę z JSF, budując ciąg 1e23, konwertując na liczbę, a następnie z powrotem na ciąg, dając "1e+23".

Użycie backticka jest nieco bardziej skomplikowane. Na początku próbowałem uzyskać String.fromCharCode, ale znalezienie Cokazało się prawie tak samo trudne. Na szczęście atobjest łatwy do uzyskania ( Function("return atob")(); bjest generowany z 0+{}, co daje [object Object]) i może dać dowolny znak ASCII, jeśli zostanie znaleziony odpowiedni ciąg magiczny. Krótki skrypt dał mi 12Ajako jedną z opcji, które można łatwo znaleźć w 12Array(nieco krótszy wygenerować dzięki [].constructor[n+a+m+e]; mznajduje się w 0 .constructor+0: "function Number() { ...").

Wreszcie, wszystko trzymamy razem. Przypisujemy strzałkę wsteczną do zmiennej f, ale ponieważ nie możemy jej użyć bezpośrednio w ciągu funkcji, zamiast tego ustawiamy zmienną qna literę fi używamy jej zamiast tego. To czyni nasz ostatni ciąg a+l+e+r+t+y+a+P+q+P+a+P+q+z, lub "alert(a+f+a+f)". Następnie Function()podajemy to do, podajemy gotowy kod do wyniku i voila, mamy skrypt JavaScript z nie więcej niż jednym znakiem w wierszu!


W tej chwili czuję się okropnie, więc proszę pytać o błędy, które popełniłem lub rzeczy, które mi umknęły w tym wyjaśnieniu, a wrócę do ciebie po odpoczynku ...


Miły! Chociaż tak naprawdę nie jestem programistą JS, mogę odgadnąć sedno tego na podstawie tego, co przeczytałem o JSFuck, ale chciałbym wyjaśnić szczególnie ten f=wiersz.
Ørjan Johansen

1
@ ØrjanJohansen Przepraszam, próbowałem napisać wyjaśnienie całej sprawy, ale nie idzie dobrze, więc po prostu odpowiem na twoje pytanie: jest to zawiły sposób, aby ustawić fjedno kliknięcie. Sama linia jest równoważna f=atob("12Array")[1]. Druga sztuczka polega na tym, że qtak naprawdę jest ustawiona na literę fw pierwszym wierszu, więc w F(...)wierszu mogę użyć jej do wstawienia litery fdo ocenianego ciągu, ponieważ zmienna fnie jest już ustawiona na tę literę. Jest a+l+e+r+t+y+a+P+q+P+a+P+q+zto równoważne z "alert(a+f+a+f)".
ETHprodukcje

Świetnie, teraz to rozumiem! Możesz wspomnieć o czym 0+{}i 0[E]skreślić, aby uzyskać bi m.
Ørjan Johansen

Rzeczywiście miło! Znacznie mniejsza niż moja próba , chociaż zastosowaliśmy podejście simar!
Dom Hastings,

@DomHastings Tak długo, że link nawet nie działa ;-)
ETHproductions

15

Haskell , długość linii 6, 400 343 336 bajtów

{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':
'=':
[]}

Wypróbuj online! Nie znam sposobu na obejście putStr, dlatego długość linii wynosi 6. Zewnętrzne nawiasy klamrowe pozwalają pozbyć się innego wymaganego wcięcia po nowej linii w obrębie jednej deklaracji.



12

CJam , długość linii 1, 16 13 bajtów

"
_
p
"

_
p

Wypróbuj online!

To mały cud, że wstawianie nowego wiersza w standardowej quinie,{"_~"}_~ nawet krótsza standardowa quina, "_p"␊_probi dobrze. (Dzięki, Martin!) Końcowy znak nowej linii jest konieczny.

Objaśnienie (z • jako nowy wiersz)

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

Po zakończeniu drukowane jest to, co zostało na stosie ( •_•p•), uzyskując całkowitą wydajność "•_•p•"••_•p•.


2
Wszystko co muszę powiedzieć to ... • _ •
corsiKa

6

Haskell + CPP, długość linii 2, 705 237 bajtów

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\
=\
"\

Wypróbuj online! Użycie flagi, -CPPktóra włącza preprocesor C, pozwala nam użyć ukośnika odwrotnego na końcu linii, aby kontynuować ją w następnej linii.

Rzeczywisty kod to main=putStr$(:"\\\n")=<<s++show s;s="<data>".

Edycja: Dorywczo -468 bajtów dzięki Ørjan Johansen !


1
Oszczędza wiele ucieczki, aby to zmienić main=putStr$(:"\\\n")=<<s++show s;s="<data>". Wypróbuj online!
Ørjan Johansen

5

Rdza, długość linii: 5, bajty: 301 299

Wypróbuj online

Pomimo tego, jak to wygląda, nie jest to ezoteryczny język programowania, jest tylko dużo szumu linii formatu.

Aby móc użyć, wybrano pionową długość 5 print. Nie sądzę, że istnieje sposób na wydruk, który miałby krótszą długość w pionie, deklarując, że funkcje C używają externsłowa kluczowego, stdoutma 6 bajtów długości, write5 bajtów długości, no_main7 bajtów długości (main jest zwykle funkcją;)).

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

Czy to nie długość pozioma ?
anatolyg

@anatolyg naprawiono
Konrad Borowski

Zagnieżdżanie nieprzetworzonych ciągów znaków bez podświetlania składni uniemożliwia interpretację. Nie sądzę, cargo fmtżeby tu nawet pomógł ...
97 CAD

@ CAD97 Jeśli chcesz wyróżniać składnię, play.rust-lang.org poprawnie to zaznacza, dlatego użyłem go zamiast TIO do linku „Wypróbuj online”.
Konrad Borowski,




2

Czerwona , długość linii: 10, 49 bajtów

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

Wypróbuj online!

W rzeczywistości jest to reine quine

Objaśnienie: Kolor czerwony / Rebol jest moldzgodny ze stylem kodowania polegającym na przesunięciu 4 spacji.

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 bajtów

«
Ø
.
`
-
S
`
.

Jest to równoważne z programem:

«Ø.`
-S`
.

Awaria

«najpierw wypycha funkcję reprezentującą niejawnie resztę programu na stos, a następnie kontynuuje wykonywanie. Ø.dołącza pusty ciąg do funkcji, która go uszeregowuje. To zawsze będzie rygorystycznie podobne do programu ekwiwalentnego, ponieważ nowe linie nie będą działać. `\n-Usuwa wszystkie znaki nowej linii z łańcucha, teraz wyglądające jak «Ø.`=S`.. Snastępnie przekształca go w stos pojedynczych znaków i `\n.dołącza do stosu przez nowe linie, zwracając oczekiwany program.

Wypróbuj online!


2

Niedociążenie , długość linii 1, 20 bajtów

(
:
a
S
S
)
:
a
S
S

Wypróbuj online!

To tylko standardowa quine niedociążenia z dołączonymi znakami nowej linii. Wymaga implementacji takiej jak TIO, która ignoruje nieznane znaki poleceń.

Część w ()jest dosłownym ciągiem umieszczanym na stosie, :powielanym, azawijającym górny wpis stosu w nawiasach i Sdrukowanym.


2

Perl 5 , 259 bajtów


$
_
=
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
"
}

Wypróbuj online!

Weryfikacja .


1

JavaScript (ES6 REPL), pełny program, długość linii: 3, liczba bajtów: 31

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

To jest port odpowiedzi @ kamoroso94 na samodzielny pełny program.

Jeśli ktoś znajdzie sposób na usunięcie niektórych bajtów bez dodawania więcej do długości linii, możesz komentować :)


Zauważ, że to tak naprawdę nic nie wyświetla, chyba że uruchomisz to w REPL. Nazwałbym to JavaScript (ES6 REPL)
ETHprodukcje

och, strzelaj, sposób na przyzwyczajenie się do konsoli Chrome ...
Brian H.

1

Pip , długość linii 1, 35 bajtów


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

Wypróbuj online!

W oparciu o najkrótszy znany Pip Quine'a, V Y"`V Y`.RPy". Główną trudnością w ściśnięciu go do długości linii 1 jest to RP, że nie można go podzielić na dwie linie. Ale w tym przypadku wszystko RP(repr) robi zawijanie łańcucha w podwójne cudzysłowy, co możemy zrobić bezpośrednio.

Oto wyjaśnienie oparte na wersji poziomej:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.