Pour les besoins de ce défi, nous allons définir les espaces blancs uniquement comme des sauts de ligne (0x0A) et des espaces (0x20). Notez que la plupart des langages et des variantes de regex considèrent de nombreux autres caractères comme des espaces aussi bien à l'intérieur qu'à l'extérieur de la plage ASCII, de sorte que vous ne pourrez peut-être pas utiliser les fonctions intégrées correspondantes.
Le défi des flics
Vous devez écrire un programme ou une fonction dans la langue de votre choix, qui prend en entrée une chaîne composée de caractères ASCII (à l'exception de NUL) et le renvoie en supprimant tous les espaces. Par exemple, si vous avez reçu les données suivantes:
H e l l o,
W o r l d!
Vous devriez sortir
Hello,World!
Votre soumission sera alors votre code source avec tous les espaces supprimés (le même processus consiste à transmettre votre solution en tant qu'entrée, bien que votre solution puisse également contenir des caractères en dehors de la plage ASCII). Votre objectif est de rendre aussi difficile que possible de déterminer où des espaces doivent être insérés pour retrouver une solution valide dans la langue de votre choix. Notez que les cambrioleurs peuvent insérer moins d’espaces que vous en avez supprimés, mais pas plus. Rappelez-vous également que les voleurs ne doivent pas correspondre exactement à votre code, ils doivent simplement trouver une solution valable.
Votre réponse devrait contenir les éléments suivants:
- La langue (et la version si nécessaire) dans laquelle vous avez écrit votre solution.
- Nombre d'octets de votre solution avant de supprimer les espaces.
- Votre solution avec les espaces blancs supprimés.
Votre solution peut être un programme ou une fonction, mais pas un extrait et vous ne devez pas assumer un environnement REPL. Vous pouvez effectuer une entrée via STDIN, un argument de ligne de commande ou une fonction, et une sortie via STDOUT, une valeur de retour de fonction ou un paramètre de fonction (out).
Dans un souci d'équité, il doit exister un interprète ou un compilateur librement disponible pour la langue de votre choix.
Vous ne devez pas utiliser les fonctions intégrées pour le hachage, le chiffrement ou la génération de nombres aléatoires (même si vous générez le générateur de nombres aléatoires à une valeur fixe). Votre solution doit pouvoir traiter toute chaîne de 100 caractères ou moins en moins de 10 secondes sur un ordinateur de bureau raisonnable.
Si votre réponse n'a pas été fissurée dans les 7 jours (168 heures), vous pouvez révéler votre propre solution, point auquel votre réponse est considérée comme sûre . Tant que vous ne révélez pas votre solution, les voleurs peuvent la craquer, même si les 7 jours sont déjà écoulés. La réponse sûre la plus courte l'emporte (mesurée avant la suppression des espaces).
Si votre réponse est déchirée, veuillez l'indiquer dans l'en-tête de votre réponse, avec un lien vers la réponse du voleur correspondant.
Allez ici pour la partie des voleurs.
Soumissions non fissurées
<script>site = 'meta.codegolf'; postID = 5686; isAnswer = false; QUESTION_ID = 103182;</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
la source
Réponses:
Haskell, 100 octets, fissuré par nimi
C'est un programme complet et un poème dadaïste.
Code with withspace (Essayez-le en ligne!)
J'ai toujours l'air assez poétique, si vous me le demandez.
Désobfus
Explication
La
do
-notation est seulement un sucre syntaxique, doncf
on peut écrire de manière équivalentePour les listes, l'
>>=
opérateur est défini commeconcatMap
,f
devient ainsiDonc, dans le cas d’une entrée
"a b\nc"
,lines
divise l’entrée aux nouvelles lignes["a b","c"]
,words
chaque ligne à l’espace vide[["a","b"],["c"]]
(comme je viens de le comprendre, cela inclut les nouvelles lignes, donc celines
n’est pas nécessaire). La concaténation donne une fois["a","b","c"]
,id
est la fonction identité et, en tant que telle, n’a aucun effet et la concaténation finale produit la chaîne"abc"
.la source
C, 475 octets, fissuré par Riley
Certaines parties de C rendent vraiment très facile de voir où les espaces doivent aller. Le pré-processeur c, cependant, ne le fait pas. Donc, ce code est en quelque sorte en deux moitiés: jusqu'à la ligne 17 (236 caractères avec des espaces), le code est pratiquement non-obscurci, et après cela (239 caractères avec des espaces), bonne chance!
Je ne vais pas gagner cette compétition de loin, mais je voulais voir ce qui pouvait être fait avec le pré-processeur c.
Compile (avec des avertissements, si vous les activez) avec
gcc -std=c89 -ansi
et fonctionne commecat file | ./a.out
Cela a été craqué beaucoup plus rapidement que je pensais, félicitations! Ma stratégie consistait à utiliser
#defines
pour supprimer les limites de jetons évidentes (comme ';'), puis à en utiliser davantage#defines
pour rendre VRAIMENT simple la façon dont elles étaient mélangées.En passant, voici à quoi ressemble le code après avoir uniquement ajouté les espaces évidents:
la source
Octave, 69 octets, SAFE!
Format de saisie: les nouvelles lignes ne peuvent pas être saisies directement dans l'invite de commande. Créez la chaîne par concaténation comme ceci:
Appelez la fonction comme ceci (ajoutez des espaces):
Code d'origine:
Il ne vous fallait que 66 octets pour que cela fonctionne, mais j’en ai écrit 69 dans l’en-tête afin de ne pas divulguer trop d’informations.
Le code original ressemble à ceci:
Explication:
U
est un point de code85
dans la table ASCII, il semblerait donc que le premier espace devrait être après85
. Faux!Si nous insérons l’espace après
853
, nous devrions obtenir le numéro du caractère853
, non ..? Utiliserchar
pour vérifier si c'est un caractère reconnaissable:Cependant, nous n'utilisons pas
char
dans le code, nous utilisons la version plus courte dans laquelle nous concaténons les nombres avec une chaîne vide[853 '']
. Au lieu de donner une erreur hors de portée, la version la plus courte prend simplement le module de nombres 256.C'est ce qui est arrivé
85+3*256 = 853
. Alors quechar(853)
donne un avertissement,[853,'']
retourneU
.La manière évidente de faire cette tâche dans Octave est la suivante:
Nous savons qu'il doit y avoir une parenthèse ouvrante (point de code 40) après la première
U
.29
ne convient évidemment pas alors nous déplaçons l'espace un autre droit et obtenons296
.mod(296,256) = 40
. Bingo!Continuez comme ça et terminez avec la séquence:
Enfin, nous utilisons
eval
pour transformer la chaîne en code.la source
U
parmi ce groupe de chiffres :-)JavaScript ES6, 199 octets, fissuré par SLuck49
Une entrée plutôt volumineuse avec 33 octets de blancs à ajouter.
la source
[ 10, 0, 0, 0, 0, 9, 8, 1, 5, 0, 0 ]
la séquence d'intervalle et ma fonction d'itération au tableau est(a)=>{for(var x=0;!a[x];x++);if(a.length-x>1){a[0]=a[x]-1;a[x]=(x==0?a[x]:0);a[x+1]++;}else{a[0]=a[x]+1;a[x]=0;i=0}}
. J'ai commencé à[ 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
.> <>, 40 octets, fissuré par le pélican
J'ai utilisé fishlanguage.com , juste au cas où il y aurait des différences entre les interprètes.
la source
Befunge-93, 58 bytes, Safe!
Essayez-le en ligne!
Programme original
Essayez-le en ligne!
Le truc, c’est que le chemin d’exécution était plus vertical que horizontal, puis divers espaces ont été insérés au hasard dans le code pour mieux mélanger les chemins verticaux. Une fois que la ligne a été rompue et que les espaces ont finalement été supprimés, il ne restait que très peu, espérons-le, pour indiquer les relations entre les opérations.
Au cas où cela ne soit pas assez difficile, j'ai également ajouté un peu d'entrelacement afin qu'un certain nombre d'opérations aient été exécutées par différents chemins de code s'écoulant perpendiculairement. L'idée est que si vous pensiez avoir trouvé la bonne position pour une commande particulière, vous ne réaliseriez pas que vous pourriez avoir besoin de la réutiliser plus tard dans le code.
Je ne sais pas si cela a valu la peine de faire tous ces efforts pour essayer de rendre les choses compliquées ou si les gens ne se sont même pas donné la peine d'essayer de le résoudre. :)
Explication du code
la source
C # 6, 201 octets, fissuré par Link Ng
184 octets ont été réduits, ce qui vous laisse 17 octets d’espace.
Solution fissurée utilisant la solution
Concat
que ma solution envisagée utilisaitJoin
, voici la solution envisagée:la source
MATL , 22 octets. Fissuré et fissuré .
C'est un programme qui prend une entrée via STDIN et produit la sortie via STDOUT.
Code sans espaces ni nouvelles lignes:
Le format de saisie est un peu délicat à cause de la façon dont MATL prend la saisie de chaîne. Les chaînes avec des nouvelles lignes ne peuvent pas être entrées directement via STDIN, car chaque entrée doit être une ligne unique (la nouvelle ligne marque la fin de la saisie). Le format est donc le suivant:
Une chaîne est entourée de guillemets simples . Si le contenu de la chaîne comprend des guillemets simples, ils sont évités par la duplication . Exemple:
'I''m a string'
Pour entrer une chaîne avec des nouvelles lignes, il faut la scinder à la nouvelle ligne et tout concaténer (au moyen de crochets), y compris les nombres en tant que codes ASCII . Par exemple, considérons la chaîne formée par mes prénom et nom avec une nouvelle ligne entre les deux. Ce serait entré comme
['Luis' 10 'Mendo']
.Cela permet de saisir tout autre code ASCII (éventuellement non imprimable). Ainsi, la chaîne du point 1 ci-dessus peut être entrée alternativement
['I' 39 'm ' 97 32 'string']
. Vérifiez ici .La seule condition est qu'au moins une des parties entre crochets soit une chaîne. Cela oblige tous les nombres à être interprétés comme des codes ASCII lors de la concaténation.
Désolé pour la maladresseBonne chance en utilisant ce format!Solution originale
Chacun
%
est un symbole de commentaire, le reste de la ligne est donc ignoré.Les espaces ne font rien mais servent de séparateurs. Par exemple,
1e5
sans espace, serait interprété comme un nombre100000
.t
prend l'entrée et la duplique.' @ *'
pousse cette chaîne, etd
calcule ses différences consécutives, ce qui donne[32 -32 10]
(le-32
est inutile).m
donne un tableau de rangée logique indiquant quels caractères sont32
ou10
(ou-32
).1
suivi dee
remodeler en rangée. Ceci est no-op ici.5
suivi d'une nouvelleM
pression1
(dernière entrée de la fonction d'entrée multiple la plus récente, à savoire
).d
calcule les différences consécutives de1
, et donne donc[]
(tableau vide).w
swaps, et enfin(
assigne[]
aux caractères d'espacement, c'est-à-dire les supprime.la source
RProgN , 15 octets craqués!
Vous pouvez jouer avec le code ici . Une solution relativement simple, espérons que la nature agaçante de la façon dont RProgN gère les chaînes laissera celle-ci sans rien faire.
Programme original
Explication
Premièrement, l'entrée est implicitement poussée dans la pile. Empiler:
<INPUT>
Ensuite, nous utilisons '' pour placer un espace dans la pile. Empiler:
<INPUT> " "
le `essaie réellement de pousser une chaîne représentée par` (WORD) mais parce qu'il y a un espace après, il pousse juste une chaîne vide. Empiler:
<INPUT> " " ""
Le R ici est le sucre pour la commande Remplacer. Empiler:
<INPUTWITHOUTSPACES>
Ensuite, "NEWLINE" pousse une chaîne contenant une nouvelle ligne, ce qui est bien, car RProgN n'utilise pas de caractères d'échappement, mais vous permet de pousser une chaîne comme celle-ci. Empiler
<INPUTWOSPACES> "\n"
Ensuite, nous utilisons l’astuce à nouveau, et Replace, qui donne notre sortie.
la source
Ruby, 86 octets + 1 drapeau = 87 ( fissuré par Dom Hastings )
Nécessite un indicateur de ligne de commande
-p
.Le code est en fait valide sous cette forme, c'est juste un no-op.
la source
Faisceau , 72 octets, sûr!
Maintenant pour une langue 2D. Peut être joué avec TIO Nexus .
Un programme assez simple sans beaucoup d'essayer de tromper les gens.
la source
Labyrinthe , 127 octets
Espérons que je l'ai bien fait :) C'est ma première entrée dans la liste des flics et des voleurs.
Code d'origine
la source
Java, 3241 + 28 octets pour une grande importation Integer
Cette entrée est uniquement destinée à prouver la possibilité d’une entrée purement cryptographique. Je crois que cela respecte les règles, mais si cela va à l’encontre de l’esprit, faites-le-moi savoir et je supprimerai par souci d’équité. Je laisserai ce "dangereux" indéfiniment jusqu'au moment où (et si) une fissure sera trouvée. Ceci est une monstruosité et pourrait sûrement être optimisé, mais le voici.
Par souci d'équité pour les voleurs, la voici avec tous les espaces "évidents" ajoutés.
Bonne chance, j'aimerais voir cette fissure. En fait, je vais même instituer une prime illimitée à ce sujet. Si, à un moment donné, vous craignez cela, vous recevrez une récompense infinie de 500 représentants pour un échange de pile (et probablement un excellent document mathématique).
la source
C, 140 octets, fissuré par Riley
Commençons par un facile.
(J'espère que je le fais bien.)
la source
Befunge 98, 65 octets, fissuré par Pietu1998
Programme original
la source
V , 37 octets Fissuré par nmjcman101
Puisque cela a des imprimables, voici la version lisible:
Ou si vous préférez, un hexdump:
la source
Minkolang v0.15 , 88 octets, fissuré!
Essayez-le en ligne!
la source
JavaScript ES6, 380 octets, sûr
C'est le genre d'entrée que je prévoyais initialement de publier. C'est énorme et n'a presque aucune chance de gagner, mais je pense qu'il devrait être suffisamment fort sur le plan cryptographique pour résister à 7 jours. Maintenant, il se peut que je me trompe!
67 octets de blancs à ajouter.
Solution
Ceci est une implémentation de l' algorithme Extended Tiny Encryption . La clé codée en espace de 64 bits se développe en la clé suivante de 128 bits:
Source: Wikipedia
Une fois déchiffré et converti en ASCII, le bloc de 64 bits se
[x, y]
lit commec3BsaXQ=
, ce qui correspond à la représentation codée en Base64 desplit
.Afficher l'extrait de code
la source
Vitsy , 73 octets, coffre-fort
C'est carrément mauvais.
Bonne chance! 13 éléments d'espaces à ajouter.
Code d'origine:
Essayez-le en ligne!
Cela simplifie grossièrement jusqu'à:
la source
C #, 159 octets, craquelé par du lait
153 collaps donc 6 octets de blancs à trouver ne devraient pas être trop durs ...
la source
réticulaire, 43 octets, fissuré
La version sur TIO est obsolète, mais vous pouvez vous en procurer une copie à partir du github .
la source
Wolfram, 132
A probablement plus d'une solution (indice: Mersenne)
Solution
la source
Espace blanc ,
81 à74 octetsVersion lisible par l'homme:
Je sais que c'est un vieux défi, mais j'espère que quelqu'un sera prêt à tenter sa chance. J'ai essayé d'optimiser le décompte, mais il serait peut-être possible de faire quelque chose de plus court avec le même nombre de caractères de tabulation.
la source
tcc, 850 octets
Pour éviter de coller une très longue ligne, je l’ai passée par tr -d '\ n' | fold -b -w 60.
la source
SILOS , 159 octets Sûr!
Devrait être assez trivial. C'est ma première entrée de flics et de voleurs.
Personne ne l'a attaqué, probablement en raison de la nature ésotérique de mon propre langage. Cela peut sembler une façon louche de glisser, mais cela n’a pas d’importance, car les plus courtes sont sûres.
N'hésitez pas à l' essayer en ligne
la source