Inspiré par ce commentaire ...
Merci aux utilisateurs Step Hen , Wheat-Wizard et Dennis pour m'avoir aidé à solidifier les spécifications de ce défi avant de le poster!
Ceci est le fil du voleur! Pour le fil des flics, 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 d'être un langage de programmation. Dans ce défi, cela signifie faire en sorte que la langue ne puisse plus ...
Prendre l'entrée et la sortie numériques
Additionnez deux nombres ensemble
Testez si un certain nombre est un nombre premier ou non.
C'est un défi de flics et de voleurs , où il y a deux défis différents avec deux objectifs différents: Les flics vont essayer d'écrire du code qui rend le langage principalement inutilisable, et le voleurs vont essayer de trouver la solution cachée qui permet aux flics pour récupérer leur langue.
Les flics écriront deux extraits de code:
Celui qui rend leur langage pratiquement inutilisable, par exemple en supprimant les fonctions intégrées pour effectuer des opérations d'entrée / sortie et numériques. Ce code n'est pas autorisé à planter ou à quitter. 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 nombres en entrée, les additionne et génère leur somme. Cet extrait doit toujours fonctionner correctement même après avoir exécuté le premier extrait. Lorsque les deux extraits sont combinés ensemble, ils doivent former un programme complet qui ajoute deux nombres ou définir une fonction qui ajoute deux nombres. Cet extrait de code s'appuiera probablement sur un comportement obscur et sera difficile à trouver.
Les flics choisiront également n'importe quelle méthode standard d'entrée et de sortie . Cependant, ils doivent révéler exactement le format (entrée et sortie) qu'ils utilisent. Pour que vous puissiez cracker leur réponse, vous devez suivre le même format d'entrée / sortie, sinon votre crack ne compte pas.
Une réponse de flics révélera toujours
Le premier extrait (évidemment pas le second).
Langue (y compris la version mineure, car la plupart des soumissions s'appuieront probablement sur d'étranges cas marginaux)
Format IO, y compris s'il s'agit d'une fonction ou d'un programme complet. Les voleurs doivent utiliser le même format pour être un crack valide.
Tout cas de bord étrange requis pour que leur réponse fonctionne. Par exemple, ne fonctionne que sur Linux ou nécessite une connexion Internet .
En tant que voleur, vous devez regarder l'une des soumissions des flics et tenter de la casser. Vous pouvez le casser en écrivant tout extrait valide qui pourrait fonctionner comme l'extrait 2 (en ajoutant deux nombres ensemble après que la langue est rendue inutilisable). Il n'est pas nécessaire que ce soit le même extrait que le flic a écrit à l'origine. Une fois que vous avez une réponse craquée, postez votre code comme réponse sur ce fil et postez un lien vers votre réponse en tant que commentaire sur la réponse du flic. Ensuite, ce message sera modifié pour indiquer qu'il a été craqué.
Voici un exemple. Pour le premier extrait, vous pouvez voir le programme python 3 suivant comme une réponse des flics:
Python 3
print=None
Prend l'entrée de STDIN et la sortie vers STDOUT
Un deuxième extrait valide peut être
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Ceci est valide car il prendra deux nombres en entrée et affichera 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)
C'est une fissure valable à leur réponse.
Si la réponse d'un policier reste non fissurée pendant une semaine entière, il peut modifier son deuxième extrait de code et indiquer que sa réponse est désormais sûre. . Une fois qu'il est modifié pour être sûr, vous ne pouvez plus tenter de le casser. S'ils ne le modifient pas comme sûr, vous pouvez continuer à essayer de le casser jusqu'à ce qu'ils le fassent.
Le gagnant du fil du voleur est l'utilisateur qui a obtenu le plus de réponses, le bris d'égalité étant le moment où il a atteint N fissures. (donc si deux utilisateurs différents ont chacun 5 fissures par exemple, l'utilisateur qui a affiché sa 5ème fissure en premier est le gagnant) Après un laps de temps suffisant, j'accepterai la réponse du gagnant avec le plus de votes.
S'amuser!
Clarifications des règles
Le premier extrait doit s'exécuter correctement sans prendre aucune entrée . Il peut produire ce que vous voulez et cette sortie sera ignorée. Tant que l'extrait est terminé, le deuxième extrait s'exécute correctement.
Le deuxième extrait doit en fait ê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 il ne rompt pas la langue. Il s'arrête simplement.
Après avoir été en sécurité, votre score est le nombre d'octets des deux extraits .
Cela remonte à Veuillez révéler tout cas de bord étrange requis pour que votre réponse fonctionne ... 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, puis vous modifiez dans: Voici ma réponse. Oh ouais, BTW cela ne fonctionne que si vous l'exécutez sur Solaris, blagues sur vous! votre réponse n'est pas valide et sera supprimée et ne sera pas considérée comme éligible pour gagner.
Le deuxième extrait est autorisé à se bloquer après la sortie de la somme. Tant que la sortie est toujours correcte (par exemple, si vous choisissez de sortir vers STDERR, puis que vous obtenez un tas d'informations sur les plantages, cela n'est pas valide)
Classement
Voici une liste de chaque utilisateur avec au moins une fissure, triée par score puis par nom (alphabétique). Si vous soumettez un crack, veuillez mettre à jour votre score en conséquence.
#User #Score
Ilmari Karonen 8
Dennis 5
Olivier Grégoire 4
Sisyphus 3
Veedrac 3
Arnold Palmer 2
Bruce Forte 2
DJMcMayhem 2
Dom Hastings 2
ppperry 2
1bluston 1
2012rcampion 1
Ben 1
BlackCap 1
Christian Sievers 1
Cody Gray 1
HyperNeutrino 1
Joshua 1
Kaz 1
Mark 1
Mayube 1
Xnor 1
zbw 1
la source
SecurityManager
qui était dans le champ d'application ... Vous pouvez également lireSystem.in
à ce stade, car il n'est pas encore fermé.sun.awt.SecurityManager
et"sun.awt.command"
dépendent plate - forme et ne sont pas partie de Java .System.getProperties().get("blah")
(puisque je n'ai bloqué l'accès qu'àSystem.getProperty
, nonSystem.getProperties
), mais c'est assez bien! Bien joué!C (GCC / Linux) par Sisyphe
Cet extrait ferme la fonction fournie et en démarre une nouvelle (injection de code classique), qui se redéfinit de
close
sorte qu'au lieu de fermer le fd, exécute notre code souhaité.la source
Python, la solution de Wheat Wizard ici
Je veux dire, vous pouvez simplement rétablir la limite de récursivité, et rien de mauvais ne se produit ...
Fonctionne sur TIO
Remarque
Ceci est ma toute première soumission CnR, donc si cela enfreint les règles, dites-le-moi et je supprimerai cela.
la source
os.sys
- vous , si cela fait une différence: PHaskell par Ben
J'ai toujours des nombres littéraux et des caractères (j'utilise
0
,'0'
et'-'
),[a..]
et[a..b]
qui sont très utiles. Et j'ai unaire-
, mais je pourrais m'en passer.Je recrée
++
pour implémenterr
(reverse
) et définirt
etts
qui sonttail
ettails
.x a b
renvoie len
e élément deb
, oùn
est la longueur dea
moins un.x
pourrait généralement être défini commesnd.last.zip
. La fonctiond
prend une liste et renvoie une liste avec les éléments de ces positions qui sont des multiples de dix.l!!s
renvoie len
e élément del
, oùs
est la représentation sous forme de chaîne inversée den
.+
renvoie comme entier la somme de deux nombres naturels donnés sous forme de chaînes inversées, de même-
pour la différence.add
renvoie comme entier la somme de deux entiers éventuellement négatifs donnés sous forme de chaînes.Je me demande si cela ressemble un peu à ce que Ben avait en tête.
la source
:
portée était même avecNoImplicitPrelude
et sans rien importer.C (gcc) par Conor O'Brien
Essayez-le en ligne!
la source
Python 2 par Wheat Wizard (quatrième itération)
Essayez-le en ligne!
Aucun exploit, juste une fonction à ajouter en utilisant uniquement des caractères
' &)(,.:[]a`cdfijmonrt~'
, comme prévu (en fait seulement'(),.:[]`acdfijmnort'
).Je n'ai pas essayé de faire court; Je viens d'écrire des sous-expressions pour des valeurs intermédiaires comme 0 et la chaîne vide et les chaînes substituées dans.
Essayez-le en ligne!
L'idée de base est que le format de chaîne
'{0:5}'.format('1')
remplit le nombre zéro à une longueur5
similaire'1 '
. En concaténant deux de ces chaînes en utilisant''.join
, la somme de leur longueur est la somme des nombres d'entrée. Ensuite, nous clouons sur un0
à la fin et appelons.find()
à la position finale, qui est la somme.La chaîne
'{0:5}'
à formater est produite en extrayant les{:}
caractères des représentations de chaîne des dictionnaires créés avecdict
. La chaîne de repr de chaque sommation successive est placée là où serait le 5. Je voulais utiliser un dict comme{0:5}
lui, mais sa repr comprend un espace qui l'a gâché.Les entrées de 0 gâchent le processus car la chaîne sub a une longueur minimale de 1. Nous avons celles avec un
and/or
pour donner la chaîne vide dans ce cas.la source
int([]in[])
simplementint()
car les deux afficheront 0.Haskell, par Laikoni
la source
assemblage en mode réel x86 16 bits, par Joshua
Explication:
La «casse» introduite par le code de Joshua est la définition du drapeau de déroutement (TF), qui met le processeur en mode à étape unique. Cela signifie qu'une seule instruction sera exécutée à la fois, avant que le CPU ne s'arrête (intercepte) avec une interruption de type 1. C'est ce qui permet aux débogueurs d'implémenter le code pas à pas - assez pratique là-bas, mais un vrai PITA si vous voulez exécuter le code en dehors du contexte d'un débogueur!
C'est la section de code suivante qui active l'indicateur d'interruption:
L'implémentation de l'indicateur d'interruption signifie que nous avons la possibilité d'exécuter exactement une instruction avant les interruptions du processeur, c'est-à-dire celle qui vient immédiatement après la
POPF
ici. Donc, nous devons faire en sorte que cela compte.L'astuce est l'
INT 3
instruction, qui appelle l'interruption numéro 3. Il y a deux raisons pour lesquelles cela fonctionne pour "décomposer" le code:L'indicateur d'interruption est effacé dans les gestionnaires d'interruption. Ce n'est qu'une partie de la conception d'Intel, mais cela a probablement été fait pour des raisons de santé mentale de base. Rappelez-vous que l'implémentation de l'indicateur d'interruption est qu'une interruption de type 1 est invoquée après l'exécution de chaque instruction, donc si TF n'était pas effacé, déclencherait lui
INT 1
- même une interruption — ce serait des interruptions jusqu'en bas. De plus, le fait d'interrompre TF en clair facilite simplement le débogage du code, un peu comme un IDE qui passe automatiquement les appels aux fonctions de bibliothèque.La façon dont interrompt le travail est essentiellement la même que dans la mesure du possible
CALL
. Ils invoquent le gestionnaire d'interruption dont l'adresse est stockée à la position correspondante dans la table vectorielle d'interruption globale. Étant donné que cette table commence à l'adresse0x0000:0000
et est stockée dans un octet 4segment:offset
format à , le calcul de l'adresse est aussi simple que la multiplication de 4 par le vecteur / numéro d'interruption. Dans ce cas, nous invoquons l'interruption 3, de sorte que ce serait 4 × 3 = 12.… Et vous remarquerez que Joshua a réfléchi à cela pour nous. Avant d'activer l'indicateur d'interruption, il a le code suivant:
qui définit
0x0000:000C
(le gestionnaire d'interruption pourINT 3
) surBP:SI
. Cela signifie que chaque fois qu'ilINT 3
est invoqué, il pousse le registre FLAGS sur la pile, suivi de l'adresse de retour, puis se ramifie versBP:SI
, ce qui nous permet de recommencer à exécuter du code, dans un contexte où l'indicateur d'interruption est désactivé.Tout est en descente après
INT 3
. Tout ce que nous devons faire est d'ajouter deux nombres ensemble et d'imprimer le résultat. Sauf que ce n'est pas aussi simple en langage assembleur que dans d'autres langues, c'est donc là que la majeure partie du code est dépensée.Joshua autorise le voleur à spécifier les mécanismes d'E / S qu'il souhaite , je prends donc l'approche simpliste en supposant que les valeurs sont passées dans les
DX
etCX
registres . C'est raisonnable, car ceux-ci ne sont encombrés nulle part par son code "prologue".La sortie se fait ensuite en stockant des octets ASCII directement dans la mémoire vidéo. Le tampon vidéo commence
0xB800:0000
sur un CGA, EGA et / ou VGA en mode texte, nous commençons donc à y imprimer. Le format est: caractère dans l'octet bas et attribut couleur dans l'octet haut. Cela signifie que chaque caractère est sur un décalage de 2 octets. Nous parcourons simplement chacun des chiffres du nombre (base-10), les convertissant en ASCII et les imprimant un par un à l'écran. Oui, c'est beaucoup de code. Il n'y a pas de fonctions de bibliothèque pour nous aider en langage d'assemblage. Cela peut presque certainement être optimisé davantage, mais je suis fatigué de travailler dessus ...Une fois la sortie affichée, le code est autorisé à planter ou à faire quoi que ce soit, donc nous effaçons simplement les interruptions et arrêtons le CPU.
la source
INT 3
reviens immédiatement à l'instruction qui le suit, donc je suis juste allé avec. Cela a peut-être quelque chose à voir avec mon environnement de test?CLI
ne désactiverait que les interruptions matérielles, mais même si elle dépassait laHLT
, vous penseriez qu'elle tomberait et exécuterait le codel
immédiatement après.Python 2 par TwiNight
Essayez-le en ligne!
la source
Python 3 , le deuxième défi de Ppperry
Wow, c'était amusant! J'ai aimé résoudre ce problème.
Edit: OK, je l'ai corrigé. Il semble que les classes étaient à un index différent dans la liste des sous-classes sur TIO que sur mon ordinateur, donc je l'ai fait fonctionner pour les deux, et j'ai ajouté un TIO.
Essayez-le en ligne!
la source
sys.excepthook is missing
?sys.excepthook
, mais il y aura une vraie cause quelque part là-dedans.)IndexError('list index out of range',)
. Cela correspond à la définition de_io_RawIOBase
._io_IOBase = [cls for cls in object.__subclasses__() if cls.__name__ == '_IOBase'][0]
devrait fonctionner partout.Haskell par zbw
Impossible d'exécuter du code au moment de l'exécution? Exécutez-le au moment de la compilation!
C'était très amusant, je ne connaissais pas le modèle haskell avant ce défi.
la source
Gelée par hyper neutrino
Super simple. La nouvelle ligne empêche le premier lien d'être appelé.
Essayez-le en ligne!
la source
Python 2 par Wheat Wizard
Essayez-le en ligne!
la source
Java par LordFarquaad
Bloquer l'accès aux objets au niveau source était vraiment intelligent (et ennuyeux lors des tests), bravo!
la source
ClassLoader
j'avais été observé?"".getClass().getClassLoader()
. L'observation n'est généralement qu'un problème auquel vous devez penser une fois, puis c'est ok. Vous pourriez même observerObject
, je serais toujours en mesure de résoudre ce problème. D'accord, vous pourriez me forcer à utiliser la solution de 1 Ko, mais c'est possible.Ruby par histocrat
Essayez-le en ligne!
la source
Inform 7, par Ilmari Karonen
Abus flagrant de noms ambigus ... Mon code commence par
factory is a room
. La ligne précédente est le code du flic. Tapezadd 1 and 1
pour obtenir 2, par exemple.la source
Java, Roman Gräf
Définit
stdout
etstderr
revient à leurs valeurs initiales.Je crois que je suis capable d'utiliser le nom complet au lieu d'une importation, si je me trompe, corrigez-moi (c'est mon premier post ici.) Cela pourrait probablement être fait en utilisant la réflexion également.
Edit: voici une solution réfléchissante utilisant uniquement
java.lang.reflect.*
:la source
stdin
,stdout
etstderr
sont stockés ailleurs! Vous n'avez même pas besoin d'utilisersetOut
etsetErr
comme vous pouvez simplement utiliserPrintStream
directement.JavaScript par Daniel Franklin
Cela peut être considéré comme une solution légèrement tricheuse, mais cela fonctionne pour moi sur Chromium 59 / Linux, même si je reçois également un avertissement disant:
Ps. Voici une autre fissure, cette fois sans avertissements:
la source
prompt()- -prompt()
sauve deux octetsJava 8 par Olivier Grégoire
Une fissure extrêmement verbeuse pour un défi énormément verbeux. :) La douleur de travailler indirectement avec des classes que vous ne pouvez pas nommer est palpable.
Essayez-le en ligne!
Ps. Voici ma tentative précédente, écrite avant qu'Olivier ne précise que l'entrée devait être prise via des arguments de ligne de commande. Contrairement à la fissure ci-dessus, celle-ci n'est pas spécifique à Linux.
Essayez-le en ligne!
la source
String[] args = ((String) system.getMethod("getProperty", String.class).invoke(null, "sun.java.command")).split(" ");
qui n'est pas spécifique à Linux, mais utilise ce qui semble être une propriété non documentée définie par certaines machines virtuelles Java .C # (.NET Core) par raznagul
Je suppose que ce n'était pas la solution envisagée.
la source
/dev/std*
là-bas. Au départ, je visais une approche similaire, mais je n'ai pas trouvé de moyen facile d'ouvrir des flux pour stdin / out sans accès à System.Console, j'ai donc opté pour la réflexion à la place. Bien sûr, votre solution ne fonctionne probablement que sur Linux et d'autres systèmes Unixish avec les/dev
entrées appropriées , mais raznagul n'a pas explicitement dit qu'elle devait fonctionner sur Windows. Et cela fonctionne sur TIO.Java, par racer290
Il s'agissait plutôt d'un aspect basique que les
static
initialiseurs sont appelés avant lamain
méthode. C'était une belle tentative: j'ai été consterné par lethrow new Error()
premier, mais j'ai finalement trouvé le chemin;)la source
System.out.println("Hello World!");
N'ajoute pas deux entiers? .. " 2. Un extrait de code qui prend deux nombres en entrée, les ajoute ensemble et génère leur somme. Cet extrait doit toujours fonctionner correctement même après avoir exécuté le premier extrait. Lorsque les deux extraits sont combinés ensemble, ils doivent former un programme complet qui ajoute deux nombres, ou définir une fonction qui ajoute deux nombres. Cet extrait deJava par Kevin Cruijssen
Bien construit. Beaucoup de code pour que quiconque réfléchisse correctement à la façon de résoudre ce défi. Je suppose que le "mettre votre code après" était un très gros indice.
Essayez ici.
la source
JavaScript par Grant Davis
Fonctionne dans la console JS sur la
about:blank
page (comme spécifié dans le post cop) sur Chromium 59 / Linux.la source
cQuents , Step Hen , 3 octets
Essayez-le en ligne!
Il a fallu beaucoup de discussions à Step Hen pour comprendre comment fonctionne son langage étrange, mais en bref:
Son code était
#|1,1:A
.#|1,1
est l'entrée par défaut, ce qui signifie que toute entrée donnée au programme est ajoutée par 2 1. (IE si vous passez un 47 et un 53, votre entrée est[47, 53, 1, 1]
.:
définit simplement le mode, qui affichera len
e élément de la séquence sin
est défini, et sinon émettra la séquence entière.finalement
A
Obtient la première entrée.Parce que nous avons 4 entrées
[47, 53, 1, 1]
, l'ajoutBC
à la fin récupérerait également les 2e et 3e entrées, et la 4e entrée devient implicitementn
.Parce que notre séquence est
ABC
, elle est analysée algébriquement, ce qui signifie qu'elle devientA*B*C
. Nous ne voulons pas cela, mais si nous insérons un+
entre A et B, il devientA+B*C
, oùA
etB
sont nos entrées, etC
est 1.la source
how the hell his weird language works
peut-être qu'une fois que je l'aurai terminé, cela pourrait avoir plus de sensC # (.NET Core) par raznagul
Essayez-le en ligne!
Cela aurait probablement pris moins de temps si je connaissais réellement un C #. Cependant, avec un peu de navigation dans la documentation et un peu d'aide de Jon Skeet , j'ai réussi à bricoler quelque chose qui fonctionne.
la source
Défi Vim par @DJMcMayhem
Cela fait un moment que je n'ai pas pu quitter vim , voici ma solution (notez que c'est beaucoup plus que des
23
octets - donc ce n'est probablement pas la solution prévue):Essayez-le en ligne!
L'idée est simplement de diriger les deux entiers vers
awk
viabash
, car=
et+
étant désactivés, j'ai dû utiliser une petite solution de contournement. Laawk
ligne s'étend à:Edit : L'intention initiale était que l'entrée soit déjà dans le tampon, mais ce ne serait pas plus difficile - la principale difficulté était de faire fonctionner l'addition.
Voici le correctif suggéré par @DJMcMayhem: Essayez-le en ligne!
la source
[insert your number here]
en mode insertion. Au lieu de cela, il est juste déjà dans le tampon. Mais vous pouvez contourner cela avecOecho "<esc>Go"|awk...
, donc je pense que cela compte. Bien fait! Ce n'est pas la fissure que j'avais en tête (j'espérais une réponse pure vim) donc je posterai probablement une nouvelle réponse qui corrige les commandes externes et!
.Java 7 par Poke
Essayez-le en ligne!
Aucune astuce spécifique à Linux n'est nécessaire, juste un simple masquage des noms de classe
String
et non qualifiésSystem
. Ce n'est probablement pas la solution envisagée, mais cela fonctionne.la source
GolfScript par Ilmari Karonen
Essayez-le en ligne!
la source
RProgN2 par @ATaco
Essayez-le en ligne!
Ce n'est de loin pas la meilleure réponse que j'aurais pu donner, mais cela permet à nouveau d'ajouter des chiffres. Si j'avais réellement traversé et fait une bonne manipulation de la pile, je pourrais probablement jouer au golf un peu, mais pour l'instant je suis satisfait de la réponse.
Dans le poste d'origine d'ATaco, il vient en fait de réaffecter tous les principaux opérateurs arithmétiques pour détruire leurs entrées. Pour résoudre ce problème, j'ai redéfini ce que l'ajout était en termes d'opérations binaires, ce qui était pénible car RProgN2 n'a pas d'opérateur de négation binaire ou xor.
Remarque: Si vous souhaitez tester l'entrée, les nombres avec plus d'un chiffre doivent être dans le formulaire
"XX..." n
pour être convertis en un nombre réel car RProgN2 prend chaque caractère tel quel sauf s'il s'agit d'un concept ou d'une chaîne. Edit: @ATaco a noté que l'ajout d'un «$» avant un numéro à plusieurs chiffres fera la même chose.EDIT: Voici la logique de ma solution. Comme vous pouvez le voir, ce n'est certainement pas le code le plus raffiné, mais cela fonctionne.
la source
56$46$12
il poussera les chiffres 5, 6, 46 et 12. JeJavaScript (Node.js) par jrich , 298 octets
J'ai l'impression que ce n'est pas la solution prévue, mais si c'est le cas, bien fait, j'ai passé un certain temps à essayer de comprendre comment obtenir le nom de la fonction déclarée! :)
Essayez-le en ligne!
la source