Dans le cadre de sa réponse à Make a Error Quine! @Falko a proposé l’algorithme suivant:
Comment créer sa propre solution en 2 minutes?
- Ouvrez un nouveau fichier dans l'EDI de votre choix.
- Frappe ta tête contre le clavier devant toi.
- Compiler.
- Remplacez le code par le message d'erreur du compilateur.
- Répétez les étapes 3 et 4 jusqu'à ce que le code converge.
Je parie qu'une telle procédure se termine assez rapidement dans la plupart des cas!
Tâche
Votre tâche est de lui prouver le contraire.
Ecrivez un programme complet qui satisfait aux critères suivants:
Une fois compilé ou interprété, il génère un message d'erreur qui, lorsqu'il est compilé ou interprété à tour de rôle, génère également un message d'erreur.
Si vous répétez l’étape 1 à plusieurs reprises, vous rencontrerez éventuellement un point fixe, c’est-à-dire un quine d’erreur.
Règles supplémentaires
Le message d'erreur final doit avoir une longueur positive. Toutefois, les messages d'erreur précédents et le code source d'origine peuvent être vides.
La longueur du code source d'origine ne doit pas dépasser 1024 octets.
Ni le code original ni le code généré à l'une des étapes ne peuvent produire une sortie non erronée.
La sortie doit être clairement identifiable en tant que message d'erreur, qui doit être généré par le compilateur / interprète en raison d'une erreur de syntaxe, d'une erreur d'exécution, d'une référence non définie, etc.
Votre programme peut ne recevoir aucune entrée ou requérir aucun indicateur pour produire la boucle.
Votre programme peut s’appuyer sur une implémentation spécifique de son langage ou de sa version.
Notation
Votre score est le nombre fini d’étapes requis par votre code source avant de générer un quine d’erreur. La soumission avec le score le plus élevé gagne.
La longueur du code source original sera utilisée comme condition de départage. Plus c'est court, mieux c'est.
Exemple
Au poulet , le programme
génère le message d'erreur suivant:
TypeError: Cannot read property 'NaN' of undefined
Si ce message d'erreur est, à son tour, interprété, il produit le message d'erreur
Error on line 1: expected 'chicken'
qui, s’il est interprété à son tour, se produit.
Ainsi, le score du programme de poulet vide est 2.
Contre-exemple
Le code PHP
ab<?=c
génère le message d'erreur
PHP Parse error: syntax error, unexpected '?' in Command line code on line 1
qui se produit lorsqu'il est interprété.
Cependant, le second code source imprime le message à STDOUT, rendant cette séquence invalide.
Segmentation fault (core dumped)
.Réponses:
Bash, 9223372036854775810
Inspiré par la réponse de la poignée de porte.
Il doit être exécuté avec
bash < file.sh
, ou utiliser le même nom de fichier pour chaque programme, afin de supprimer les différents noms de fichiers dans les messages d'erreur.Les premières erreurs sont (avec
LANG=C
):Et enfin:
ce qui est une erreur quine.
la source
bc
ou écris mon propre code pour décrémenter.Pip 0.15.05.29 , plus de 10 100 000
Techniquement non valide car il nécessite l'
-w
indicateur pour la sortie d'avertissement. Cela dit, Pip de par sa conception n’affiche aucune erreur d’exécution à moins que le programme ne plante (récursion infinie, par exemple); les problèmes avec ce code sont des choses dont d'autres langues se plaindraient.Le nombre exact d'étapes dépend uniquement de la valeur affectée
i
. Il peut donc être arbitrairement volumineux (jusqu'à ce que l'interpréteur Python manque de mémoire). En outre, il faudrait plus de temps que l'âge de l'univers pour terminer la séquence ci-dessus. (La question a précisé "lent"!)Explication:
Il a fallu passer au peigne fin de l’interprète avant de trouver une erreur qui me permettrait de mettre du code arbitraire dans le message d’avertissement. Après cela, il s'agissait essentiellement de modifier les techniques standard de quine. Exemple utilise une valeur
i
de-5
à des fins d’explication.Une fois les paramètres définis
i
, enregistrez une chaîned
, puis tentez d’exécuter l’S
instruction wap. Swap attend deux variables (plus précisément, lvalues).s
est bien, mais la deuxième expression esti?dRo--iRsRPda
. Sii
est vrai (différent de zéro, pour nos besoins), le ternaire évalue àdRo--iRsRPd
, qui utilise àd
partir de plus tôt pour former un quasi-quine - uniquement aveci
décrémenté. Cette expression n'est pas une lvalue, donc Pip se plaint:... qui recommence ensuite. (
Attempting to swap non-lvalue
est un tas de no-ops:At
calcule la valeur ASCII det = 10
,n-l
soustrait la nouvelle ligne moins chaque valeur d'une liste vide, et toutes les lettres minuscules ne sont que des variables.)Le processus se poursuit de la même manière jusqu'à:
Quand ceci est exécuté,
i
est maintenant faux. L'expression ternaire est évaluée à la branche elsea
- qui est une valeur. Ainsi, swap ne se plaint plus. Au lieu de cela, nous obtenons:Et en exécutant ceci, nous avons enfin une erreur de syntaxe:
... à quel moment, depuis le début du "programme"
R
, Pip continuera à se plaindre deR
ne pas être un opérateur unaire pour toujours.La meilleure solution que ne pas utiliser
-w
est de longueur 3:la source
-w
compte comme un langage de programmation selon le méta consensusJulia, 3
Un simple pour faire avancer les choses ...
Programme initial:
Erreur 1:
Cela peut ne pas être défini, mais si c'est espagnol , c'est aussi inattendu. Personne ne s'attend à l'inquisition espagnole.
Erreur 2:
Erreur 3:
Le troisième message d'erreur, lorsqu'il est soumis en tant que programme, produit la même erreur, d'où le score de 3.
Travaux en cours! Je peux sûrement faire mieux que 3.
la source
R, 5
Programme initial:
Erreur 1:
Erreur 2:
Erreur 3:
Erreur 4:
Erreur 5 (Quine):
la source
Bash, 3
Un script shell très rudimentaire pour le tester:
la source
stdout
. S'il y astdout
etstderr
, il ne fonctionnera pas correctement.Ruby, 5
Programme initial
1
2
3
4
5 (Quine)
la source
Java, 5
Celles-ci sont très longues ... j'ai donc vérifié l'égalité des chaînes en utilisant un script Python, et j'ai généré cette publication formatée, de sorte que je n'aurais pas à insérer manuellement des tabulations sur 400 lignes.
Programme initial
1
2
3
4
5 (Quine) - Omis en raison de la longueur du poteau.
la source
javac -version
)?Javascript, 3 niveaux d'erreur
Ce n'est pas ce "couperet" ou quoi que ce soit, mais j'ai trouvé ça plutôt bizarre ...
Erreur 0 (original):
Erreur 1:
Erreur 2:
Erreur 3 (quine):
Tout cela a été renvoyé sur Internet Explorer 11.0.9600.17416, les erreurs étant traduites en anglais.
Capture d'écran:
* Les messages d'erreur sont affichés en portugais et peuvent être facilement traduits en anglais.
la source
JS dans Firefox 66.0; 3 niveaux d'erreur
Contribution:
6?4;
Erreur n ° 1 = entrée n ° 2:
missing : in conditional expression
Erreur n ° 2 = entrée n ° 3:
expected expression, got keyword 'in'
Erreur n ° 3 = entrée n ° 4 = erreur n ° 4:
unexpected token: identifier
C'est le plus haut que j'ai eu.
la source