Votre défi est simple: écrire tant d'un programme vierge que possible dans la langue de votre choix en utilisant uniquement les octets uniques. (La définition complète d'un programme vierge, copiée à partir de ce lien, se trouve au bas de cette question.)
C'est vrai, sans aucune condition. Votre code n'a rien à faire, il suffit de l'exécuter sans erreur, de répondre aux exigences d'un programme vierge (lié ci-dessus) et d'inclure aucun octet en double dans le codage que vous utilisez.
Aux fins de l'explication ci-dessus et de la définition associée de «programme vierge», une erreur est définie comme tout ce qui empêche le programme de s'exécuter complètement ou de se terminer par un code de sortie non nul après un laps de temps déterminé.
Comme il s'agit d'un code bowling , le code le plus long , pas le plus court, est gagné (mesuré par le nombre d'octets). Le score maximal théoriquement possible est de 256, car il y a 256 octets distincts possibles. En cas d'égalité, la première réponse au score le plus élevé l'emporte.
Voici la définition complète d'un programme vierge, copiée à partir du lien ci-dessus:
Définissons un programme vierge comme un programme qui ne contient aucune erreur, mais qui commettra une erreur si vous le modifiez en supprimant toute sous-chaîne contiguë de N caractères, où
1 <= N < program length
.Par exemple, le programme Python 2 à trois caractères
`8`
est un programme vierge car tous les programmes résultant de la suppression de sous-chaînes de longueur 1 provoquent des erreurs (les erreurs de syntaxe en fait, mais tout type d'erreur suffira):
8` `` `8
ainsi que tous les programmes résultant de la suppression de sous-chaînes de longueur 2 provoquent des erreurs:
` `
Si, par exemple,
`8
il s’agissait d’un programme`8`
ne faisant pas d’ erreur, il ne serait pas parfait, car tous les résultats de la suppression de la sous-chaîne doivent être erronés.
la source
JMP <address outside of the program's memory>
dans l'assemblée. En principe, sur un ordinateur réel, il peut boucler indéfiniment ou sortir avec une erreur non nulle, mais il se plantera généralement de manière spectaculaire.Réponses:
Gelée ,
253 254256 octetsEssayez-le en ligne! ou le vérifier!
Il s'avère que les langues de golf peuvent jouer ...
‘
.Maintenant seulement ne«»
sont pas utilisés«»
. Maintenant, avoir le score optimal!Comment?
La caractéristique cruciale de Jelly qui rend cela possible est que les caractères d'ouverture et de fermeture des littéraux de chaîne ne sont pas les mêmes que dans presque toutes les autres langues.
La structure du programme est la suivante:
M <239 character long string> L»«’Ɗạ‘}237$¤¡
M
trouve les indices de son argument qui pointent vers des éléments maximaux. Tout ce qui compte, c’est que, sans argument, Jelly attribue0
à la chaîne les erreurs chaîne et Jelly lorsqu’ilM
est appliqué0
.Pour éviter
M
d’agir0
dans le programme complet, nous utilisons le¡
rapide, qui appliqueM
un nombre de fois déterminé par le résultat du lien le précédant immédiatement. Dans ce cas, ce lien est<239 character long string> L»«’Ɗạ‘}237$¤
.L
prend la longueur de cette chaîne (239) et la»«’Ɗ
décrémente en 238. La»«
partie ne fait rien saufƊ
(les trois derniers liens en tant que monade) font en sorte que s'ils sont supprimés, une erreur se produise. Prend ensuiteạ
la différence absolue entre le résultat de»«’Ɗ
et la monade‘}237$
appliquée à la chaîne.‘
incrémente et est une monade, mais le}
transforme en une dyade et l’applique à son bon argument237
, cédant238
. Ainsi, lesạ
rendements0
dans le programme complet.¤
renvoie au littéral de chaîne formant un nilad. Le résultat de ceci est0
, doncM
n'est pas appliqué du tout, empêchant toute erreur.Sous-programmes possibles:
<string>..¤
sera différente de zéro et seraM
appliquée0
, provoquant une erreur.L»«’Ɗạ‘}237$
est supprimée, elleM
sera appliquée0
ou il y aura des opérations entre la chaîne et un nombre, ce qui entraînera unTypeError
.¤¡
est supprimé,M
est appliqué à0
.”
et les deux’‘
sont supprimés et“
ne le sont pas, toutM
se transformera ensuite en une chaîne, de manière àM
agir0
.”
et’
est supprimée et“
ne disparaît pas, tout se trouve entre”
et‘
se transforme en une liste d'entiers.M
seul est supprimé, il y a unEOFError
car¡
attend un lien avant le nilad précédent.M“
et un nombre quelconque de caractères après sa suppression, il y en aura unEOFError
car la¤
recherche d'un nilad le précédant mais n'en trouve pas.238
ne compte pas car il fait partie d'une monade.Cela couvre à peu près tout.
Je n'avais pas utilisé auparavant,
«»‘
car les deux derniers ne peuvent pas être inclus dans la chaîne, car ils correspondent au“
caractère pour former des éléments autres que des chaînes.«
ne peut pas être dans une“”
chaîne non plus mais je ne sais pas pourquoi.la source
Haskell ,
3945505260 octetsL'identifiant
main
doit avoir un typeIO a
pour un type a. Lorsque le programme est exécuté, le calculmain
est effectué et son résultat est ignoré. Dans ce cas, son type estIO ((a,b)->a)
.Le résultat est une application de la fonction
(λ a b c d e f → return fst)
, une fonction constante à six arguments renvoyant la fonction fst (qui donne le premier élément d'un tuple à 2), injectée dans la monade IO. Les six arguments sontLT
(ENUM pour moins),EQ
(ENUM pour l' égalité), liste vide[]
,3
,2
et1
.Quels seraient les espaces sont remplacés par des caractères uniques qui comptent comme des espaces: une tabulation, un espace insécable, un saut de page, une tabulation verticale, OGHAM SPACE MARK, une espace normal, une nouvelle ligne et un retour à la ligne. Si l'un de ces éléments manque, le nombre d'arguments sera différent. Les noms de paramètre sont choisis en tant que caractères UTF-8 à trois ou quatre octets
𤶸陸ⵙ商ߜ新
, en choisissant avec soin les caractères qui ne génèrent pas d'octets en double.Merci à @BMO pour ses précieuses contributions.
Décharge Hex:
Essayez-le en ligne!
la source
'\109999'
semble être valide, du moins dans GHC 8.2.2.'\10999a'
produit une erreur lexicale.
génère également une erreur lexicale.maxBound :: Char
, à savoir'\1114111'
. Note: les nombres sont décimaux par défaut, donc si vous voulez un hex, vous devez mettre unx
après le\
, par exemple'\x10999a'
.\x10ffff
fonctionne bien et\x110000
fournit une erreur hors de portée, comme on pourrait s'y attendre.Python 2 ,
20 21 33 39 4550 octetsMaintenant, un effort de collaboration!
+2 grâce à Aidan F. Pierce (remplace
sorted({0})
parmap(long,{0})
)+8 grâce à dylnan (utilisation de
\
et newline pour remplacer l’espace; suggestions pour passer d’0
une expression mathématique-1
à la place de-True
; utilisation de; utilisation d’hexadécimal)+11 grâce à Angs (
4*23+~91
->~4836+9*1075/2
puis plus tard~197836254+0xbCABdDF
->~875+0xDEAdFBCbc%1439/2*6
)Essayez-le en ligne! Ou voir la suite de confirmation
0xDEAdFBCbc
est hexadécimal et est évalué à59775106236
.~
est un complément binaire pour être~875
évalué-876
.%
est l'opérateur modulo pour être0xDEAdFBCbc%1439
évalué à293
./
est la division entière alors0xDEAdFBCbc%1439/2
évalue à146
.*
est la multiplication alorsxDEAdFBCbc%1439/2*6
évalue à876
.+
est l'addition alors~875+xDEAdFBCbc%1439/2*6
évalue à0
.... aucune version dépouillée n'évalue également
0
.{0}
est unset
contenant un seul élément,0
.L'appel
sorted
avec aset
comme argument donne une liste, qui peut être indexée avec[...]
.Sans pour autant
sorted
le code, on({0})
obtiendrait simplement leset
et cela ne pourrait pas être indexé de la même manière,if({0})[-True]:q
cela augmenterait unTypeError
.L'indexation en Python est basée sur 0 et permet une indexation négative à partir de l'arrière et
True
est équivalente à1
,sorted({0})[-True]
trouve donc l'élément0
, tandis que la syntaxesorted({0})[True]
sera généréeIndexError
comme elle le serasorted({})[-True]
etsorted({0})[]
est invalide.le
0
qui se trouve est falsey donc le corps de laif
,q
n'est jamais exécuté, mais il risquerait de lever unNameError
depuis car ilq
n'a pas été défini.Puisqu'une liste non vide est la vérité, nous ne pouvons pas réduire à l'un
if[-1]:q
ou à l' autre.Voir la suite de confirmation pour voir: confirmation que les octets sont uniques; toutes les erreurs; et le succès du code lui-même.
la source
C (tcc) , x86_64,
2931333940 octetsRetourne 0 . Merci à @feersum pour avoir suggéré les chiffres hexadécimaux majuscules.
Essayez-le en ligne!
Comment ça fonctionne
L'affectation écrit deux ints ( 184 et 49664 ) dans l'emplacement de mémoire de main . Avec les bits 32 bits et l’ordre des octets little-endian, les octets exacts sont
b8 00 00 00 00 c2 00 00
.Puisque tcc ne déclare pas le tableau défini en tant que .data (la plupart des compilateurs le feraient), le fait de sauter à main exécute le code machine vers lequel il pointe.
b8 00 00 00 00
(mov eax, imm32
) enregistre l'int 0 dans le registre eax.c2 00 00
(ret imm16
) supprime 0 octet supplémentaire de la pile et retourne. (La valeur dans le registre eax est la valeur de retour de la fonction).la source
> <> , 122 octets
Essayez-le en ligne!
Ne fait rien. Basé sur le même format que celui de ma réponse Programmer un monde vierge.
Premièrement, nous vérifions que la longueur du code est 122 et une erreur si ce n’est pas le cas.
><>
les programmes ne peuvent pas se terminer sans l'utilisation de la;
commande, mais si cette commande est dans le programme, nous pouvons simplement supprimer tout ce qui la précède pour que le programme se termine immédiatement. Pour lutter contre cela, nous utilisons lap
commande pour placer un;
dans le code pendant l'exécution. Pour ce faire, on soustrait 6 deA
et on le place après lep
.J'ajouterai probablement la plupart des autres valeurs supérieures à 127 une fois les valeurs correctes sur deux octets. Les 5 valeurs manquantes sont
v^;
et les deux nouvelles lignes.Parmi les 7502 sous-programmes, 7417 d'entre eux sont erronés à partir d'instructions non valides, 72 à partir de mémoire insuffisante et 13 à court de mémoire.
la source
JavaScript, 42 octets
i
,f
ouif
va causerSyntaxError: missing ; before statement
;田
va causerSyntaxError: expected expression, got end of script
;田
causeraInvalid or unexpected token
;田
Afficher l'extrait de code
la source
Brain-Flak , 2 octets
Essayez-le en ligne!
Alternativement
[]
,{}
ou()
. Si vous enlevez un support, l’autre support devient inégalé.Preuve qu'il s'agit de la solution optimale:
Un programme Brain-Flak est constitué de nilads (une paire de crochets isolés) ou de monades (une paire de crochets contenant un ou plusieurs nilads). Une monade ne peut pas être dans un programme vierge, vous pouvez simplement supprimer un ou plusieurs nilads. De même, vous ne pouvez pas avoir plus d'un nilad dans le programme, car vous pouvez en supprimer un sans casser le programme.
En tant que tel, cela pourrait être le langage le moins optimal pour une programmation vierge ou unique.
la source
Ada, 110 octets (latin1)
Probablement la meilleure réponse que vous puissiez tirer de n’importe quelle langue utilisée dans l’industrie?
Hexdump:
Compiler en enregistrant dans n'importe quel fichier se terminant
.ads
et en cours d'exécutiongcc -c <filename>
. Produit un exécutable qui ne fait rien. (Impossible de fournir le lien TIO car TIO place le code dans un.adb
fichier etgcc
tente par défaut de trouver une spécification correspondante pour celui-ci.)Déclare fondamentalement un paquet avec un nom abusant des lettres majuscules / minuscules latines1. Nécessite un caractère d'espacement différent pour chacun des espaces. Par conséquent, il utilise les espaces, CR, LF et TAB.
A quoi ça ressemble dans la version vim:
Comment ça fonctionne
Dans Ada, même les spécifications peuvent être compilées. Les spécifications ressemblent aux fichiers d’en-tête de c, mais sont plus complètes et peuvent compiler du code de base. Pour être valide, toute spécification doit avoir le format:
package <NAME> is ... end <NAME>;
avec<NAME>
correspondance. La bonne chose à propos de Ada est qu’il est totalement insensible à la casse. Ainsi, tant que votre nom contient des variantes majuscules et minuscules, vous serez prêt à partir!La partie difficile devenait une unité compilable. Normalement, les programmes Ada ont une procédure ou une fonction "principale" se trouvant en dehors de tout paquet qui deviendra l'exécutable final. Malheureusement, les procédures requièrent le
begin
mot - clé, ce qui entraîne trop dee
s (deux cas seulement sont connus), tandis que les fonctions requièrent lereturn
mot - clé, ce qui conduit à trop den
s. Je devais donc juste compiler un paquet.la source
C, 8 octets
Ne fait rien.
Essayez-le en ligne!
la source
main(){short x;}
main(){short;}
compile avec seulement awarning: useless type name in empty declaration
. Je pense que C99 et C ++ nécessitent un type de retour explicite, doncint main
(ou peut-êtreunsigned main
) pourrait fonctionner, mais pas avec gcc qui ne prévient que même avec-std=c11
.return 0;
pourrait être possible avec C89, où il n'y a pas implicitereturn 0
à la fin demain
. Sortir avec un statut différent de zéro peut être considéré comme un échec, selon d'autres réponses. L'ajout de drapeaux de compilateur comme celui-ci-Werror
compte pour le score dans le bowling de code? Parce que l'application stricte des violations de la loi C11 pourrait permettre un programme beaucoup plus long. Hmm,#include<>
quelque chose et ensuite l'utiliser; vous ne pouvez pas supprimer à la fois l'inclusion et l'utilisation, et si cela se bloque sans prototype ou macro, vous gagnez.main
etinclude
contiennent tous les deuxi
, de sorte que vous ne pouvez pas avoir les deux. De même pour déclarer et utiliser une fonction. Aussi en utilisantreturn
tout viennent y penser.int main
ne peut pas travailler.JavaScript, 22 octets
Essayez-le en ligne!
Erreurs possibles
Une fois modifié, il générera l'une des erreurs suivantes 1 :
1. Le nombre exact d’erreurs distinctes dépend du moteur. Cette liste a été générée avec SpiderMonkey (Firefox).
la source
Python 3 + Flask-Env ,
7131417 octetsPas de TIO car il n'en a pas
flask-env
.Vous
import
avez trouvé le nom de module le plus long qui n'a pas d'intersection ni de numéro à la fin du nom._sha256
est plus long mais256
seul ne fait pas d'erreur. J'ai trouvé une bibliothèque,b3j0f.sync
c'est un octet de plus mais je ne pouvais pas l'importer correctement.import
avec\<newline>
. Supprimer l'une ou les deux provoque une erreur.Il y a peut-être encore des options plus longues que
flask_env
, je n'ai pas vraiment fait de recherche exhaustive, mais j'ai parcouru environ 70 000 modules. Ouvert aux suggestions.la source
256
fonctionne sans erreur.import *[hawkey]
et similaire mais malheureusement ne fonctionne pas ...R , 14 octets
Essayez-le en ligne!
Cela peut être le plus long possible dans R. L'appel de toute fonction est voué à l'échec, car vous pourriez tout supprimer sauf le nom de la fonction, ce qui entraînerait simplement l'impression du code source de la fonction. Il s’agit de l’objet nommé le plus long de la configuration R par défaut, sans caractères en double ni nom d’objet lors de la suppression des caractères contigus.
Ce premier essai n'a pas fonctionné, mais j'ai beaucoup appris en essayant!
dontCheck({family;NROW})
la source
Perl 5, 3 octets
=>
est la "grosse virgule", qui cite le mot simple à gauche. Donc, cela équivaut àqui ne fait rien.
Sans la grosse virgule,
y
l’opérateur de translittération est invalide sans que trois caractères identiques ne se répètent plus tard.La grosse virgule seule est également invalide, telle quelle
=
et>
seule.la source
brainfuck , 2 octets
Essayez-le en ligne!
Inspiré par la réponse Brain-Flak de Jo King . Ceci est optimal car la seule erreur de brainfuck réside dans des parenthèses incomparables. (Encore merci à Jo King pour cette info.)
la source
Ruby , 28 octets
Essayez-le en ligne!
Vérifiez le!
la source
ML standard , 22 octets
Essayez-le en ligne!
op-(a,b)
est la forme décapée dea-b
.~
dénote le moins unaire, donc nous calculons réellement765+324
. Cette expression correspond à un motif sur la constante1089
. Cette correspondance réussit si le programme n'a pas été falsifié et le fait - eh bien, rien.Si la correspondance échoue parce que certains chiffres ont été supprimés, on obtient un
unhandled exception: Bind
. La suppression desop-
résultats entraîne une erreur de type car un tuple est associé à unint
. Toutes les autres suppressions doivent entraîner une erreur de syntaxe.la source
Swift 4 , 19 octets
Essayez-le en ligne!
Toutes les erreurs possibles que j'ai trouvées sont:
[
,]
,{
ou}
entraînera une erreur de syntaxe[].
aura comme conséquenceUse of unresolved identifier 'contains'
.
aura comme conséquenceConsecutive statements on a line must be separated by ';'
[]
aura comme conséquenceReference to member 'contains' cannot be resolved without a contextual type
{1 !=␊0}
aura comme conséquenceExpression resolves to an unused function
1 !=␊0
aura comme conséquenceMissing return in a closure expected to return 'Bool'
'!=' is not a prefix unary operator
'=' must have consistent whitespace on both sides
!=
aura comme conséquenceMissing return in a closure expected to return 'Bool'
Consecutive statements on a line must be separated by ';'
Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
[].contains
aura comme conséquenceClosure expression is unused
Quelques autres programmes intéressants sont (un sur chaque ligne):
la source
a
sTcl , 6 octets
Essayez-le en ligne!
Tcl , 3 octets
Essayez-le en ligne!
Tcl , 2 octets
Essayez-le en ligne!
la source
Lot, 7 octets
Un bon début
la source
Rétine , 2 octets
Je ne serais pas surpris si cela est optimal ...
Essayez-le en ligne!
La regex contient un groupe vide. La suppression de l'un des parens provoquera une erreur d'analyse due à des parenthèses non appariées.
D' autres solutions sont:
\(
,\)
,\[
,\]
,\*
,\+
,\?
,a]
la source
a]
ne fait pas d'erreur.