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 ( merci, Sp ) car tous les programmes résultant de la suppression de sous-chaînes de longueur 1 provoquent des erreurs (des erreurs de syntaxe, mais tout type d'erreur conviendra):
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.
Votre tâche dans ce défi consiste à écrire le programme vierge le plus court possible, qui ne prend aucune entrée, mais génère l'un des cinq mots suivants:
world
earth
globe
planet
sphere
Le mot que vous choisissez est entièrement à vous. Le mot unique plus un caractère de fin de ligne optionnel doivent être imprimés sur la sortie standard (ou l'alternative la plus proche de votre langue). Le programme le plus court en octets gagne.
Remarques:
- Un programme autonome est requis, pas une fonction.
- Les mots sont sensibles à la casse; la sortie
World
ouEARTH
n'est pas autorisée. - Les avertissements du compilateur ne comptent pas comme des erreurs.
- Les sous-programmes en erreur peuvent prendre en entrée ou en sortie ou faire autre chose tant qu'ils finissent toujours par se tromper.
Voici un extrait de pile qui listera les programmes nécessitant une erreur pour un programme potentiellement vierge:
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>function go() { var s = $('#i').val(), e = []; for (var i = 1; i < s.length; i++) { for (var j = 0; j <= s.length - i; j++) { e.push(s.substring(0, j) + s.substring(j + i)); } } $('#o').val(e.join('\n---\n')); }</script>Program:<br><textarea id='i' rows='16' cols='80'>`8`</textarea><br><button onclick='go()' type='button'>Go</button><br><br>Programs that should error: (--- separated)<br><textarea id='o' rows='16' cols='80'></textarea><br>
la source
Réponses:
Rail , 24 octets
Je pense que cela fonctionne. Et c'est à la fois court et lisible (pour le rail).
$'main'
nous obtenonsInternal Error: Crash: No 'main' function found
.#
, il n'y a aucun moyen pour que le programme se ferme proprement, il se terminera donc toujours parCrash: No valid move
. Je crois qu'il n'est pas possible de supprimer une sous-chaîne telle que la piste forme une boucle valide (infinie).#
, elle sera déconnectée de la fin de la voie, de sorte que le train tombera en panne (avec la même erreur que ci-dessus).#
, elle sera également déconnectée#
de la fin de la piste (et potentiellement même du début de la piste du point d’entrée$
). Encore une fois la même erreur.En ce qui concerne le programme actuel: chaque programme ferroviaire doit avoir une
$'main'
variante (ou une variante plus longue, mais nous jouons au golf ici) comme point d’entrée dans la fonction et le train démarre en$
direction du sud-est. Cependant, tout ce qui se trouve sur cette première ligne peut faire partie de la piste. Par conséquent, supprimer'main'
la piste est:Les
-
et/
sont simplement des morceaux de rail sur lesquels nous devons laisser le train faire ces 45 ° de virage.[world]
pousse la chaîneworld
et l’o
imprime.#
marque la fin de la voie - le seul moyen de mettre fin à un programme ferroviaire en toute sécurité.Fait intéressant, cette solution est uniquement possible car rail permet aux pistes de passer par la
main
ligne - si cela n'a pas été possible#
serait après le premier saut de ligne et le code pourrait toujours être raccourcies àqui est un programme valide qui ne fait rien. (Les caractères non-espace entre
'
et#
n'affecteraient pas cela.)Également assez intéressant: si je venais de jouer au golf, l'impression
world
n'aurait pas été beaucoup plus courte ou plus simple:la source
/
de la#
.$
dès le début de la voie, le train tombe en panne immédiatement (Rail s'attend à ce que la voie continue au sud-est de la$
).Funciton (
186136 octets en UTF-16)Ce programme imprime «monde».
La plupart des sous-chaînes que vous enlevez empêcheront cela d'être une boîte complète, ce dont se plaindre l'analyseur. Les seuls déménagements possibles qui laissent une boîte complète sont:
La plupart de ceux-ci suppriment l'extrémité pendante en haut à droite du boîtier, qui est le connecteur de sortie. Sans cette extrémité libre, la boîte n'est qu'un commentaire:
Ce programme n’est plus valide car l’analyseur attend un programme avec exactement une sortie:
La seule possibilité qui laisse un connecteur de sortie est le dernier de ce qui précède, ce qui laisse ceci:
Cependant, ce nombre ne code pas une chaîne Unicode valide dans le format UTF-21 ésotérique de Funciton. Essayez de lancer ceci, vous obtenez:
Par conséquent, ce programme est vierge.
la source
Visual C ++ -
9695 octetsPropriétés:
int main()
sans une erreur de compilation.a
à tous les moyensmain()
ne fait jamais{
, enleverb
tout signifie que notre ligne ne se termine pas dans un;
, la suppression des<
moyensstd::cout<'w'
provoque une erreur, et la suppression des<<
causesstd::cout'w'
,'w''o'
etc.I(a)
: ilsI(b)
ne correspondent jamais et seI
développent auparavant(
; d'autre part en utilisant desI(,
causes<<<<
, et,)
supprime le point-virgule (sauf toute autre erreur).std::cout
sans courir dans une tête<<
, et par conséquent ne pouvez pas supprimer#include<iostream>
au début sans une erreur de compilation.''
une erreur de caractère vide et'w,
, etc., essayez de tout transformer en un seul caractère.)
ou(
de l'autre côté, par exemple, vous ne pouvez pas faire des choses commeI('w',I('r'
.Compile en ligne à l'aide de Visual C ++ .
Encore une fois, ce n’est pas une preuve exhaustive. Si vous pensez que vous pouvez le faire aussi travailler sans section assurez-vous de me le faire savoir.
Les versions précédentes utilisaient une approche considérablement différente et il s'est avéré que ce n'était pas parfait alors j'ai supprimé ces scores.
Vérification:
Le programme suivant a confirmé que cette version est vierge en utilisant le
cl
compilateur de Visual C ++ 2010. J'aurais souhaité écrire ceci plus tôt:la source
/c
option est automatiquement incluse et compilée (comme si vous créiez une bibliothèque et non un programme). Si vous cochez la case Exécuter que le site n'inclut pas/c
, vous n'obtiendrez pas un message de réussite. Vous trouverez plutôt le "Lien naturel: erreur irrécupérable LNK1561: le point d'entrée doit être défini".Python 3,
7933open(1,'w')
ouvre la sortie standard, puis nous imprimons la chaîne.write
renvoie le nombre de caractères écrits. Ceci est utilisé pour renforcer la suppression de la sous-chaîne: La suppression d'une partie de la chaîne provoque le renvoi de tout autre élément que 5, et 5 moins cette valeur est évaluée à true. Mais cela provoque l'if
exécution du corps eta
n'est pas défini.Ceci est basé sur intelligente Quine vierge de Anders Kaseorg ici .
Comme une seule déclaration doit être vérifiée, elle est beaucoup plus courte que l'ancienne solution, mais également moins générale.
Ancienne solution:
Pour vérifier qu'il s'agit bien d'un programme vierge:
Quelques points clés:
q
a été exécuté exige une déclaration en dehors deq
. Letry
résout bien, en exigeant au moins deux déclarations, dont aucune ne peut être supprimée complètement.q
exécution a lieu en évaluantr
à la fin.q
n'a pas été modifié est réalisée pareval(q[17:])
, ce qui doit être évaluéNone
pourq
être exécuté.if
condition est un peu difficile à obtenir. Pour s'assurer qu'il a été évalué, il a pour effet secondaire de créere
, ce qui est nécessaire pour définirr
. (C’est la raison pour laquelle j’ai utilisé Python 3,expr
car une fonction fait des merveilles pour les effets secondaires au niveau de l’expression.)la source
Haskell, 61 ans
Tout type d'erreur est OK? Dans ce cas:
Haskell, 39 ans
la source
JavaScript,
747335 octetsIl s'avère que la réponse était beaucoup plus simple que je ne le pensais ...
Explication
la source
a="world"
, ne pas l'erreurif(a="world")["bol"+a[4]]
ne pas erreur.Java 8, 301 octets
Parce que chaque question nécessite une réponse Java.
Étendu
Explication
public static main(String[]a){}
est requis.La partie la plus difficile:
final
mot-clé est supprimé, la deuxième ligne est évaluée1/(8-8)
, ce qui provoque une/ by zero
exception.la source
System.out.print()
méthode vide . Il y a pourprintln()
, mais pas pourprint()
. Donc, si vous supprimiez,d='d'
cela donnerait uneThe method print(boolean) in the type PrintStream is not applicable for the arguments ()
erreur (et si vous supprimiez,d=
cela donnerait uneThe blank final field d may not have been initialized
erreur).Funciton ,
143142136 octetsLe score est en UTF-8 comme d'habitude, car UTF-16 aurait une taille plus grande de deux octets (en raison de la nomenclature).
Donc, je réfléchis à une réponse Funciton depuis un moment et je me suis dit que ce serait impossible, car vous pouvez toujours supprimer une ligne complète et le code resterait un bloc valide. Ensuite, j'ai discuté avec Timwi à ce sujet et il a compris que l'on pouvait simplement mettre le nombre entier sur une seule ligne, de telle sorte que le supprimer casserait le programme faute de connecteur de sortie.
Mais les littéraux sur une seule ligne sont notoirement coûteux, à la fois en raison du nombre de caractères plus important et du nombre plus important de caractères non-ASCII. Et sa mention d'un bloc "commentaire vide" m'a fait réfléchir ...
J'ai donc proposé cette solution plus efficace qui utilise un bloc de commentaires vide supplémentaire qui se brise lorsque vous essayez de supprimer tout ce qui laisserait le bloc littéral intact:
Cela laisse deux options (merci à Steve de l' avoir signalé):
19342823075080880373
est décodé, la chaîne correspondante contiendrait le point de code0x18D53B
qui n'est pas un caractère Unicode valide, seSystem.Char.ConvertFromUtf32
bloquant avec unArgumentOutOfRangeException
.508088037380718711
contient deux points de code non valides0x1B0635
et0x140077
aboutissant à la même exception.Notez que même sans le bloc de commentaires vide, la suppression de la deuxième ligne entraînerait un point de code non valide. Mais le bloc de commentaires empêche que nous prenions une ligne à l' intérieur de la deuxième ligne, pour obtenir un entier comme
193428037380718711
par exemple, ce qui ne causerait pas d'erreur.la source
Ruby, 36 ans
Nous assignons
s="planet"
puis écrivons cette chaîne à STDOUT. Ceci renvoie le nombre de caractères écrits. Nous xor cela avec 6, de sorte que si tout autre chose que 6 caractères ont été écrits, nous aurons un entier différent de zéro. Ensuite, nous découponss
avec cet index. Seul le 0ème caractère des
"p" est une chaîne de code valide (non-op). Nous passons cela àeval
, en utilisant la(*[argument])
syntaxe qui équivaut à juste(argument)
sauf que ce n'est pas valide en dehors d'un appel de méthode.Pristineness vérifiée par programme sur Ruby 1.9.3 et 2.2
la source
*
?C #,
128118101 octetsPensée d'abuser de la règle de sous-chaîne contiguë.
Le code
Pourquoi ça marche
class h
etstatic void Main()
sont nécessaires.'w','o','r','l','d'
provoque une erreur car le tableau de caractères est initialisé avec la longueur1*5
.Avant le golf et la séparation
Vérifié avec
https://ideone.com/wEdB54
MODIFIER:
#if !x
au lieu de#if x #else
.=>
Syntaxe de fonction utilisée .#if!x
au lieu de#if !x
. Crédits à @JohnBot.=>
syntaxe func, une condition de préproc supplémentaire peut être supprimée.la source
static
surMain
.Main
un membre de la fonction d' expression valides et 2 en ôtant les espaces avant que la condition de préprocesseur:class h{static void Main()=>System.Console.Write(new char[1\n#if!l\n*5]{'w','o','r','l','d'\n#if!o\n});\n#endif\n}\n#endif
. C'est 115 par mon compte.MATLAB,
373633 octetsÉtant donné que je ne suis pas sûr que nous ayons le droit de produire également le fichier ans = , je devais trouver un moyen de contourner le problème afin de générer la production de manière appropriée. L'utilisation de fprintf en elle-même n'a pas fonctionné, car peu importe ce que j'ai essayé, elle a simplement refusé l'erreur. L'utilisation de disp seule n'était pas une option, car elle ne nécessiterait qu'un seul argument et que cet argument lui-même s'exécuterait évidemment aussi sans erreur.
Si ce n'est pas un problème d'inclure également ans = dans la sortie, MATLAB peut être fait avec 20 octets :
la source
> <> , 17 octets
Essayez-le en ligne!
Imprime "la terre".
La seule manière dont un
><>
programme se termine sans erreur consiste à exécuter le;
caractère, ce qui pose un problème, car vous pouvez simplement supprimer tous les caractères précédents, ce qui;
correspond au premier caractère exécuté. Vous pouvez contourner ce problème en utilisant lap
commande pour modifier le programme à inclure;
à l'exécution. Suppression de toute section du code provoque l';
à jamais produit provoquant des erreurs par les instructions invalidesB
,h
ett
, pile underflow, et des boucles infinies faire fonctionner éventuellement de mémoire. Je devais seulement m'assurer que toutes les boucles infinies continuaient à remplir la pile.Toutes les variantes ont été testées avec cet extrait de code python:
ajouté à (une version légèrement modifiée) de l’ interprète officiel de fish.py par le créateur de> <>. Sur 152 sous-programmes possibles, 92 ont échoué à partir d'instructions non valides, 18 à partir d'un nombre insuffisant de piles et 42 à court de mémoire.
Chose amusante, la première version de ce programme
e"ooooo6-c0pAhtra
comportait deux sous-programmes anormaux qui ont réussi à utiliser la commande put pour placer un[
élément qui effacerait la pile, à la place de l'instruction non valideA
. En outre, "terre" est la seule des phrases qui fonctionnera avec cette méthode, car la première lettree
est une instruction valide en><>
. Sinon, la"
commande doit être placée à l'avant du programme, et un sous-programme valide pourrait être tout"
seul.la source
Ruby, 34 ans
Cela a quelques composants:
eval(*[
expr])
est emprunté à la réponse de histocrat , et est vierge tout en vérifiant que la valeur de retour de expr est un programme Ruby valide qui ne fait pas d'erreur.method(*arr)
est une syntaxe ruby qui appellemethod
avec les valeurs dearr
comme arguments. Ceci est nécessaire ici parce qu'il est uniquement valide en tant que paramètre d'une méthode. Par conséquent, s'ileval
est supprimé, il(*[expr])
s'agit d'une erreur de syntaxe. Si expr est supprimé, seeval
plaint de ne pas avoir suffisamment d'arguments$>.write("world")-1
ne peut être mutilé que pour l'intérieur de la chaîne et la soustraction.$>.write("world")
écrit "world" dans STDOUT et renvoie le nombre de caractères écrits, puis soustrait 1. Par conséquent, si le programme n'est pas mutilé, la valeur sera exactement 4 . Si elle est mutilée (soit-1
est supprimé, soit la chaîne est raccourcie), il renverra l'un des éléments suivants: -1,0,1,2,3 ou 5 . Toute autre modification entraîne une erreur de syntaxe.L'appel
chr
d'un numéro renvoie le caractère représenté par ce numéro. Ainsi, lorsqu'il est appelé sur le résultat de l'exemple ci-dessus, il génère une erreur sur -1 et renvoie une chaîne à un caractère sinon.Je ne sais pas vraiment pourquoi, mais il semble que ruby s’interprète
\x04
comme un caractère d’espace, ce qui signifie que l’expression est valide (les programmes ruby vides ne font rien). Cependant, tous les autres caractères (\x00
-\x03
et\x05
) donnent lieu àInvalid char '\x01' in expression
. J'ai trouvé cela en parcourant simplement les calculs possibles que je pouvais faire avec le nombre retourné. Auparavant j'avais utiliséoù "planète" plus une nouvelle ligne était de 7 caractères, multiplié par 16 pour obtenir 112
p
, la seule fonction à une seule lettre en ruby définie par défaut. Quand aucun argument ne lui est donné, c'est en fait un non-opMention honorable:
$><<"%c"*5%%w(w o r l d)
est très proche mais pas vierge. Suppression des"%c"*5%
résultats sans erreurs. Mini-explication:$>
est stdout, et<<
une fonction est appelée dessus."%c"*5
génère la chaîne de format"%c%c%c%c%c"
, qui essaie ensuite d'être formaté (%
) par un tableau:%w(w o r l d)
ce qui est une version plus courte de['w','o','r','l','d']
. S'il y a trop ou trop d'éléments dans le tableau, de sorte qu'il ne correspond pas à la chaîne de formatage, une erreur est générée. Le talon d’Achille, c’est ça"%c"*5
, et%w(w o r l d)
peut exister indépendamment, et$><<
n’a besoin que de l’argument de chacun . Il existe donc différentes manières de transformer ce programme en cousins non-fautifs.Validé avec ceci:
la source
Python 3 , 43 octets
Essayez-le en ligne!
Comment ça fonctionne
Pour nous protéger contre les suppressions de sous-chaînes, nous utilisons à la
open(1,"w").write
place deprint
. En Python 3,write
renvoie le nombre de caractères écrits, ce que nous vérifierons5
afin de nous assurer qu'aucune partie de la chaîne n'a été supprimée. Pour ce faire, nous recherchons la valeur de retour dans le dictionnaire{5:[]}
et lançons une boucle sur le résultatfor[]in…:a
, ce qui échouera si nous n'obtenons pas une valeur itérable vide ou si l'for
instruction est supprimée.la source
Javascript (Node.js),
9395 octetsVérifiez sa taille deux fois, donc s'il manque un caractère, une erreur est générée. La longueur est 156 car Node.js est ajouté
function (exports, require, module, __filename, __dirname) {
au code au moment de l'exécution.Merci Martin Büttner pour avoir signalé une erreur. Correction maintenant.
la source
Perl 5.10+,
7163 octetsImprime
world
avec une nouvelle ligne. Courez comme ça:Cela repose sur le nombre d'octets du code source, il
file
doit donc contenir le code ci-dessus et rien d'autre (pas de shebang, pas de nouvelle ligne). Perl 5.10+ est requis poursay
et l'opérateur défini ou//
.Il est incroyablement difficile de créer un programme vierge avec Perl, car:
Tout identifiant de bareword (par exemple
foo
,a
,_
) est une instruction valide avecno strict 'subs';
(la valeur par défaut). Cela signifie que le programme ne peut ni commencer ni se terminer par une lettre, un chiffre ou un trait de soulignement.Comme l' explique tchrist , "les identifiants spécifiés via le déréférencement symbolique n'ont absolument aucune restriction sur leurs noms." Cela signifie que le programme ne peut commencer par l' un des sigils
$
,@
,%
ou*
, depuis retirant tout sauf le premier et le dernier caractère serait toujours laisser un nom de variable valide.De nombreuses fonctions intégrées (y compris la plupart des fonctions capables de produire une sortie) fonctionnent
$_
par défaut. Par conséquent, les appels fonctionnent souvent même si vous supprimez l'argument (par exemple,say"world"
vssay
).Comment ça fonctionne
Cette solution a été inspirée par la réponse de Naouak, Node.js , qui vérifie sa propre longueur pour s'assurer que les caractères n'ont pas été supprimés.
Le programme comporte deux sections, l'une entre parenthèses et l'autre dans un bloc:
La première section lit le fichier source et meurt s'il contient moins de 63 caractères. La deuxième section vérifie que l'
read
exécution est réussie. Si l'une des sections est supprimée (avec ou sans les parenthèses ou les accolades), l'autre section lève une exception.Supprimer le milieu, le côté gauche ou le côté droit du programme déséquilibrera les parenthèses et / ou les accolades, ce qui provoquera une erreur de syntaxe.
Si le premier
die
est modifié (ded
,e
,di
,de
, ouie
, qui sont tous les identificateurs valides), la vérification de la longueur devient:qui évalue à:
Cela prend une référence à une chaîne et essaie de la déréférencer en tant que tableau, produisant une erreur:
Si une autre déclaration est modifiée, la vérification de la longueur échouera et le programme mourra.
Vérifié vierge avec le programme suivant:
la source
Ruby + coreutils,
332726 octetsEssayez-le en ligne!
Les backticks en ruby exécutent la commande qu'ils contiennent et renvoient ce que le programme a mis dans STDOUT sous forme de chaîne. La
#{expr}
syntaxe permet d'incorporer des expressions dans des chaînes et des backticks. Ce programme pourrait être réécrit (non pristinement) comme suit:IO#write
retourne le nombre d'octets écrits, donc si la chaîne est raccourcie, ce ne sera pas le bon nombre.#{}
l'incorporation transforme automatiquement le nombre en chaîne. Si une partie est supprimée et qu'elle ne provoque pas d'erreur de syntaxe, la commande erronée sera exécutée. Si une partie de"world"
est supprimée, l'un desbase04
traversesbase54
tentera de s'exécuter.La nouvelle ligne, que ce soit dans ou hors de la chaîne, est obligatoire. Sinon, les 5 premiers caractères (
`base
) peuvent être supprimés, faisant de la ligne entière un commentaire. De plus, il doit y avoir un ou plusieurs caractères entre le premier backtick et#
, sinon, ils{
peuvent être supprimés pour que le tout soit un commentaire shell .exec
Remplace le processus ruby actuel par la commande spécifiée. Voir mon autre réponse pour une explication de lameth(*[])
syntaxe et de sa nécessité.(s="ec%co earth")
assigne la chaîne "ec% co earth" à la variables
. Les assignations retournent ce qui avait été assigné, donc la chaîne est aussi retournée."format string %d" % 5
est un sucre syntaxique poursprintf("format string %d",5)
, mais les espaces autour de la%
ne sont pas nécéssaires.s[10]
obtient le caractère dans la chaîne à l'index 10. Lorsqu'il n'est pas mutilé, ce caractère est "h", la dernière lettre de la chaîne. Toutefois, la suppression de tous les caractères de la chaîne signifie que la chaîne est plus courte. Par conséquent, il n'y a pas de caractère à l'index 10, ests[10]
renvoyénil
et"%c" % nil
provoque une erreur.Si
%s[10]
est supprimé, Ruby essaie d'exécuter la commandeec%co earth
qui ne fonctionne pas.Passer
10
à1
ou0
entraîne également une commande inconnue (oueceo
ouecco
). Le supprimer entièrement n’est techniquement pas une erreur de syntaxe puisqu’il appelle la méthode#[]
sur la chaîne, mais qu’il se plaint du manque d’arguments.Une note sur la résolution de ce problème en général: Vous devez avoir un wrapper qui vérifie le code intérieur dans un sens abstrait tout en restant vierge. Par exemple, un programme avec division à la fin (
blablabla/somevar
) ne fonctionnera jamais car une division peut toujours être supprimée (blablabla
). Voici quelques exemples de tels emballages que j'ai utilisés jusqu'à présent:eval(*[
code])
utilisé par histocrat et dans ma première réponse. Valide que la sortie est un programme ruby valideexec(*[
code])
utilisé ci-dessus, valide que la réponse est une commande valide`#{
code}`
La syntaxe backtick exécute également une commande (et valide donc qu'il s'agit d'une commande valide), cependant STDOUT est capturé sous forme de chaîne au lieu d'être affiché en tant que processus parent '(Ruby's) STDOUT.
Pour cette raison, je n'ai pas pu l'utiliser pour cette réponse,EDIT: je l'ai fait fonctionner. Limitations décrites ci-dessus.Edit: Merci à @histocrat pour avoir signalé quelques défauts
la source
write
le début et la fin de la chaîne, mais je ne pense pas que cela affecte la précision. En outre, sur ma machinebase64
va attendre en attente d'une entrée, ce qui pourrait être contraire aux règles.$>.write"world"
fonctionne, merci! Quant à base64 en attente d’entrée, il semble varier d’un système à l’autre. TIO fonctionne bien. Cela rend encore plus flou quant à savoir si elle suit les règles.PowerShell, (97 octets + 5 pour le nom du programme) = 102 octets
Vérifie lui-même avant qu'il ne se détruit ... deux fois.
Attend à être enregistrés en tant que
c.ps1
et exécutées à partir du répertoire local en tant que tel:PS C:\Tools\Scripts\Golfing\> .\c.ps1
.L'alias
gc
est un raccourci pourGet-Content
et ressemble à unecat
lecture de fichier (dans ce cas, notre chemin d'exécution.\c.ps1
). Nous obtenons le.Length
fichier, le définissons sur$a
et vérifions s'il n'est pas égal à 97 avec-eq97
. S'il est égal (c'est-à-dire que le programme n'a pas été modifié), nous imprimons avec"world"
et exécutons une commande non validea
. Cela obligecatch
à prendre effet, ce qui nous permet de nous contrôler à nouveau. Cette fois-ci, si notre code n'est pas égal à 97, nous lançons une commande non valide afin que notre programme contienne une erreur et imprime un texte d'erreur à la sortie. Nous avons ensuiteclear()
l'erreur etexit
normalement.Il est évident que si l'une des
if
déclarations est falsifiée, l'autre aura une erreur. Si une partie de"world";
est falsifiée, la premièreif
provoquera une erreur. Comme il doit être contigu, nous ne pouvons pas supprimer les deuxif
déclarations. Les chaînes au milieu donneront lieu à des parenthèses incohérentes ou à l'{a}
exécution de la seconde . Letry
/catch
est d’attraper l’erreur de la premièreif
déclaration afin que nous puissions l’effacer correctement. L'extérieur"$( )"
empêche les chaînes d'être coupées. La dernière;a
consiste à éviter que des parties de la partie médiane qui sont coupées ne donnent lieu à des programmes valides (par exemple"it}a)";a
, qui imprimerait}a)
puis commettra une erreur).Il y a plusieurs circonstances spéciales:
gc
,gc<space>
ougc .\
sont supprimés, le programme finira par erreur avec un peu de saveur d'une erreur de dépassement de mémoire ( en raison d'appels d' auto-exécution répétée) et accident probable que le shell (et peut - être l'ordinateur). Pas testé.<space>.\c.ps1
ou.\c.ps1
sont supprimés, le programme s’arrêtera et vous demandera une saisie de l’utilisateur. Peu importe ce que l'utilisateur entre, le programme sera toujours en erreur, car les comptages de taille seront erronés.$
et se terminant avant le dernier"
est extraite, le programme affichera tout ce qui restera, puis une erreur, car cea
n'est pas valide.Vérifié avec ce qui suit:
(Merci à Martin pour son aide!)
la source
C (gcc) (Linux
-Werror=undef
), 66 octetsEssayez-le en ligne!
Grand défi! C'était durement trompeur, mais je suis à peu près sûr d'avoir un programme valide maintenant!
Utilise une commande de préprocesseur pour qu'aucune nouvelle ligne ne puisse être supprimée, car le crochet de fermeture à
main
n'est inclus que si__LINE__==6
. Cela vous empêche également de tout effacermain
, car cela laisse#endif
flotter (il est donc important que ce#endif
soit en dehors demain
).J'ai utilisé
#else
parce que je suis devenu assez convaincu qu'il n'y a pas de version de ce__LINE__==6
qui ne peut pas avoir une sous-chaîne supprimée et toujours être vrai, puisque les deux6
et__LINE__
par eux-mêmes sont la vérité. Il utilise également-Werror=undef
pour que quelque chose comme#ifdef(LINE__)
ne soit pas évalué comme étant faux, mais comme une erreur.Avec gcc (sous Linux au moins),
puts
renvoie le nombre de caractères imprimés (y compris le retour à la ligne suivant), ainsi la suppression de toute partie de la chaîneputs("...")/6
renvoie un résultat0
, ce qui1/0
entraîne une exception en virgule flottante. Notez que cette exception n’est causée que si elle1/0
est affectée à quelque chose, ellea=
est donc requise.Aucune autre partie d'une ligne ne peut être supprimée sans créer une erreur, généralement une erreur de syntaxe ou une erreur de liaison.
En prime, cela donne une solution de 86 octets pour C ++ assez trivialement, ajoutez
#include <cstdio>
et déclarez ena
tant queint
. Essayez-le en ligne! (C ++)la source
1/
tout en laissant la nouvelle ligne et elle sera toujours exécutée .1
était supposé sur la ligne précédente, je crois.=1
. Je pense que vous devez mettre le 1 sur une ligne tout seul.PHP, 73 octets
Explication
J'assume la configuration par défaut de php.ini. Donc short_tags est désactivé. Cela signifie que vous ne pouvez pas supprimer le
=
de la balise d'ouverture.Ceci est fondamentalement
<?=unserialize('s:5:"world"');
.Si vous supprimez une partie de la chaîne sérialisée, vous obtiendrez une erreur.
Vous pouvez simplement supprimer
unserialize
et le script va simplement sortir la chaîne sérialisée. Pour surmonter cela, j'utilisecall_user_func
. Supprimer l'un des paramètres entraînera une erreur.Cependant, vous pouvez supprimer
un
, pour appeler laserialize
fonction. Donc, nous sortons 'ns`. Supprimer tous les caractères ne donnerait pas un nom de fonction incorrect.Nous allons utiliser un inline si vous utilisez une affectation de variable avec la balise de sortie. Au lieu d'utiliser,
&&
nous utilisons '|' pour empêcher la suppression d'un seul&
ou la suppression de l'$f
affectationVous pouvez enlever
='ns')&&($f="u{$p}erialize"
et finir avec($p)?$f:''
. Par conséquent, j'ajoute une parenthèse supplémentaire autour$f="u{$p}erialize"
.Remarque
Techniquement, vous pouvez supprimer les balises d'ouverture sans générer d'erreur. Ce n'est cependant plus un script PHP, mais juste un fichier texte brut.
la source
Matlab (77)
l'essayer
Remarque:
Suivant les conseils de @ Optimiser concernant la conception d'un CPR ou quelque chose du genre, j'ai été confronté à une sous-chaîne imprévue qui n'a entraîné aucune erreur de compilation lors de sa suppression. Exemple: la suppression
arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),
de cette édition précédente nefeval(@(a)arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),'world')
génère aucun bogue! aussi, pour la même édition récente, il y en avaitbsxfun(@(a,b)arrayfun(@(x)(x),prod(b,ismember(4,b))),'world',1:5)
etbsxfun(@(a,b)a,'world',1:5)
, si vous m'avez demandé comment étais-je lorsque je les ai trouvés dans ma console de sortie, j'ai pleuré comme un bébé, alors voici le programme:Un exemple de programme non vierge
modifier:
la source
SmileBASIC, 63 octets
la source
Un poirier , 17 octets
Ce programme contient des octets avec le bit fort défini (qui ne sont pas valides UTF-8 et ne peuvent donc pas être postés sur TIO). Voici donc un
xxd
hexdump réversible:Explication
Ceci est juste
print'world'
avec une somme de contrôle ajoutée. J'ai vérifié par la force brute qu'aucune des suppressions possibles ne donne un programme avec une somme de contrôle valide. Vous obtenez donc une erreur après toute suppression possible.Assez ennuyeux, mais lie le leader actuel, alors j’ai pensé que cela valait la peine d’être publié.
la source