triplegolf - nicht nur die Länge des Quellcodes zählt!

15

Das Ziel dieser Herausforderung ist es, ein Programm zu schreiben, bei dem die Länge der folgenden drei genau gleich ist:

  • die Länge des Quellcodes
  • Die Länge der Ausgabe, die als Standardausgabe ausgegeben wird
  • Die Länge der Compiler-Warnungen, die mit dem (nicht modifizierten) Compiler Ihrer Wahl generiert werden

Der Gewinner ist der kürzeste Code, der alle drei Kriterien erfüllt, und muss mindestens 1 Zeichen lang sein.

Wenn die Ausgabe weniger als drei verschiedene Zeichen enthält, wird die Länge für jedes Zeichen um 5 Punkte erhöht (also +10, wenn es sich nur um einen einzelnen Typ handelt, +5 für zwei).

(Zeilenumbrüche zählen entweder als 1 oder 2 Zeichen, müssen jedoch in allen drei Kriterien konsistent sein. Führende und nachfolgende Leerzeichen werden in allen Zeilen in allen drei Kriterien ignoriert.)

Bei gleicher Punktzahl gewinnt derjenige, der das interessanteste Ergebnis (anstelle von Müll) ausgibt.

vsz
quelle
1
Was ist eine "Art von Charakter"?
Peter Taylor
5
Was ist auch, wenn der Compiler keine Warnmeldung ausgibt (z. B. "Compiling Main")? Was ist auch, wenn der Name der Quelldatei in Warnmeldungen erscheint (z. B. "foo.c: 1: 1: ...")?
Joey Adams
3
Meine bevorzugte Waffe ist VBA, das keinen Compiler besitzt und keine Binärdatei zum Ausführen ausgibt (wie es meiner Meinung nach bei einigen anderen Sprachen der Fall ist). Gibt es dafür Überlegungen oder bin ich nur standardmäßig disqualifiziert?
Gaffi
2
Ich frage mich, ob ein Triple-Quine in einer Sprache möglich ist.
Ry
2
Für interpretierte Sprachen erhalten wir auch bei Auftreten eines Fehlers eine Ausgabe. Werden in einem solchen Fall diese Fehler akzeptiert oder werden nur Warnungen akzeptiert?
l0n3sh4rk

Antworten:

14

Bash, 23 Zeichen

Error:

bash: /: Is a directory

Quelle:

echo       $0-$01234;/;

Ausgabe:

/bin/bash-/bin/bash1234


Brainf * ck, 32 Zeichen

Dieser Code wird ca. 3 Sekunden lang ausgeführt und stoppt und zeigt den folgenden Fehler und die folgende Ausgabe an.

Error:

bff: out of memory (-2058691272)

Quelle:

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

Ausgabe: (Hexdump)

0505 0505 0505 0404 0404 0404 0303 0303
0303 0202 0202 0202 0101 0101 0101 0000


C, 35 Zeichen

Warnung:

b.c:1:30: warning: division by zero

Quelle und Ausgabe:

main(){system("cat "__FILE__)/0;;;}


PHP, 50 Zeichen

Warnung:

PHP Warning:  Division by zero in /tmp/3 on line 1

Quelle und Ausgabe:

<?php echo (0/0).''.file_get_contents(__FILE__);?>
l0n3sh4rk
quelle
1
Das Bash-Beispiel ist ein Fehler, keine Warnung.
Peter Taylor
Welchen Compiler verwenden Sie für die C-Lösung?
Brotkasten
@breadbox gcc Version 4.7.0 20120505 (Vorabversion) (GCC)
l0n3sh4rk
8

C - 48 Zeichen

main(i){while(++i<49)putchar(i);putchar('\z');}

Hinweis: Beinhaltet eine abschließende (Unix-artige) Newline.

Ausgabe von gcc a.cliest:

a.c:1:41: warning: unknown escape sequence '\z'

Bei der Ausgabe von a.outhandelt es sich meistens um nicht druckbare Zeichen. Nach dem Piping durch hexdump sieht es also so aus:

00000000: 0203 0405 0607 0809 0A0B 0C0D 0E0F 1011  ................
00000010: 1213 1415 1617 1819 1A1B 1C1D 1E1F 2021  .............. !
00000020: 2223 2425 2627 2829 2A2B 2C2D 2E2F 307A  "#$%&'()*+,-./0z
Brot-Box
quelle
Mein Verständnis ist, dass nicht druckbare (Leerzeichen?) Abgeschnitten werden, so dass dies nicht zählen würde. Wenn das funktioniert, kann ich meine eigene Antwort verbessern.
Gaffi
1
Steuerzeichen werden normalerweise nicht als Leerzeichen betrachtet, außer natürlich für \ t, \ n, \ r, \ f und manchmal \ v. Keiner von diesen befindet sich an der vorderen oder hinteren Position, also dachte ich, ich wäre in Sicherheit.
Brotkasten
1
Ich denke das ist vollkommen akzeptabel. Sie sind nicht Leerzeichen, und in beiden Fällen ist dies nicht ACM zu sein , dass streng mit den Anforderungen. Der Hauptgrund für diese "Whitespace-Regel" war, dass einige IDEs ihre Compiler-Ausgabe möglicherweise stark formatieren.
vsz
1
@copy, oder main(i){i='\z';while(i-->74)putchar(i);}- aber das Reduzieren der Programmgröße ist eigentlich kontraproduktiv.
Brotkasten
1
Dies ist meine Lieblingsantwort, ich weiß, dass ich den Zugriff auf den Inhalt der Datei hätte untersagen sollen (genau wie bei echten Quines)
vsz
5

JavaScript, 63 66

!function x(){console.log(x+'...');eval(Array(33).join('$'))}()

Die Ausgabe ist:

function x(){console.log(x+'...');eval(Array(33).join('$'))}...

In Chrome ist der Fehler:

ReferenceError: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ is not defined
Ry-
quelle
3

Visual Basic .NET, 185

Gee, vbcist mit seinen Zusammenstellungswarnungen ziemlich wortreich. Wie auch immer, der Code lautet:

Public Module Main
    Public Sub Main()
        Console.WriteLine(New String("a"c,185))
    End Sub

    Public Function A()
        'This is actually just padding.
        'Hi
    End Function
End Module

(Beachten Sie, dass es sich um Tabulatoren und nicht um Leerzeichen handeln soll.)

Die Ausgabe lautet wie folgt:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Und die Compiler-Warnung lautet:

warning BC42105: Function 'A' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.

    End Function
    ~~~~~~~~~~~~

(Dieses Mal sind es vier Leerzeichen, keine Tabulatoren.)

Ry-
quelle
3

Zsh , 20 Bytes

<<<   $-$_$_$_$_$_
[

Auf das Problem, mit dem wir hier konfrontiert sind, wird in einem Kommentar oben hingewiesen: Zsh gibt vor jedem Fehler den Programmnamen zusätzlich zur Zeilennummer aus. Die Lösung hier verwendet einen Dateinamen mit einem Zeichen, um dies zu missbrauchen. Ich habe es in ein Hilfsskript verpackt, um genau zu zeigen, was es druckt, und es wc -cfür stderr, stdout und die Quelldatei verwendet.

Ausgabe: 569Xcatcatcatcatcatgefolgt von einem Zeilenumbruch
Fehler: s:[:2: ']' expectedgefolgt von einem Zeilenumbruch


BEARBEITEN: Alternative 20-Byte-Lösung ohne Dateieinschränkung:

<<<$-$-$-$-$_>&1 >&2

Probieren Sie es online!

Zsh , zsh -x10 Bytes

<<<$_$_$_

-xflag aktiviert xtrace. Dies erfordert wiederum einen Dateinamen mit einem Zeichen. Probieren Sie es online!

Zsh zsh -JNTwEDY , 12 Bytes

<<<$->&1 >&2

Kürzeste -flagAntwort ohne Dateinamenanforderung. Setzt mehr Flags und $-druckt sie alle. Probieren Sie es online!

GammaFunktion
quelle
2

JavaScript (Firefox 54), 34 Byte

alert((f=function(x)1234)(56)+f+f)

Ausgänge:

1234function(x)1234function(x)1234

Und es sendet diese Warnung an die Browserkonsole:

expression closures are deprecated

Es sieht aus wie dies in meiner Version von Firefox Developer Edition (54.0a2). Möglicherweise funktioniert es auch in anderen Firefox-Versionen.

ETHproductions
quelle
2

Ruby, 48 Zeichen

IO=1;puts ?a*48;# let's make it 48 bytes long :)

Ausgänge

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Warnt

r.rb:1: warning: already initialized constant IO

(Die Datei ist r.rb. Ich habe den Pfad entfernt. Wenn Sie sie von irb ausführen, erhalten Sie (irb): 1: Warnung ...)

In Ruby gibt es die warn-Methode, die jedoch nur ihre Argumente an $ stderr ausgibt, sodass sie weniger wie eine Warnung aussieht.

Redouane Red
quelle
1

Python, 57 Bytes

Andere Dolmetscher zeigen die Warnung möglicherweise anders an. Dies wurde nur für TIO getestet.

from warnings import*
print("prt"*19)
warn("Warning...!")

Probieren Sie es online aus

Ausgabe

prtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprt

Warnung

.code.tio:3: UserWarning: Warning...!
  warn("Warning...!")

Beachten Sie, dass die führenden Leerzeichen nicht für die Byteanzahl gezählt werden. Wenn die führenden Leerzeichen nicht ignoriert würden, könnte dies in 51 Bytes erfolgen.

mbomb007
quelle
1

Javascript (ES6), 32-30 Bytes

Screen(console.log(Function));

druckt

ƒ Function() { [native code] }

in Chrome und wirft dann

TypeError: Illegal constructor

Meine ursprüngliche 32-Byte-Lösung:

(x=y=>console.log(x+!0+10)||z)()

zuerst druckt

y=>console.log(x+!0+10)||ztrue10

Und wirft den Fehler

ReferenceError: z is not defined
vrugtehagel
quelle
0

VBA, 39 Bytes

Ich bin nicht sicher, ob dies aufgrund der Compiler-Einschränkung geeignet ist, aber:

Eingabe: (im direkten Fenster)

For i=1 To 39:a=a & Chr(i):Next:Print a

* Die Ausgabe enthält nicht druckbare Zeichen, die in diesem Fenster nicht gut wiedergegeben werden.

Gaffi
quelle
VBA gibt keine Compiler-Warnungen, daher glaube ich nicht, dass dies als gültig gilt
Taylor Scott
0

Perl 6 , 10 Bytes

dd say 1e9

Probieren Sie es online!

Drucke 1000000000auf STDOUT und Bool::Truezu STDERR. Beide erzeugen einen abschließenden Zeilenumbruch, der abschließende Leerraum wird bei dieser Abfrage jedoch ignoriert. ddist eine Rakudo-spezifische Debugging-Funktion

Scherzen
quelle