Inspiré par ce commentaire ...
Merci aux utilisateurs Step Hen , Wheat-Wizard et Dennis de m'aider à préciser les spécifications de ce défi avant de le poster!
C'est le fil des flics. Pour le fil des voleurs, allez ici
Dans ce défi , vous êtes chargé d’exécuter du code qui fait en sorte que votre langage ne réponde plus à nos critères de programmation. Dans ce défi, cela signifie faire en sorte que la langue ne puisse plus ...
Prendre des entrées et des sorties numériques
Ajouter deux nombres ensemble
Testez si un certain nombre est un nombre premier ou non.
C'est un flics et voleurs défi, où il y a deux défis différents avec deux objectifs différents: les Cops vont essayer d'écrire un code qui rend la langue la plupart du temps inutilisable, et les voleurs vont essayer de trouver la solution cachée qui permet aux flics pour récupérer leur langue.
En tant que flic, vous devez écrire deux extraits de code:
Celui qui rend votre langue pratiquement inutilisable, par exemple en supprimant les fonctions intégrées pour effectuer des opérations d’entrée / sortie et des opérations numériques. Plus vous supprimez de fonctionnalités, mieux ce sera. Ce code n'est pas autorisé à planter ou à sortir. Il devrait être possible d'ajouter du code à la fin de cet extrait, et ce code sera évalué . Et...
... un extrait de code qui prend deux entiers non négatifs en entrée, les additionne et génère leur somme. Cet extrait doit toujours fonctionner correctement, même après l'exécution du premier extrait. Lorsque les deux extraits sont combinés, ils doivent former un programme complet qui ajoute deux nombres ou définir une fonction qui ajoute deux nombres. Idéalement, cet extrait devrait s’appuyer sur un comportement très obscur, afin d’être plus difficile à trouver.
Vous pouvez choisir n’importe quelle méthode standard d’entrée et de sortie . Cependant, vous devez indiquer exactement le format (entrée et sortie) que vous utilisez. Un voleur ne peut pas déchiffrer votre réponse à moins d’utiliser le même format que vous.
Après avoir écrit ces deux extraits, vous devez poster le premier comme réponse, sans révéler le second. Votre réponse devrait contenir toutes les informations suivantes:
Le premier extrait (évidemment pas le second).
Langue (y compris la version mineure, car la plupart des soumissions s'appuieront probablement sur des cas marginaux étranges)
Format IO, qu'il s'agisse d'une fonction ou d'un programme complet. Les voleurs doivent utiliser le même format pour que leur crack soit valide.
Tous les cas étranges requis pour que votre réponse fonctionne. Par exemple, ne fonctionne que sur Linux ou nécessite une connexion Internet . Évidemment, ceci est légèrement subjectif, mais si un policier a un cas extrême qui l’empêche de se fendre, et ne le révèle alors qu’après avoir été en sécurité, j’envisage cet esprit sportif médiocre. Un cambrioleur potentiel devrait avoir toutes les informations nécessaires pour déchiffrer votre réponse avant qu'elle ne soit fissurée.
Vous n'avez pas besoin de révéler le nombre d'octets jusqu'à ce que votre réponse soit sécurisée.
Voici un exemple. Pour le premier extrait, vous pouvez soumettre le programme Python 3 suivant:
Python 3
print=None
Prend une entrée de STDIN et une sortie vers STDOUT
Et comme deuxième extrait, vous pourriez écrire:
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Ceci est valide car il faut entrer deux nombres et générer leur somme même si vous joignez les deux extraits, par exemple:
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Cependant, il sera extrêmement facile pour un voleur de trouver une solution. Comme ce serait très facile à craquer, vous pourriez essayer de corriger cette approche particulière comme ceci:
import sys
sys.stdout=None
print=None
Cependant, même cela a une solution très simple:
del print
a,b=int(input()),int(input())
print(a+b)
En tant que policier, votre objectif est de rendre la solution de contournement cachée aussi obscure que possible, afin d’empêcher les voleurs de la trouver.
Les voleurs examineront l'une de vos réponses et tenteront de la résoudre. Ils peuvent le déchiffrer en écrivant un extrait valide qui pourrait fonctionner en tant qu'extrait 2 (en ajoutant deux nombres ensemble une fois que la langue est pratiquement inutilisable). Cela ne doit pas forcément être le même extrait que celui que vous aviez initialement prévu. Si un voleur déchiffre votre réponse, il laissera un commentaire, et vous devrez ensuite le modifier pour indiquer qu'il a été fissuré. Si votre message est fissuré, vous devez modifier votre réponse pour afficher la solution (extrait 2) initialement envisagée. Ce n'est pas une règle en soi , mais une suggestion amicale de garder le jeu amusant. Tu n'as pas à.
Si une réponse reste non masquée pendant une semaine entière, vous pouvez modifier votre deuxième extrait et indiquer que votre réponse est maintenant sûre . Si vous ne le modifiez pas à la fin de la semaine, les autres utilisateurs peuvent le résoudre jusqu'à ce que vous le fassiez. Si vous ne divulguez pas votre deuxième extrait, vous ne pouvez pas réclamer de points pour votre réponse, ni l'appeler en toute sécurité.
Le gagnant du fil des flics est la réponse la plus courte et la plus sûre, y compris les deux extraits , comptés en octets, et cette réponse sera acceptée après un délai suffisant. Vous n'avez pas besoin de révéler votre nombre d'octets jusqu'à ce que votre réponse soit sécurisée, car le nombre d'octets n'est pas pertinent pour votre score jusqu'à ce que votre réponse soit sûre. Si suffisamment de temps s’est écoulé et qu’aucune réponse n’est restée non fissurée, le gagnant sera la réponse restée non fissurée pendant la plus longue période.
S'amuser!
Clarifications de règles
Le premier extrait doit fonctionner correctement sans aucune entrée . Il peut produire ce que vous voulez et cette sortie sera ignorée - tant que, une fois l'extrait de code créé, le deuxième est correctement exécuté.
Le deuxième extrait doit en réalité être exécuté pour que votre réponse soit valide. Cela signifie une réponse comme
import sys sys.exit()
n'est pas valide car cela ne casse pas la langue. Il se ferme tout simplement. De même, entrer dans une boucle infinie n'est pas valide, car le deuxième extrait ne sera jamais exécuté.
Après avoir été en sécurité, votre score correspond au nombre d'octets des deux extraits .
Cela remonte à Veuillez révéler tout cas étrange requis pour votre réponse au travail ... Votre soumission doit contenir suffisamment d'informations avant d' être révélée pour être reproductible après avoir été révélée. Cela signifie que si votre réponse devient sûre, et que vous modifiez ensuite: voici ma réponse. Oh, BTW, cela ne fonctionne que si vous l'exécutez sur Solaris, la blague est sur vous! votre réponse est invalide et sera supprimée et non considérée comme éligible pour gagner.
Le deuxième fragment de code est autorisé à se bloquer après la sortie de la somme - tant que la sortie est toujours correcte (par exemple, si vous choisissez une sortie sur STDERR et que vous obtenez alors une foule d'informations sur le blocage, elles ne sont pas valides).
Vous ne pouvez pas modifier votre code après avoir soumis une réponse.
Vous ne pouvez pas compter sur des fonctions cryptographiques telles que le cryptage, les fonctions de hachage, les CSPRNG, etc.
Extrait pour trouver des soumissions non fissurées:
la source
int main(){ do_evil_stuff(); }
où le code des utilisateurs devrait aller? Dans une fonction? Après toutes les déclarations dansmain
?Réponses:
Gforth 0.7.3 (TIO) , 231 octets [SAFE]
Ce code redéfinit comme inutiles certaines méthodes de sortie nécessaires, ainsi que des ajouts et des éléments cruciaux pour la déclaration de fonctions. Bonne chance!
L'entrée consistera en deux entiers signés pris du haut de la pile en tant que paramètres de fonction. Sortie sur STDOUT.
Vous devez donc réparer les dégâts et définir une fonction qui extrait les deux premières valeurs de la pile et affiche le résultat sous forme d’entier (et non de float) sur STDOUT sans sortie supplémentaire (sans espace de fin).
Voici un modèle , si votre fonction d'objectif est nommée
f
.Solution:
la source
Haskell, fissuré par Christian Sievers
Programme complet, lisant deux nombres entiers (y compris des négatifs) de stdin et écrivant sur stdout.
Je viens de désactiver le prélude, donc presque rien n’est dans la portée, puis j’ai ajouté une définition; les importations supplémentaires sont syntaxiquement non valides. Je vous ai donné
getLine
etprint
bien.Édité pour ajouter ma solution originale. La fissure de Christian était différente, mais exploitait les mêmes fonctionnalités de base (vous pouvez obtenir une quantité de calcul étonnante en accédant à des fonctions contenant du sucre syntaxique, même lorsque vous ne pouvez pas appeler directement un élément intégré ni même nommer les types impliqués).
Ce qui n'est probablement pas super-golfé de toute façon, mais ici, il est plus lisible:
la source
Python 2 , fissuré
Implémente l'addition en tant que fonction nommée
Essayez-le en ligne!
Qu'est-ce que cela fait?
Afin de vous aider un peu, je vais expliquer ce que cela fait. Ce code ouvre le fichier source et vérifie si le reste du code correspond aux critères suivants:
import
&)(,.:[]a`cdfijmonrt~
En cas d'échec de l'un ou l'autre critère, la limite de récursivité est définie pour
1
signifier que tout code que vous écrivez atteindra la limite de récursivité.Il n’ya aucune astuce ici, j’ai écrit une solution qui utilise uniquement ces caractères et aucune importation. Je ne fais rien de subversif, mais je dirai que je pense que ce sera assez difficile à résoudre.
Pour vous faire gagner du temps, voici une courte liste de choses utiles que vous ne pouvez pas faire avec cette restriction.
+
bien duh,eval
/exec
Je n'allais pas te laisser sortir avec çaLes nombres, ils pourraient être plus utiles que vous ne le pensez
Littéraux de chaîne
len
=
, Aucune variable d'affectation>
,<
,==
. . . Je vous ai laissé sans comparaisons*
,-
,/
,%
,^
,|
,>>
,<<
Les seuls opérateurs disponibles sont~
et&
__foo__
Aucune de ces méthodes de double soulignement sophistiquées n'est autorisée.la source
This code is not allowed to crash or exit.
(voir la discussion pour en discuter)Python 2 , fissuré
Ceci est la quatrième itération de cette réponse. Chacune des dernières réponses a été fissurée via la réinitialisation de la profondeur de récursivité.
Implémente l'addition en tant que fonction nommée
Essayez-le en ligne!
Qu'est-ce que cela fait?
Afin de vous aider un peu, je vais expliquer ce que cela fait. Ce code ouvre le fichier source et vérifie si le reste du code est composé uniquement de caractères
&)(,.:[]a`cdfijmonrt~
En cas d'échec, la limite de récursivité est définie pour
1
signifier que tout code que vous écrivez atteindra la limite de récursivité.J'ai également désactivé tous les modules, vous ne pouvez donc rien importer.
Il n’ya aucune astuce ici, j’ai écrit une solution qui utilise uniquement ces caractères et aucune importation. Je ne fais rien de subversif, mais je dirai que je pense que ce sera assez difficile à résoudre.
Pour vous faire gagner du temps, voici une courte liste de choses utiles que vous ne pouvez pas faire avec cette restriction.
+
bien duh,eval
/exec
Je n'allais pas te laisser sortir avec çaLes nombres, ils pourraient être plus utiles que vous ne le pensez
Littéraux de chaîne
len
=
, Aucune variable d'affectation>
,<
,==
. . . Je vous ai laissé sans comparaisons*
,-
,/
,%
,^
,|
,>>
,<<
Les seuls opérateurs disponibles sont~
et&
__foo__
Aucune de ces méthodes de double soulignement sophistiquées n'est autorisée.Ma solution
Alors maintenant que xnor a résolu le problème de manière suffisamment satisfaite, je vais révéler ma solution
Surprise, surprise, c'est un tas de charabia. Plutôt que de décomposer cela, je vais passer en revue le processus de création de ce document.
J'ai commencé avec un algorithme d'addition assez standard
Ensuite , j'ai utilisé une astuce pour représenter au niveau du bit
^
avec|
,&
,~
.J'ai utilisé un autre truc au bitwise pour me débarrasser de la
|
Maintenant tout ce qui reste est la
<<
, ne devrait pas être trop dur, non? Eh bien préparez-vous pour un trajet cahoteux. Pour remplacer le bitshift, j'ai utilisé des chaînes pour ajouter un zéro à la fin de sa représentation binaireCela pose quelques problèmes, mais le principal utilise l'addition . J'ai donc résolu ce problème en utilisant plutôt un format.
Nous ne sommes pas autorisés à utiliser bin. J'ai donc utilisé le formatage de chaîne pour convertir en binaire.
Depuis que les littéraux de chaîne sont interdits, je dois construire la chaîne à
{0:b}0
partir de parties faites avec des ticks arrière etjoin
les assembler.La chaîne vide est assez facile, vous pouvez juste faire
Les zéros étaient
et ils
{:}
ont tous été saisis dans des dictionnaires.b
semble assez difficile à obtenir, ce n'est pas dans notre jeu de caractères, alors comment sommes-nous censés obtenir un objet qui a unb
dans sonrepr
? Eh bien voici comment: lorsque vous utilisezrepr
une fonction intégrée, vous obtenez quelque chose qui ressemble àEt c’est d’où nous allons chercher notre
b
.Maintenant tout ce qui reste sont des nombres, je n'ai besoin que de -1, 0, 1 et 2 alors voici comment je les ai représentés:
2 pourrait en fait être un octet plus court
sur la base des suggestions de @ Blender dans les commentaires, mais je n'y ai pensé qu'après coup.
Nous substituons donc ces chiffres dans
Et c'est la fissure.
la source
C (gcc) fissuré!
Essayez-le en ligne!
Entrée de STDIN et sortie sur STDOUT.
Cela fonctionne sans erreur. Hahaha c'est tout à fait mal. Je l'ai seulement testé sur le gcc de TIO. Comme d'habitude, vous devez ajouter votre code après cet extrait pour que cela fonctionne :) Le commentaire est méchant, ne l'écoutez pas.
Testé sur
gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
. Devrait fonctionner sur n'importe quel système Linux.Solution originale
la source
__asm__
et vous avez l'embarras du choix de fonctions :) ne pensez pas que C et C ++ sont de bons ennemis ici.C (GCC sous Linux) (fissuré)
Au lieu d'utiliser des techniques de bac à sable idiotes pour la lecture de fichiers, nous le faisons correctement - avec la liste blanche de SECCOMP!
Votre tâche: implémenter l’ajout avec entrée de STDIN et sortie vers STDOUT.
Essayez-le en ligne!
WTF est-ce !?
Pour vous aider dans votre tâche insurmontable, je vais vous expliquer ce que fait ce code.
__attribute__ ((constructor(0)))
assure que las
fonction est exécutée en premier. La fonction ferme tous les descripteurs de fichiers ouverts pour STDIN, STDOUT et STDERR. Ensuite, le programme se limite à une liste blanche stricte SECCOMP, qui limite vos appels système aux éléments suivants:Par conséquent, vous ne pouvez pas ouvrir de nouveaux fichiers (ou faire quoi que ce soit). Nous arrivons ensuite à main et appelons votre code, bien emballé dans la
sandbox
fonction.En
syscall(SYS_exit, EXIT_SUCCESS);
fin de compte, il s’agit simplement de s’assurer que le programme se ferme proprement - par défaut, GCC se fermera avecexit_group(2)
ce qui n’est pas autorisé par la liste blanche SECCOMP. Cette fonction existante est appelée après l' exécution de votre code.Donc, vous n'avez aucun descripteur de fichier ouvert et vous ne pouvez rien ouvrir de nouveau. Impossible, non? ;)
la source
Haskell , fissuré par Ben
Essayez-le en ligne! Cela devrait être un programme complet lisant deux nombres de stdin et sortant la somme sur stdout.
Chaque programme complet commence par exécuter la
main
fonction, mais icimain
s’appelle et provoque une boucle infinie. Pour aggraver les choses, un commentaire de ligne est démarré avec--
directement derrière l'appel récursif afin d'éviter de le modifier, par exemplemain2
, puis de le définir pour effectuer la somme.Solution envisagée:
Essayez-le en ligne!
--
démarre un commentaire de ligne sauf s'il peut également être analysé dans le cadre d'un opérateur. (La syntaxe en surbrillance semble ignorer ce fait.)--$
Est un opérateur infixe valide qui prendmain
comme premier argument et un second argument factice()
. Il est ensuite défini pour ignorer les deux arguments et pour effectuer la tâche requise à la place.la source
Assemblage en mode réel x86 16 bits ( fissuré )
Facile si vous connaissez le truc.
la source
or [bp], 256
est invalide. Est-ce supposé l'êtreor WORD PTR [bp], 256
?)hlt
instruction (anneau 0) implique fortement qu'il ne s'agit pas d'un mode protégé.Your submission must contain enough information before being revealed to be reproducible after being revealed
Javascript, fissuré
Ce défi est basé sur celui de Grant Davis , mais il résout la solution à laquelle il pensait (ce qui crée un iframe et utilise celui-ci
window
). La solution s'exécute dans la console javascript sous Chromeabout:blank page
, en prend deuxinput()
, les additionne et donneconsole.log
le résultat. Mettez votre code après:Tout d'abord, nous clobber
prompt
etconsole
et définir le raccourcid
. Ensuite, nous créons un observateur de mutation avec un rappel qui supprime chaque cible mutée. Nous configurons l'observateur de la mutation pour qu'il observe le document et le notifiechildList
ainsi que lessubtree
modifications. Au lieu du littéraltrue
, nous utilisons notre raccourci vers la valeur de véritédocument
(la spécification ne le permet pas, mais chrome le permet).Après avoir posté ceci, j'ai réalisé un clobber beaucoup plus élégant. Ma solution prévue fonctionne toujours, mais la fissure affichée ne:
la source
Perl 5, fissuré par Ilmari Karonen
L'entrée est reçue sur des lignes séparées
STDIN
et la sortie est impriméeSTDOUT
.Tout le code va après le
__DATA__
marqueur. Ceci utilise une méthode similaire à la solution de @ WheatWizard en ce sens que le code est analysé et que les caractères inutilisables sont supprimés.Cela a été testé sur les versions 5.8, 5.10 et 5.16 et ne nécessite aucun indicateur de ligne de commande.
Essayez-le en ligne!
la source
STDIN
avec des caractères sur des lignes séparées etSTDOUT
. Je vais ajouter ceci au corps principal.Python 3, fissuré par zbw
Tous les modèles ont été supprimés, ce qui signifie qu’il n’ya pas de fonctions intégrées disponibles et qu’il est impossible de faire beaucoup plus. Sortie sur STDOUT, entrée de STDIN. Ceci est la deuxième itération de cette réponse après que la précédente a été cassée par une fissure triviale en ajoutant une instruction break.
la source
APL (ngn-apl) , fissuré par ngn
Fabriqué en coopération avec mon collègue Marshall .
Entrer par les arguments gauche et droit à
+
. Par exemple, votre objectif est d’insérer le code après le texte suivant, de sorte que votre dernière ligne soit lue⎕←3+2
et sortie5
vers STDOUT.Essayez-le en ligne!
Fonctionne en définissant toutes les fonctions utiles
{}
qui prennent un ou deux arguments et renvoient une liste numérique vide. Définit également⍣
pour composer uniquement des fonctions.Fissure
⍺⍵1/0
répliquer 0 par l'argument gauche et l'argument droit et 1⍋
obtenir les indices qui trieraient cela (puisque tous les éléments sont nuls, cela donne 0 1 2… (a + b)⌈/
la valeur maximale (a + b)la source
+
utilisant uniquement de l’APL pur et sans astuces.Python 2 , fissuré
Ceci est la deuxième itération d'une réponse qui a été craquée une fois par @HyperNuetrino en utilisant une méthode à laquelle je ne m'attendais pas. Je l'ai maintenant corrigée alors j'espère que les seules solutions restantes devront respecter les restrictions que je voulais.
Implémente l'addition en tant que fonction nommée
Essayez-le en ligne!
la source
u
, mais je suis coincé sans.u
?.count
. Je peux obtenir une chaîne aussi longtemps que la sortie désirée, mais je n'ai aucun moyen de prendre sa longueur.__import__('sys').setrecursionlimit(100)
... et rien n'a été patché. Je n'ai pas vraiment envie de le poster dans le fil du voleur, mais plutôt de tricher. Essayez-le en ligneJava 8, fissuré par @ OlivierGrégoire
Voici ma tentative. En gros, l’idée est de simplement surcharger tous les espaces de noms que vous pouvez utiliser pour afficher (et refléter, j’espère). La sortie est destinée à sdout (System.out).
Les listes noires sont généralement une approche pire que les listes blanches, alors je suis sûr que ce n'est qu'une question de temps avant que quelqu'un propose une approche que je n'ai pas envisagée.
la source
class String{}
après des tests sans me rendre compte que cela serait inoffensifmain(String[] ...)
. Cela devrait fonctionner maintenantint sum = 0; new Exception("" + sum) { public void printStackTrace() { ClassLoader cl = ClassLoader.getSystemClassLoader(); try { printStackTrace(new PrintStream((PrintStream)cl.loadClass("java.lang.System").getDeclaredField("out").get(null))); } catch (Exception e){} } }.printStackTrace();
queues, fissuré par Mayube
Cela devrait être assez facile, mais on ne sait jamais.
Le "problème" était que sans
C
votre code, vous aviez une erreur.La solution de Mayube:
Chaque élément de la séquence est la première entrée plus la deuxième fois la troisième (ou 1)
Mes solutions:
La séquence alterne entre la première entrée plus la deuxième entrée et la troisième entrée (1). Le premier élément dans le second est
A+B
.Semblable à la solution de Mayube - au lieu de multiplier
B*C
, ajouteC
et soustrait ensuite.Essayez-le en ligne!
Explication
Actuellement, ce programme génère des sorties
1
, car sans entrée d'utilisateur, la première entrée est la première1
de l'entrée par défaut (#
).la source
Default input is combined with user input to form the total input, which must align with the expected input (which is based on the highest input requested by the Sequence Definition)
A,B,C,D,E
du code. Par exemple, si à un moment quelconque vous avez la variableD
dans votre programme, l'analyseur s'attend à ce qu'il y ait 4 entrées, mais s'il y a aussi unE
, l'analyseur s'attend à ce qu'il y ait 5 entrées. Il ne peut y avoir moins que le montant attendu. Cependant, il existe toujours une dernière entrée facultativen
, qui est utilisée de différentes manières selon les modes.A
, il recherche donc une entrée. Puisqu'il y en a deux, les deux provenant de#
qui spécifie l'entrée par défaut, il utilise le premier commeA
valeur et le second commen
.BC
, A serait la première entrée, B serait la deuxième, C serait 1 et n serait la deuxième 1?#1,1
(pas de barre), ce serait: A en tant que premier 1, B en tant que second 1, C en tant que première entrée et n en tant que deuxième entrée. Vous pouvez également le faire#1|1
, où A est le premier 1, B est la première entrée, C est la deuxième entrée et n est la seconde.Node.JS version 7.3.0 (fissuré par Dom Hastings)
Placez le deuxième bloc de code après le premier.
Avertissement: le deuxième bloc de code ne fonctionnera pas seul (sans être placé après le premier). Si cela n'est pas autorisé, je peux toutefois modifier le deuxième extrait.
Ceci est un programme complet. La sortie est
process.stdout
(STDOUT), l'entrée estprocess.argv
(arguments de ligne de commande)C'est mes premiers flics et voleurs, heureusement c'est un bon challenge :)
Essayez-le en ligne!
Le défi expliqué
Génère une variable aléatoire
n
de 0 à 1e7. Si vous appelez write avec le correctn
, n’imprimez rien, mais définissezl
sur 0, ce qui «déverrouille» la fonction d’écriture, vous permettant d’imprimer quoi que ce soit. Si vous essayez d'appeler write avec une chaîne autre qu'une chaîne, vous êtes envoyé dans une boucle infinie. Si vous essayez d’appeler en écriture avec une valeur autre que la valeur correcten
alors que l’écriture est "verrouillée", vous êtes renvoyé dans une boucle infinie afin d’éviter de deviner.La solution envisagée
Se faufile au-delà du type qui vérifie apparemment les chaînes en utilisant un symbole, qui commence également par s. Cela renvoie une erreur dans la fonction résultant de l'appel eval car vous ne pouvez pas ajouter la chaîne "f" à un symbole. Nous attrapons l'erreur et utilisons regex pour récupérer
n
de la trace de pile, où elle se trouve dans le nom de la fonction. Ensuite, nous essayons d’écrire,n
ce qui n’imprime rien, mais définit la variable "lock"l
sur 0 pour "déverrouiller" la fonction write. Maintenant que la fonction d'écriture est déverrouillée, nous imprimons simplement la somme.la source
RProgN2 , fissuré par Arnold Palmer
Écrit sur tous les opérateurs mathématiques, sans aucun moyen de les restaurer. En particulier, il les remplace par une fonction qui supprime les deux premiers éléments de la pile.
Essayez-le en ligne!
Solution d'origine
Essayez-le en ligne!
la source
²
symbole fait. Tu veux m'éclairer?[[
dans ce cas et les englobe dans une fonction @ArnoldPalmer«»
créer des variables locales au lieu de modifier des variables globales aurait été extrêmement utile.Haskell,
161144 octets, fissuré par BlackCapEntrée sur STDIN, sortie sur STDERR. Ajouter à la fin du programme.
Edit: Destiné à être compilé sans aucun argument supplémentaire GHC, juste la normale
ghc --make prog.hs
.Edité à nouveau pour réduire le nombre d'octets.
S'amuser!
la source
main = do x <- readLn :: IO Integer; y <- readLn; print $ x + y
main
fonction soit dans le moduleMain
lorsqu'aucun-main-is
indicateur n'est fourni.Mascarpone , fissuré par Ilmari Karonen
L'entrée est composée de chiffres d'église sur stdio, en utilisant
i
pour incrémenter etz
pour zéro. Par exemple, 2 + 3 serait:Avec une fin de nouvelle ligne, la
sortie doit être un nombre sur stdout, au même format que sur stdio. Par exemple, si la réponse est cinq, vous devez générer:
(le mascarpone n'a pas de concept de nombres)
Solution envisagée:
Cela ne ressort pas immédiatement de la documentation, mais comme @IlmariKaronen l'a indiqué dans son crack, les littéraux de chaîne dans Mascarpone sont en réalité un sucre syntaxique pour pousser une séquence de caractères.
J'ai délibérément écrit des commentaires comme
[this]$
pour faire croire que je pousse une corde et que je la saute immédiatement après. Un cracker naïf aurait peut-être tenté[:,>!]/*
de pousser une corde, de l'échanger avec l'interprète et de l'interpréter.Je fais aussi semblant de faire apparaître l'interprète avec lequel je suis parti
$
, mais il$
a déjà été redéfini en NOP. Il ne vous reste plus que cet interprète sur la pile et vous devez l’emporter tout au long du programme; à travers chaque caractère de chaque chaîne.la source
C # (.NET Core) fissuré par Ilmari Karonen
Aussi craqué par Josué .
Lit les deux valeurs de stdin et écrit le résultat dans stdout. Testé sur Windows avec Framework Version 3, 4.6 et sur TIO .
Voici le programme complet que j'avais prévu.
Essayez-le en ligne!
la source
GolfScript , craqué par Dennis
Essayez-le en ligne!
C'est un golf de code défi, après tout, alors pourquoi ne pas essayer GolfScript?
Une solution valide doit être un extrait de code qui lit deux entiers de la pile, les additionne et renvoie le résultat dans la pile. Le problème, c'est que cela devrait continuer à fonctionner même après que le code ci-dessus ait redéfini la quasi-totalité des opérateurs GolfScript intégrés sans rien faire. Au moins, je suis restée
;
intacte, de sorte que vous pouvez toujours extraire des valeurs de la pile. ;-) Votre code devrait fonctionner sur l'interpréteur GolfScript standard, tel que mis en œuvre par exemple sur TIO (voir lien ci-dessus).La solution de Dennis , comme moi - même , repose sur la rarement utilisé caractéristique de GolfScript qui permet le code Ruby interpolée dans des chaînes entre guillemets. Nous utilisons cette fonctionnalité pour définir un nouvel opérateur d'addition qui fonctionne exactement comme l'
+
opérateur intégré , puis nous l'appelons.(Une des raisons pour laquelle la fonction d'interpolation Ruby dans GolfScript est si rarement utilisée est que, bizarrement, le code Ruby interpolé est exécuté lors de l'analyse et que sa sortie est mise en cache par l'interpréteur GolfScript. Ainsi, par exemple, vous avez une chaîne avec un code Ruby interpolé. dans une boucle, le code ne sera exécuté qu'une seule fois avant le démarrage du programme , puis restituera toujours la même valeur à chaque itération de la boucle. Vous pouvez contourner ce problème en utilisant chaîne eval pour différer l'analyse, mais cela rend la syntaxe déjà complexe encore plus complexe. moche et prolixe, et en tout cas pour ce défi, j’ai aussi désactivé l’opérateur eval
~
, mais il s’avère que la définition de nouveaux opérateurs GolfScript intégrés est une chose que cette fonctionnalité fait réellement très bien et proprement.)la source
"#{var'_','gpush a+b'.cc2}";_
: elle fonctionne exactement comme la vôtre, à l’exception d’être plus courte de quelques octets.Node.js v8.2.0, fissuré par Dom Hastings
Vous devez implémenter la
logic
fonction. L'entrée correspond aux arguments fournis (à partir de stdin), la sortie correspond à tout ce que votre fonction renvoie (est imprimée sur stdout).Mon église de code code les nombres de l'entrée. Le reste du code est juste là pour vous intimider.
La fonction mess permet de mettre en œuvre une notation sans points (
a . b == dot (a) (b)
), que j'utilise principalement pour ajouter. id .
des emplacements aléatoires, ce qui ne fait rien, mais qui confondra toute personne peu familière avec la programmation fonctionnelle.La transformation appliquée aux nombres avant que je ne les passe à la
logic
fonction estx+1
ety-1
, ce qui donne 0, alors c'est un autre NOP à ajouter à l'obscurité.La solution envisagée était:
la source
Inform 7 , craquelé par poivre
Le lecteur doit saisir l’entrée sous forme de commande interactive, par exemple
add 17 to 25
ousum 17 25
. Vous êtes libre de choisir la forme exacte de la commande à saisir, à condition qu'elle comporte deux nombres. La somme des nombres (par exemple42
) doit être imprimée en réponse à la commande.Le défi, bien sûr, consiste à faire cela alors que toute l'activité de "lecture d'une commande" est remplacée par une opération d'interdiction. Il y a probablement plusieurs façons de résoudre ce problème, mais au moins cela devrait nécessiter une certaine connaissance de la langue. Celui que j'ai créé est en fait assez simple, bien qu'un peu inattendu.
J'ai testé ma solution dans l'EDI GNOME Inform 7, version 6L38 , sur Ubuntu Linux. La solution envisagée fonctionne à la fois sur les back-ends Glulx et Z-machine, et devrait également fonctionner sur les autres versions récentes d'Inform 7. Notez que (sans solution de contournement appropriée) le code ci-dessus entraînera la boucle d’occupation de l’interprète lorsqu’il essaiera de lire une commande; l'interpréteur Z-machine semble ne plus répondre, et ne peut pas être arrêté à partir de l'EDI. Je recommande donc d'utiliser Glulx pour les tests.
la source
CPython 3 (encore), fissuré par Sisyphe
Vous pouvez faire tout ce que vous voulez - tant que cela n’est pas implémenté en C. Cela signifie non
print
, noninput
, tous vont_(1)
s’arrêter et se terminer. Entrée de STDIN avec les numéros sur deux lignes séparées, sortie vers STDOUT. Je me demande combien de temps cela va durer ... Il m'a fallu un bon bout de temps pour trouver le deuxième extrait fonctionnel après avoir découvert cette astuce invalidante. Spécifier explicitement Cpython pour éviter d'être craqué n'est pas basé sur une implémentation alternative de sys.setprofile.la source
functools
?Java 8 ( fissuré )
Deuxième essai. Cette fois, j'ai investi deux minutes de test.
La plupart des choses devraient être couvertes.
la source
Python 2 fissuré
Essayez-le en ligne!
Je commencerai par dire que cette réponse est un geste sournois, conçu comme une réponse inférieure.
Inspiré des réponses de Wheat Wizard et HyperNeutrino .
L'extrait lit le fichier source et refuse de continuer si le dernier fragment de code séparé par des espaces n'est pas sha256
e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843
.EDIT : édité légèrement en réponse à ce commentaire . Le problème principal ne change pas, aucune tentative de crack n’est invalidée.
la source
This code is not allowed to crash or exit.
Java 8 fissuré par @ OlivierGrégoire
J'ai essayé de le rendre aussi difficile que possible! :) Et contrairement aux autres réponses Java à ce jour, vous devrez suivre les règles exactes du défi, en le plaçant après tout l'extrait de code (alors non, vous ne mettez pas votre code dans la
public static void main(String[] args)
méthode, vous le mettez après toute la classe. :) bonne chance!J'ai ajouté des commentaires pour montrer ce qui est restreint.
( Inspiré par ce message, qui est moins restrictif et béatifiable avec la même approche que je pourrais utiliser pour ma réponse. )
Essayez ici. (ideone.com au lieu de TIO, car cela ne semble pas fonctionner ici. Des tests ont été effectués dans l'EDI Eclipse, mais la solution que vous envisagez fonctionne si vous utilisez ideone.com.)
la source
Gelée: craquelée
Ce sera incroyablement facile comparé à l’impressionnante réponse en Python de Wheat Wizard, mais on y va: P
Sha256 hexdigest de ma solution de contournement, y compris le premier extrait, est
cfeb1e193ad77f66f039c0d6a792a3e4c311490f6412698e019ca1fae10c0e0a
.Remarque
Vous ne pouvez pas avoir de nouvelles lignes dans le code, sauf pour les chaînes, sinon ce code ne sera même pas exécuté, ce qui irait à l'encontre de l'objectif de ce défi.
Fissuré par DJMcMayhem
Pour être juste, cela utilise une nouvelle ligne, alors j'aimerais voir une solution qui n'utilise pas de nouvelle ligne.
Également une solution de Jonathan Allan
Cela n'utilise pas de saut de ligne, il a donc été craqué. : P
Ma solution est la suivante:
Le premier extrait ne supprime que les atomes à caractère unique, ce qui signifie que Python eval fonctionne toujours :)))
la source
JavaScript, fissuré
Entrée:
prompt()
deux foisSortie:
console.log()
Ma solution ne fonctionne pas dans jsfiddle. Fonctionne sur le sujet: page blanche avec la console JS de Google Chrome.
Ma solution:
Explication:
J'ai enlevé prompt et console en les fixant égaux à 0.
Dans ma solution, je crée un iframe, qui crée un bac à sable, et une nouvelle instance de window dans laquelle prompt et console fonctionnent correctement.
la source
Java, fissuré
Cela
devrait êtretrès facile à craquer.Solution envisagée
Essayez-le en ligne
la source
java.io
.. Mais vous avez quand même la solution prévue ..