Cette idée ne m’appartient pas, mais je ne sais pas d’où elle vient. Je l'ai déjà rencontré dans un concours de programmation il y a très longtemps (1998, si je me souviens bien). La tâche consiste à écrire un programme dans votre langue préférée, qui en génère 2012
et uniquement 2012
. Le problème, c'est que le programme doit toujours sortir 2012
après la modification de l' un de ses caractères. La modification peut être une insertion, une suppression ou un remplacement. Bien entendu, la modification sera telle que le programme est toujours syntaxiquement valide.
Comme je ne connais pas tous les langages de programmation, je dois demander au public de m'aider et de tester les réponses fournies.
Ajouté: Beaucoup ont fait remarquer que ma définition des modifications acceptables est trop vague. Voici ma deuxième tentative: les modifications autorisées laisseront votre programme syntaxiquement valide et ne le feront pas planter. Là, je pense que cela devrait couvrir toutes les erreurs de compilation, de liaison et d’exécution. Bien que je sois sûr qu'il y aura de toute façon un cas étrange dans certaines langues, nous examinerons cela individuellement.
Réponses:
C, 53 caractères
Un peu plus long que le langage de script répond, et suit le même principe de base. S'appuie sur le fait qu'en raison des contraintes de la syntaxe de C, les seules lettres qu'il serait possible de modifier sans rendre le programme invalide se trouvent dans les chaînes!
Edit: Rasé 4 personnages.
Rééditer: la robustesse a augmenté, rasé un personnage.
Re-redit: Plus long, mais plus robuste. Essayez juste votre
&
maintenant! (Correctement cette fois).Mise à jour: raccourci un peu; défaites la plupart des approches vues jusqu'à présent.
Mise à jour: changé int en void; devrait vaincre la dernière approche possible pour le casser, je peux penser.Mise à jour: je pense d'une autre approche; remplacer le derniera
(peut-il pourrir) avec0
; l’utilisation de noms à deux lettres devrait régler ce problème.Mise à jour: dernière mise à jour révoquée; en supposant que les modifications causant des erreurs d'exécution sont interdites;
a
fonctionnera très bien.Mise à jour: revenir en arrière un peu plus; tenter de déréférencer
*a
sera également une erreur de segmentation;void
il ne devrait donc pas être nécessaire d' utiliser une erreur de compilation.Mise à jour: Et un raccourcissement final; cela repose sur la chaîne
"2012"
étant placée à une seule adresse (ce qui est commun); et que les chaînes littérales sont en lecture seule (également communes).Mise à jour: Cela m'a coûté deux personnages, mais j'ai vaincu votre pauvre colon!
la source
register void
; Leregister
est là pour prévenir&
; lavoid
est là pour prévenir*
.;
entreputs
et(
.2012
! (Je n'ai utilisé que des caractères ASCII imprimables pour les tests d'insertion et de substitution, mais je doute qu'un élargissement du répertoire puisse aider.)==
de place!=
dans le ternaire, cela ne vous mènera nulle part. au lieu de le sortir,a
il en sort maintenant"2012"
.Haskell, 19 ans
ou, en tant que programme complet,
29
Pour un peu plus de fun:
Pour en obtenir un qui ne puisse pas être modifié de manière à ne générer qu'une erreur d'exécution, nous pouvons coder les informations dans les longueurs de listes non modifiables à l'aide de modifications d'un caractère, c'est-à-dire
Pour le rendre plus modifiable (en toute sécurité), nous pouvons également utiliser le numéro lui-même en tant qu'élément de liste - il suffit de le définir par des chaînes pour empêcher l'échange de virgules par un plus ':
Comme cette chaîne n'est que le résultat de l'expression, nous pouvons également la remplacer par celle-ci - ce n'est pas un problème grâce à la paresse de Haskell.
6472Le
init
agit comme "moins un, mais non négatif" ici.Nous pouvons également inclure le système de types dans le schéma de redondance, puis écrire le numéro d'une manière pouvant être modifiée avec des modifications d'un caractère ...
(
GHCi> twothousandandtwelve
≡>"2012"
)Vous pouvez maintenant changer n'importe lequel
u
à l'p
inverse, mais cela gâcherait toujours la profondeur des empilements de listes dans le deuxième élément du tuple et provoquerait ainsi une erreur lors de la compilation.Cette idée pourrait être développée davantage de telle sorte que des textes entiers puissent être codés de manière compacte, faciles à lire et à modifier, tout en évitant de modifier des caractères uniques.
Et encore un autre ...
la source
a=map(head.show.length)[[a,a],[],[a],[a,a]]
solution, inséreza
entre[]
. J'aime vraiment ce post, cependant! Des solutions très intelligentes.[a]
->[]
dans la solution 64 caractèresJavaScript
Je crois que ceci est une preuve d'erreur d'exécution, toute modification unique devrait entraîner une erreur de compilation ou une alerte unique indiquant 2012.
Edit: Code ferait une erreur d’exécution sur quelque chose comme
if("alert(2012 "==r)
, j’ai déplacé la section try pour y faire face.Edit: Nice one Vilx-, mais fixable :-) Il existe maintenant un décalage entre crochets pour l'insertion de ce point-virgule.
Edit: Mais alors une virgule pourrait faire la même chose que le point-virgule, c’est une multitude d’options, je pense l’avoir corrigée, mais il y a énormément de code maintenant.
Edit: un peu simplifié.
Edit: Un de plus dans une série infinie de corrections de bugs.
Edit: Cela se sent un peu plus long et compliqué que l'épreuve des balles, mais il faut au moins s'en occuper
~eval
et!eval
.la source
q-")"
renvoieNaN
eval qui est converti"NaN"
avant de l'évaluer, ce qui le retourne simplement àNaN
. Étrange chose à faire, mais techniquement légitime, pour ne pas invoquer le piège.;
entreeval
et(
.~
en avant dueval
fait écho2012
deux fois au lieu d’une fois. Je ne sais pas si cela ne respecte pas les règles ou pas: P!
après leeval(
casse.Perl, 49 caractères
Sur la base de la réponse de JB , mais celle-ci répond effectivement aux spécifications . Un contrôle exhaustif indique que chaque suppression, insertion ou remplacement d'un caractère laisse la sortie inchangée ou provoque le blocage du programme lors de son exécution (indiqué par une valeur de retour non nulle et une sortie sur stderr), au moins aussi longtemps que des insertions et des modifications. les remplacements sont limités aux caractères imprimables ASCII.
(Sans restriction, la tâche est impossible en Perl: une fonction peu connue de l'analyseur Perl est son arrêt lors de la rencontre d'un caractère Ctrl-D ou d'un caractère Ctrl-Z. Il est donc inséré si l'un de ceux-ci se trouve devant un fichier. dans un programme Perl valide qui ne fait rien.)
Edit: Rasé un autre caractère en le remplaçant
1==print
par0-print
.la source
print
commence à revenir'true'
au lieu de 1 :-Pprint
dans aucune version de Perl 5, même si elle n'est pas explicitement documentée .)Brainfuck
J'essaie de me convaincre que c'est possible, et je suis assez certain d'avoir peut-être poussé trop loin. J'ai émis quelques hypothèses sur mon environnement:
Malheureusement, si vous devenez plus strict, je crains que ce ne soit impossible. Voici ma solution:
Fondamentalement, vous pouvez modifier le code de sortie ou le code de vérification, mais pas les deux. L'un d'eux est garanti pour fonctionner. Si l'un d'entre eux ne le fait pas, il se «plantera».
la source
Python2
Je devais changer légèrement le script de test de Ray pour le tester car la redirection stdout le cassait. Passer des dict vides à exec évite de polluer l'espace de noms
la source
Brain-Flak , 44 + 3 = 47 bytes [Non compétitif]
Ceci utilise le
-A
drapeau de Brain-Flak et envoie les caractères2012
à STDOUTEssayez-le en ligne!
Alternative, 50 octets
Essayez-le en ligne!
Explication
Toute modification d'un seul caractère à l'un des codes ci-dessus entraînera une erreur du programme.
la source
Sisi , non en compétition
Enfin, je pense avoir trouvé une de mes langues qui fonctionne. C'est horriblement long et le langage est plus récent que la question, mais cela ressemble toujours à un accomplissement.
À propos de Sisi
Sisi est un langage de jouet inspiré par l'assemblage et QBasic. C'est bon pour ce défi car sa syntaxe est extrêmement limitée.
set
,print
,jump
etjumpif
.set
instructions. Ils ne peuvent contenir (au plus) qu'une opération, qui doit être binaire. En particulier: le passageprint xx
àprint -xx
est une erreur de syntaxe.Le programme
Le noyau du programme est cette partie:
Nous stockons
2012
dansxx
, puis de vérifier si c'était réussi et stocker le résultat dans testy
. Siy
c'est vrai, passez à la ligne 55. (Passez à des numéros de ligne inexistants, faites simplement avancer rapidement à la ligne suivante.)Durcissement par rayonnement
y
c'est falsey, le saut n'a pas lieu et la ligne 4 est fixéexx
à 2012.xx
allons définir à 2012 si nous prenons le saut ou non.print
renvoie tôt ou tard à la ligne 955. Avec une modification, il est impossible de revenir en arrière (création d'une boucle) ou après la fin du programme.0
. Une modification telle queprint ax
n'est donc pas une erreur. Les lignes 828-954 sont la solution laide mais efficace, car elles attribuent 2012 à toutes les variables possibles avec une distance d'édition de 1 à partir dexx
. Cela garantit que toute modification apportée à la finaleprint xx
sera toujours imprimée en 2012.xx
.la source
Python
Un peu commenté (maintenant avec un correctif pour ce point-virgule embêtant entre
print
et(
!):la source
pop()
L'utilisation d'un ensemble vide n'est pas une erreur en soi, mais une erreur est générée.pop
sorties<built-in method pop of set object at 0xb6fe93ac> ()
T-SQL 2012, 55
la source
J'ai créé un script python pour juger de toutes les solutions python. Le script rompt les première et troisième solutions python, avec de nombreuses méthodes différentes.
Et la deuxième solution utilise lambda pour se protéger, est incassable.La deuxième solution python est en python 3. Je l’ai modifiée au format python 2 puis j’ai jugé que le programme l’avait brisé.Voici le script du juge.
la source
p2
génère toujours une exception pour Python2. La sortie n'est jamais en 2012. Votre programme judge ne fonctionnera pas sous Python3 car il utilise des instructions print.p2
c'est en python 3.Mathematica, 23 caractères
Remarque: "/." signifie "remplacer"
la source
/.
à//
(forme postfixée).Javascript -
68, 77, 84, 80 caractèresVoici une solution qui devrait fonctionner cette année :)
Voici le test de violon .
Mise à jour 1: Correction du problème où eval (+ a) le cassait (merci eBusiness).
Mise à jour 2: corrigé pour le '|' cas (merci encore eBusiness).
Mise à jour 3: Correction du cas '>' (merci encore à eBusiness). Et cassé pour le cas '1' :(
la source
eval(+a)
et beaucoup d'autres modifications fonctionnent parfaitement mais ne font pas beaucoup.eval(+a)
cas, cela devrait maintenant être corrigé. De plus, je n’ai pas pu trouver l’un des cas de modification qui fonctionne bien mais ne produit pas 2012, donnez-moi un exemple?eval(0)
eteval(-a)
par exemple fait la même chose.||
par|
.alert
enaler=
.Ruby 1.9 - 43 caractères
Non testé, alors rompre.
la source
Excel, 14 caractères (triche légèrement):
Toute modification valide du tableau aura une incidence sur le contenu des deux cellules. Toute tentative de modification d'une seule cellule déclenche un message d'erreur.
Bien sûr, cela ne tient pas compte du fait que vous considérez qu'il ne s'agit en réalité que d'une formule, par opposition à deux formules dont la contrainte est identique.
la source
Java 7
Explication:
a
la valeur de2012
).a
est modifié de quelque manière que ce soit, il empruntera le chemin suivant: 1 → 3 → 5 (et lab
valeur non modifiée de celle-ci sera renvoyée2012
).b
est modifié de quelque manière que ce soit, il empruntera le chemin suivant: 1 → 3 → 4 (et laa
valeur non modifiée de celle-ci sera renvoyée2012
).a.equals(b)
sur @ 1 est modifié ena.equals(a)
,b.equals(b)
ou!a.equals(b)
prendra toujours le même chemin suivant: 1 → 2 (et il retourneraa
la valeur inchangée de2012
).a
on modifie @ 2,b
il prendra toujours le chemin suivant: 1 → 2 (et lab
valeur inchangée sera retournée2012
).a
ou l' autreb
est changé sur les lignes 3, 4 ou 5, il suivra toujours le chemin suivant: 1 → 2 (et laa
valeur non modifiée sera renvoyée2012
)a
la valeur inchangée de2012
)M
dansclass M
oua
dansmain(String[]a)
un autre caractère valide peut se faire sans modifier la fonctionnalité du code.Essayez toutes ces modifications ici, pour vérifier si elles sont toujours imprimées en 2012.
Si vous pouviez trouver un moyen de le briser en suivant les règles d'OP, j'aimerais bien le savoir, afin que je puisse penser à quelque chose pour y remédier.
Contrairement à la plupart des questions similaires où un seul caractère est modifié, cette question permet à la structure de base du langage de programmation en question d'être intacte, de sorte que Java puisse enfin
entrer en concurrence dans une seuleentrée (avouons-le, Java ne gagnera presque jamais rien sur cette SE xD).la source
a
? Le programme sera-t-il toujours publié en 2012 ou en 2012?-
avant lea
oub
. Voici une capture d'écran de l'erreur Compile.Ruby 1.9
Je construis ce programme court mais simple que vous êtes invités à interrompre conformément aux règles ci-dessus. Je ne pouvais même pas trouver une position où la sortie était modifiée (sans casser le code) si un
#
est inséré afin de commenter le reste de la ligne.la source
irb
, en ajoutant un moins avant lesrx
résultats dans un programme valide qui génère-2012
…puts
vous passez àputc
, cela produira un?
en Ruby 1.9.Scala, 95
(ou 54 si ignorer les parties non significatives)
la source
(...),("2012")
semblait le casser.C #
Ce n'est sûrement pas aussi simple, n'est-ce pas? ...
Ok ce qui me manque?
la source
if (result += "2012")
faire sortir20122012
?if
instruction, pas d'une chaîne.;
aprèselse
rend les sorties deux fois.PHP, 30
la source
<?=$i=2012;$i==2012?-$i:2012;?>
<?#$i=2012;$i==2012?$i:2012;?>
Solution à cela: insérez une nouvelle ligne après$i=2012
.Taxi , 396 octets
Formaté pour les humains, c'est:
À la lecture des autres réponses, la solution semble être de choisir une langue fragile, de définir la valeur, de vérifier la valeur, d’imprimer la valeur.
la source
SmileBASIC
Tout d'abord, nous activons le mode strict. Cela vous oblige à déclarer toutes les variables avant de les utiliser et empêche des choses comme de changer? A $ en? B $.
Ensuite, une variable de chaîne appelée "A $" est créée et la valeur est définie sur "@ 2012". Pour s'assurer que la valeur de A $ n'a pas été altérée, le programme essaiera de passer à une étiquette, et la seule étiquette du programme est @ 2012.
Maintenant, A $ est définitivement "@ 2012", mais avant de l’imprimer, le @ doit être supprimé. SHIFT () supprime le premier élément d'une chaîne ou d'un tableau (exactement comme pop (), mais de l'autre extrémité). Pour supprimer la valeur renvoyée par SHIFT, elle est transmise à un bloc IF / THEN, qui ne fait rien. Juste au cas où quelqu'un essaierait de commenter cette ligne, nous déclarons une variable "B", qui sera utilisée plus tard. Si le VAR est commenté, la dernière ligne générera une erreur de variable non définie.
Maintenant, A $ est imprimé et il existe un autre VAR pour empêcher les commentaires. La dernière ligne s'assure simplement que les variables B et C ont toutes deux été déclarées.
la source
?-A$VAR C
- cette sortie pourrait-elle-2012
??B$VAR C
:? :)Haskell, 65 ans
Perl, 84
Approche ratée:
la source
$&
par quelque chose comme$0
.nub$filter(\x->x==2012||x==2012)(2012:[2012])
pourrait être sans danger pour la solution Haskell.use English
Perl, ça va le réparer. Je pense que plusieurs correctifs fonctionnent pour Haskell, notamment le passage aux chaînes.print
avec*rint
,prin:
,p:int
ou#rint
, préfixer=
à la première ligne, ou même le remplacements/.*/
avecs/./
ouy/.*/
( ce qui serait fixé en initialisant$ARG
à2012
commencer par). En outre, votre$SUBSEP
astuce ne protège toujours pas contre l'insertion d'un*
avant le point-virgule final, mais une solution beaucoup plus simple consiste à supprimer ce point-virgule inutile.PHP,
4348la source
-
entre le?
et les$a
résultats en-2012
cours d'impression.date()
, mais le programme doit également fonctionner au-delà de 2012. ;)-
entre le? et les abdos. ;-)Rubis (
5736)EDIT Et un autre en 36 caractères.
J'imagine que l'utilisation de chaînes est assez sécurisée, car ce problème ne fonctionne plus.
EDIT next try (36 caractères) [ça ne fait rien, en ajoutant un
-
aprèsp
résultats dans-2012
]p [2012,2012] .find (2012) .first || 2012Celui-ci ne fonctionnera que cette année, mais aussi pour des concours similaires à l'avenir :) (15.chars)
Notez que cette substitution fonctionne également:
57 caractères. Si vous comptez les sauts de ligne, vous avez également 76 caractères.
la source
#
au début de la ligne. Dernière solution - entrez une nouvelle ligne avantp
. (Remarque - je ne connais pas Ruby moi-même, alors je me trompe peut-être).$><<
ou à laputs
place. Quoi qu'il en soit, je ne vais plus essayer ça, j'ai abandonné :)Q, 23
.
etc
la source
-
)? -{$[-2012~m:2012;m;2012]}
-{$[2012~m:-2012;m;2012]}
-{$[2012~m:2012;m;-2012]}
q){$[-2012~m:2012;m;2012]}` 2012
-q){$[2012~m:-2012;m;2012]}` 2012
-q){$[2012~m:2012;m;-2012]}` 2012
;m;
pour quelque chose comme;1;
ou;x;
.Hmm .. laissez-moi essayer:
128 caractères sans les espaces.
la source
System.out.println(-i)
(pour la première impression). Aussi cassé par exemple en remplaçant le premierprintln(i)
par exprintln(1)
. Aussi potentiellement cassé en changeanti == j
eni += j
(ou - =, etc.).PHP
J'espère que c'est incassable :)
la source
echo(printf("%s",$a)==4)?die(3
et je reçois20123
.."2012"
pour."FAIL"
. :)Groovy: 26
la source
x=2012;print x^2012?2012:-x
-
pour-
consiste à essayer de modifier votre code avec un caractère pour qu'il ne fonctionne plus.x=2012;print x^=2012?2012:x
(passage^
à^=
) change la sortie en 0.Lua
la source
-
signes?2012
en quelque chose d'autre, l'affirmation générera une erreur. Hmm ... eh bien, je suppose que vous méritez des points de créativité pour abuser des règles. Mais sérieusement, ce n'est pas ce que cela voulait dire.