triplegolf - non seulement la longueur du code source compte!

15

Le but de ce défi est d'écrire un programme où la longueur des trois suivantes est exactement la même:

  • la longueur du code source
  • la longueur de la sortie imprimée sur la sortie standard
  • la longueur des avertissements du compilateur qu'il génère avec le compilateur (non modifié) de votre choix

Le gagnant est le code le plus court pour répondre aux trois critères et doit comporter au moins 1 caractère.

Pour pimenter les choses, si la sortie a moins de trois caractères différents, elle obtient une pénalité de 5 points ajoutée à la longueur de chacun (donc +10 si un seul type, +5 pour deux).

(Les sauts de ligne comptent pour 1 ou 2 caractères, selon votre choix, mais ils doivent être cohérents dans les trois critères. Les espaces blancs de début et de fin sont ignorés dans toutes les lignes des trois critères)

En cas de score égal, celui qui imprime le résultat le plus intéressant (au lieu de la poubelle) est le gagnant.

vsz
la source
1
Qu'est-ce qu'un "type de personnage"?
Peter Taylor
5
De plus, que se passe-t-il si le compilateur produit une sortie sans avertissement (par exemple, "Compilation principale")? Et si le nom du fichier source apparaît dans les messages d'avertissement (par exemple "foo.c: 1: 1: ...")?
Joey Adams
3
Mon arme de prédilection est VBA, qui n'a pas vraiment de compilateur et ne génère pas de fichier binaire à exécuter (comme c'est le cas pour d'autres langues, je crois). Y a-t-il des considérations à ce sujet, ou suis-je simplement disqualifié par défaut?
Gaffi
2
Je me demande si une triple quine est possible dans une langue?
Ry-
2
Pour les langages interprétés, nous obtenons une sortie même en cas d'erreur, dans ce cas, ces erreurs sont-elles acceptées ou seuls les avertissements sont-ils acceptés?
l0n3sh4rk

Réponses:

14

Bash, 23 caractères

Erreur:

bash: /: Is a directory

La source:

echo       $0-$01234;/;

Production:

/bin/bash-/bin/bash1234


Brainf * ck, 32 caractères

Ce code s'exécute pendant environ 3 secondes et s'arrête et affiche l'erreur et la sortie suivantes.

Erreur:

bff: out of memory (-2058691272)

La source:

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

Sortie: (Hexdump)

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


C, 35 caractères

Avertissement:

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

Source et sortie:

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


PHP, 50 caractères

Avertissement:

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

Source et sortie:

<?php echo (0/0).''.file_get_contents(__FILE__);?>
l0n3sh4rk
la source
1
L'exemple bash est une erreur, pas un avertissement.
Peter Taylor
Quel compilateur utilisez-vous pour la solution C?
boîte à pain
@breadbox gcc version 4.7.0 20120505 (version préliminaire) (GCC)
l0n3sh4rk
8

C - 48 caractères

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

Remarque: inclut une nouvelle ligne finale (style Unix).

Sortie des gcc a.clectures:

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

La sortie de a.outest principalement des caractères non imprimables, alors voici à quoi cela ressemble après avoir passé par hexdump:

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
boite à pain
la source
Ma compréhension est que les éléments non imprimables (espaces blancs?) Sont tronqués, donc cela ne compterait pas. Si cela fonctionne, je peux améliorer ma propre réponse.
Gaffi
1
Les caractères de contrôle ne sont généralement pas considérés comme des espaces, sauf bien sûr pour \ t, \ n, \ r, \ f, et parfois \ v. Aucun de ceux-ci n'est en position de tête ou de queue, alors j'ai pensé que j'étais en sécurité.
boîte à pain
1
Je pense que c'est parfaitement acceptable. Ce ne sont pas des espaces, et dans les deux cas, ce n'est pas ACM pour être aussi strict avec les exigences. La principale raison de cette «règle des espaces blancs» était que certains IDE pouvaient fortement formater la sortie de leur compilateur.
vsz
1
@copy, Or main(i){i='\z';while(i-->74)putchar(i);}- mais réduire la taille du programme est en fait contre-productif.
boîte à pain
1
Ceci est ma réponse préférée, je sais que j'aurais dû interdire l'accès au contenu du fichier (tout comme les vraies quines)
vsz
5

JavaScript, 63 66

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

La sortie est:

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

Dans Chrome, l'erreur est:

ReferenceError: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ is not defined
Ry-
la source
3

Visual Basic .NET, 185

Gee, vbcest assez verbeux avec ses avertissements de compilation. Quoi qu'il en soit, le code est le suivant:

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

(Notez qu'ils sont censés être des tabulations, pas des espaces.)

La sortie est la suivante:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Et l'avertissement du compilateur est le suivant:

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
    ~~~~~~~~~~~~

(Cette fois, c'est en fait quatre espaces, pas des tabulations.)

Ry-
la source
3

Zsh , 20 octets

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

Le problème auquel nous sommes confrontés ici est évoqué dans un commentaire ci-dessus: Zsh imprime le nom du programme en plus du numéro de ligne avant chaque erreur. La solution ici utilise un nom de fichier à un caractère pour en abuser. Je l'ai enveloppé dans un script d'aide pour montrer exactement ce qu'il imprime et utilisé wc -csur stderr, stdout et le fichier source.

Sortie: 569Xcatcatcatcatcatsuivie d'une nouvelle ligne
Erreurs: s:[:2: ']' expectedsuivie d'une nouvelle ligne


EDIT: solution alternative de 20 octets sans restriction de fichier:

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

Essayez-le en ligne!

Zsh , zsh -x, 10 octets

<<<$_$_$_

-xflag active xtrace. Cela nécessite à nouveau un nom de fichier à un seul caractère. Essayez-le en ligne!

Zsh zsh -JNTwEDY , 12 octets

<<<$->&1 >&2

-flagRéponse la plus courte sans exigence de nom de fichier. Définit plus de drapeaux et les $-imprime tous. Essayez-le en ligne!

GammaFunction
la source
2

JavaScript (Firefox 54), 34 octets

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

Les sorties:

1234function(x)1234function(x)1234

Et il envoie cet avertissement à la console du navigateur:

expression closures are deprecated

Il ressemble à ceci dans ma copie de Firefox Developer Edition (54.0a2). Il peut également fonctionner dans d'autres versions de Firefox.

ETHproductions
la source
2

Ruby, 48 caractères

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

Les sorties

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Avertit

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

(le fichier est r.rb, j'ai supprimé le chemin, si vous l'exécutez depuis irb, vous obtiendrez (irb): 1: avertissement ...)

Il y a la méthode warn dans Ruby, mais elle renvoie juste ses arguments à $ stderr, ce qui la fait ressembler moins à un avertissement.

Redouane Red
la source
1

Python, 57 octets

D'autres interprètes peuvent afficher l'avertissement différemment. Cela n'a été testé que pour fonctionner sur TIO.

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

Essayez-le en ligne

Production

prtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprt

avertissement

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

Notez que les espaces de tête ne sont pas comptés dans le nombre d'octets. Si les espaces de tête n'étaient pas ignorés, cela pourrait être fait en 51 octets.

mbomb007
la source
1

Javascript (ES6), 32 30 octets

Screen(console.log(Function));

impressions

ƒ Function() { [native code] }

dans Chrome, puis jette

TypeError: Illegal constructor

Ma solution originale de 32 octets:

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

d'abord, imprime

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

Et jette l'erreur

ReferenceError: z is not defined
vrugtehagel
la source
0

VBA, 39 octets

Je ne sais pas si cela se qualifie, compte tenu de la contrainte du compilateur, mais:

Entrée: (dans la fenêtre immédiate)

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

* La sortie comprend des caractères non imprimables qui ne jouent pas bien dans cette fenêtre.

Gaffi
la source
VBA ne donne aucun avertissement au compilateur, donc je ne pense pas que cela compte pour être valide
Taylor Scott
0

Perl 6 , 10 octets

dd say 1e9

Essayez-le en ligne!

Imprime 1000000000vers STDOUT et Bool::Truevers STDERR. Les deux produisent une nouvelle ligne de fin, mais les espaces de fin sont ignorés dans ce défi. ddest une fonction de débogage spécifique à Rakudo

Jo King
la source