La tâche des flics consiste à écrire une fonction ou un programme qui, lorsqu'il reçoit une entrée de lui-même, génère une chaîne déterministe finie. Si le programme reçoit une entrée différente, il doit renvoyer une sortie différente.
Règles:
- Les soumissions consistent en
- Nom de la langue
- Si des drapeaux sont utilisés, ils doivent être révélés.
- Nombre d'octets du programme
- Nombre d'octets de sortie
- Production
- Si elle est particulièrement longue, veuillez fournir une boîte à pâte ou quelque chose de similaire
- S'il contient des documents non imprimables, veuillez fournir un hexdump.
- Les sauts de ligne et les espaces doivent être inclus dans la sortie
- D'où provient l'entrée (STDIN, ligne de commande, etc. )
- Nom de la langue
- Le cas échéant, vous pouvez supposer que l'octet représentant EOF n'est pas présent dans l'entrée, sauf si vous utilisez cet octet dans votre programme.
- Si votre programme est piraté, ajoutez un lien vers la réponse correspondante dans le fil du voleur dans votre titre.
- Votre programme n'est pas sûr jusqu'à ce qu'une semaine se soit écoulée et vous le marquez ainsi.
- Je désapprouve des techniques telles que l'ensemencement aléatoire avec les fonctions d'entrée ou de hachage cryptographique. Je ne peux pas les arrêter, mais je n'accepterai pas une solution qui utilise l'un ou l'autre . Notez également que certaines de ces techniques peuvent avoir des collisions, où une chaîne différente produit la même sortie.
- Votre objectif est d'avoir la sortie la plus courte. La solution sûre la plus courte publiée dans les trois semaines suivant la publication de cette question gagne!
La tâche du voleur est de trouver un programme de taille égale ou inférieure à l'original, qui obéit également aux règles ci-dessus.
Si un voleur déchire votre programme avec une solution différente de celle prévue, vous avez la possibilité de le «décompresser» en prouvant que la solution du voleur est incorrecte. Vous pouvez le faire en trouvant une entrée dans le programme du voleur qui produira la même sortie.
Exemple de soumission:
brainfuck, 10 octets, score: 10
]<.[<],>[,
Cette solution est , [>,] <[. <] Qui inverse simplement l'entrée
Bonne chance!
code-challenge
cops-and-robbers
Jo King
la source
la source
1
pour lui-même et0
autrement1021111143210532105110321051101121171164041581121141051101164011111410040105414410111010061393941
pour certaines autres chaînes.Réponses:
7 , 31 caractères, score 30, sûr mais peut-être cassé?
Un programme 7 n'est normalement qu'un nombre, mais il peut contenir des espaces, le divisant en plusieurs nombres. Cette soumission se compose donc de deux nombres (qui sont implicitement concaténés par l'interpréteur 7), et le programme prend également deux nombres en entrée, via une entrée standard. (Les "31 caractères" dans l'en-tête sont la longueur totale des deux nombres, plus un caractère d'espacement séparé; les chiffres qui composent les nombres sont interprétés comme octaux lorsqu'ils sont utilisés comme programme, mais décimaux lorsqu'ils sont utilisés comme entrée, et ce sont les chiffres qui sont les mêmes dans les deux cas, pas les nombres réels. Notez que ce n'est pas pertinent soit lorsqu'il est traité comme un programme, soit lorsqu'il est traité comme une entrée, que vous les sépariez par un espace ou une nouvelle ligne; j'espère que cela ne fonctionne pas ne pas invalider la soumission.)
La sortie attendue est le nombre suivant (exprimé ici en décimal, car c'est le format de sortie utilisé par l'interpréteur 7):
Notez que l'interpréteur 7 lié à partir du wiki Esolang stocke en interne les nombres en unaire, ce qui signifie qu'il est peu probable que vous ayez suffisamment de mémoire pour exécuter le programme sur lui-même pour voir ce qu'il fait. J'ai vérifié le programme en travaillant manuellement sur son comportement et en le testant sur de petites entrées pour vérifier qu'il faisait ce que je m'attendais à ce qu'il fasse. Une autre approche serait d'écrire un interpréteur qui utilise une méthode plus efficace de stockage des nombres.
Éviter les fissures ici était quelque chose de pénible, mais je suis enfin convaincu maintenant qu'aucun autre nombre que ceux du programme lui-même n'est capable de produire 238363505302130098723162537059 en sortie. ( MODIFIER 1 semaine plus tard: j'ai peut-être eu tort, selon la façon dont vous interprétez la question; voir ci-dessous. )
Solution
Le programme original était:
Il était prévu qu'aucune autre entrée ne donne le résultat souhaité car:
Cependant, selon la façon dont vous interprétez la question, il peut y avoir une deuxième entrée qui produit la sortie souhaitée (invalidant ainsi cette solution):
Explication
Voici comment fonctionne la solution envisagée:
la source
Node.js v10.9.0 , 40 octets, Score: 40, Cracké
Contribution
Il s'agit d'une fonction prenant exactement un paramètre.
Production
la source
o=>[...j=o,].sort(n=>(j+=113)&69).join``
, mais je nej
peux pas passer à l'entierUn poirier , 46 octets d'ASCII, score 0, fissuré
L'entrée provient de l'entrée standard. La sortie attendue (sur la sortie standard) est une chaîne vide (c'est-à-dire lorsque le programme se donne lui-même comme argument, aucune sortie ne doit être imprimée).
En d'autres termes, le défi ici est d'écrire un programme A Pear Tree qui ne produit rien sur la sortie standard lorsqu'il est donné sur l'entrée standard, et qui produit quelque chose sur la sortie standard lorsqu'il reçoit autre chose que lui-même sur l'entrée standard, en utilisant no plus de 46 octets. (J'ai réussi à le faire tout en maintenant le programme en ASCII imprimable, malgré un poirier utilisant fréquemment des caractères non ASCII et non imprimables.) C'est effectivement la tâche d'écrire un programme d' auto-identification , avec un format de sortie spécifique (c'est-à-dire chaîne nulle lorsque l'auto-identification réussit); cependant, A Pear Tree a au moins deux rebondissements qui rendent la tâche un peu plus difficile qu'il n'y paraît lorsqu'elle est effectuée dans cette langue spécifique (c'est pourquoi je l'ai choisi pour ma soumission de flic).
Ma solution
Ma solution est un peu différente de la fissure:
Essayez-le en ligne!
Au lieu d'utiliser
exit
, je place à la place$_
(sortie implicite) et$\
(retour à la ligne après la sortie, y compris la sortie implicite) la chaîne nulle s'il y a correspondance (et1
s'il n'y a pas de correspondance). Unprint
est toujours requis car la sortie implicite n'est activée que s'il y a au moins un octet d'entrée (donc, nous devons explicitement imprimer quelque chose si on nous donne une chaîne vide en entrée, qui est distincte du programme).Chaque programme A Pear Tree doit contenir une somme de contrôle quelque part (c'est le cas
MZpa
dans cette solution). Ma solution et le crack choisissent les noms de variables (et varient d'autres détails mineurs du code) afin que la somme de contrôle soit entièrement composée de lettres ASCII.la source
Perl 5
-p0777
, 10 octets, score 10, sûrLe dernier caractère ici est "shift out", code de caractère 14 (décimal) / 0E (hex). Tous les autres sont imprimables en ASCII.
Parce que nous utilisons l'argument d'E / S implicite de Perl
-p0777
, l'entrée provient de l'entrée standard et la sortie va vers la sortie standard.Solution
Le programme fait ce qui suit:
ce qui signifie que le programme lui-même, la seule entrée produisant la sortie souhaitée, est:
Essayez-le en ligne!
Explication
la source
Python 3, 50 octets craqués
Entrée et sortie de / vers stdin / -out. La sortie est différente pour chaque entrée différente. Sortie unique avec le code source:
(C'est 150 chiffres)
Bonne chance!
la source
05AB1E , 35 octets, score: 7
Entrée:
De
stdin
Production:
QÕ Ƿe
la source
Cubix , 18 octets, Score 18, sûr
C'est dommage que ce défi n'ait pas attiré plus d'attention, mais c'est parfois ainsi que cela se passe. J'allais laisser cela dangereux, mais j'ai décidé de publier la solution avant de l'oublier.
Cela devrait être assez facile à casser.
Entrée de
stdin
Production
Edit: je dois mentionner que cela attend la source dans sa forme raccourcie ... et maintenant j'ai remarqué qu'il y a un octet manquant (non imprimable) du résultat que j'ai cassé quand j'ai posté. Devrait copier maintenant. Les valeurs hexadécimales sont
24 60 2a 13 32 61 4a 50 4a 23 37 34 28 6f 29 3b 38 39
Le concept était de supprimer l'impression du premier caractère, puis de supprimer l'index inverse du caractère, par exemple [chars] - [0, len ([chars]) .. 2]
Le code est
qui correspond au cube suivant
Essayez-le ici
la source
Gelée , 14 octets, score: 21, sûr
Le programme et la taille de sortie sont comptés à l'aide de la page de codes Jelly.
Contribution
Premier argument de ligne de commande.
Production
Solution
Essayez-le en ligne!
la source
v⁼
,, donnera1
si l'entrée évaluée en tant que code Jelly avec une entrée de l'entrée est égale à l'entrée et produira soit une0
erreur (si l'entrée est un code Jelly invalide) sinon.JavaScript Firefox, <10 octets, score: 52, à partir de l'entrée d'argument de fonction, fissuré
btoa(btoa)
code la chaîne suivante:qui donne:
juste copié
la source
GCC 61-> 61 octets
Programme complet, prendre l'entrée de stdin et la sortie vers stdout
la source
50
?Perl 6, 43 bytes, Score: 15, from stdin
la source
Pepe , 23 octets, score: 23, craqué par MickyT
Contribution:
la norme
Production:
la source
J , 26 octets, score: 52, sûr
Le programme n'est pas un REPL, mais un script complet qui accepte
stdin
et imprime explicitement dansstdout
.Contribution
Entrée standard.
Production
Non, ce n'est pas une méthode de cryptage.
Solution
Essayez-le en ligne!
la source
Keg , 6 octets, score: 6
Contribution
De
stdin
, en utilisant?
Production
Rappelez-vous que ce sont des séquences d'échappement pour les octets non imprimables. Remplacez les échappements par les caractères littéraux. Texte brut disponible ici
Bonne chance avec celui-ci! A la semaine prochaine!
la source
Perl 6, 31 bytes, Score: 39, from stdin - Cracké
Craqué ici
Solution brute. Pourrait survivre.
la source