Ceci est le fil du voleur. Le fil du flic est ici .
Une matrice de serpent est une matrice carrée qui suit ce modèle:
3 par 3:
1 2 3
6 5 4
7 8 9
et 4 par 4:
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
Votre tâche consiste à écrire un code qui prend une entrée n
et crée une telle matrice, dans la même langue qu'un article de flic, et avec un code qui correspond à l'expression régulière du flic. Le format de sortie de votre code doit correspondre au format de sortie du code du flic.
Veuillez laisser un commentaire sous le post du Cop pour indiquer que vous l'avez craqué.
Critère gagnant:
Le gagnant sera l'utilisateur qui a le plus craqué les soumissions. En cas d'égalité, il y aura alors plusieurs gagnants.
la source
¦
ça marche me tue à chaque fois, j'ai essayé hier mais avecṚ
plutôt queU
et j'ai décidé que çaḤ
ne marchait pas.F
était une excellente idée,J
au lieu deF
.J
... j'avais essayé avecLR
mais je n'ai pas pu l'obtenir sous 11 octets05AB1E, Emigna
C'était ma première utilisation de 05AB1E. Je l'ai avec un peu d'aide. C'était amusant. :)
Essayez-le en ligne
Explication:
J'ai trouvé ce programme similaire par moi-même, mais le format de sortie est différent:
Essayez-le en ligne
Voir l'historique des modifications pour mes deux précédentes tentatives.
la source
not bool(reversed(str(bin(N))).index('1'))
... Je pense que c'est la façon la plus absurde que j'ai vu quelqu'un faire uneN%2
opération.Python 2, Dennis
Il s'agit d'un problème de golf amusant.
Vérification d'expression régulière
la source
Ohm, Nick Clifford
Ma première fois en essayant Ohm.
Langage vraiment sympa que j'ai hâte de réutiliser :)
Explication
Ma première tentative qui n'a pas fonctionné comme l'ajout d'un tableau et d'un int n'est pas possible:
Ma deuxième tentative qui ne correspondait pas à l'expression régulière:
la source
05AB1E, Emigna (2e soumission)
Première collaboration avec 05AB1E.
Essayez-le en ligne! | Vérification d'expression régulière
Explication
la source
)
pensant que ce serait le seul moyen d'obtenir le bon résultat sur la pile.)
lorsque vous ne pouvez utiliser que 2 caractères non alphanumériques. La partie délicate ici était destinée à structurer le programme pour utiliser uniquement 2 caractères génériques et les avoir séquentiels. Aurait probablement été un peu plus difficile sans les autres solutions, mais il aurait dû y avoir un peu de^\w*..$
c'est possible.UV
devez la suivre+ˆ
. Je ne peux pas penser à une autre façon de le faire avec seulement 2 caractères génériques à la fin. Cela peut être fait avec 3 caractères génériques cependant.CJam , Lynn
Tous les sauts de ligne sont à des fins esthétiques et peuvent être supprimés sans affecter le programme.
Essayez-le en ligne!
Explication
Après que Lynn ait été supprimée
{|}
de la liste des personnages autorisés, j'ai dû essayer quelque chose de nouveau. Il s'avère que nous pouvons encore construire des chaînes arbitraires et les évaluer comme du code.Tout d'abord, nous devons mettre de la valeur dans la pile. Les seuls éléments intégrés disponibles qui poussent quelque chose sans faire sauter autre chose en premier (et sans lire l'entrée) sont
es
,ea
etet
. Je suis sûr que vous pourriez commencer à partir de tout cela d'une manière ou d'une autre, mais je suis allé aveces
ce qui pousse l'horodatage actuel. Comme je ne voulais pas faire d'hypothèses sur sa valeur réelle, je teste sa primalité avecmp
(qui donne0
et1
) et teste à nouveau la primalité de cette valeur pour m'assurer que j'ai un0
sur la pile. Un1
sera plus utile, donc nous calculonsexp(0)
avecme
et le transformons en un entier aveci
. Donc, tous les chiffres commencent par:Maintenant, nous avons un tas d'opérateurs mathématiques unaires avec lesquels travailler:
Nous pouvons également combiner quelques éléments intégrés pour des fonctions plus élaborées de
x
:En utilisant ces derniers, nous pouvons obtenir n'importe quel nombre dans
0 <= x < 128
(et beaucoup d'autres) en moins de 10 étapes1
. Je suis sûr qu'un sous-ensemble beaucoup plus petit de ces commandes suffirait également. J'ai écrit un petit programme Mathematica pour déterminer tous ces extraits (ce n'est pas très lisible, désolé):Avec cela, nous pouvons simplement pousser une liste arbitraire de codes de caractères, en convertissant chacun d'eux en un caractère avec
c
ensuite. Une fois que nous avons poussé tout le code que nous voulons exécuter, nous poussons95
(]
). Nous évaluons celui-ci avec~
pour envelopper tous les autres dans une chaîne, puis nous évaluons cette chaîne avec~
.Le code réel exécuté à la fin du programme est à nouveau:
Voir ma solution précédente pour une explication.
la source
Python 3, TuukkaX
Désolé, l'expression régulière que vous avez utilisée était trop facile à banaliser. Non
0
,#
ou? Aucun problème!
J'ai peut-être mal interprété la sortie de l'exemple, mais c'est toujours assez facile à modifier car il me reste 45 caractères de rechange
la source
R, MickyT
Cas de tests:
Et confirmation regex: https://regex101.com/r/OB8ZIM/1
J'avais aussi:
qui donne la même sortie et correspond à la même expression régulière .
la source
lets_make_a_snake
... Je serais surpris si c'était la solution envisagée: Pfor
` et 'if
', mais beaucoup mieux joué au golf que le mien.Röda , fergusq
Ceci est une fonction anonyme qui correspond à cette PCRE regex:
^{(\|[^\/#\s]*){8}$
.Essayez-le en ligne!
la source
Bash, @Marcos M
Prettifié:
La première partie de la sous - commande génère
1 2 3 4
,9 10 11 12
et la seconde partie va générer8 7 6 5
,16 15 14 13
. L'extérieursort -n
les mélangera correctement pour former le motif de serpent.J'ai utilisé l'astuce dans /superuser//a/101760 pour imprimer les lignes paires et impaires. Merci Marcos, vraiment amusant.
la source
Javascript, Tom
la source
Python 3, @TuukkaX
Une légère analyse de l'expression rationnelle du policier montre un modèle fixe:
où
_
est n'importe quel caractère sauf[ '"#]
et^
est n'importe lequel[int()2/]
.Le
"*n)
à la fin montre clairement uneval("..."*n)
ouexec("..."*n)
se passe, nous avons donc juste besoin de nous assurer que les"..."
imprime la j-ème ligne.Le
for i in range(j,
est trop près de la fin de la chaîne, suggérant une compréhension de la liste sans aucunif
. Nous devons donc construire le i-ième colonne en utilisant ceuxi%n
, des2*n
choses.la source
dc , Mitchell Spector
C'était ma première participation à un défi de policiers et de voleurs, et je me suis beaucoup amusé. Le regex devait être apparié était simple,
^[^# !]{59}$
ce qui a essentiellement transformé mon travail en golf, sans utiliser ces 3 caractères. Au début, j'ai eu des difficultés à descendre en dessous de 60 octets, mais je l'ai finalement craqué.Essayez-le en ligne!
Explication:
Mon code utilise une boucle avec N 2 itérations, en gardant un compteur à base zéro (1D), et calcule le nombre à imprimer en fonction des coordonnées matricielles de ligne et de colonne (r, c) correspondantes.
Exemple de ce que je veux dire, si N = 4:
Cela semble compliqué, mais l'étape intermédiaire est utile. De plus, j'ai essayé d'utiliser 2 boucles depuis le début, mais je me suis retrouvé au-dessus de la limite de caractères regex. Génération de nombres à chaque itération (base zéro):
r % 2 = 0
(ligne normale),n = (r * N) + c = counter
r % 2 = 1
(ligne inversée),n = ((r + 1) * N) - c - 1 = counter + N - (2 * c) - 1
Ou tout à la fois, en une seule numérotation:
n = counter + ((N - (2 * c) - 1) * (r % 2)); n++
la source
~
pour calculer les index de ligne et de colonne en une seule fois. Mais l'une de mes tentatives précédentes les a calculées séparément comme vous l'avez fait. Les grands esprits se rencontrent? :)~
pour raccourcir le code.?sN0[AP]sP[ddlN~_2*lN+1-r2%*+1+n32P1+dlN%0=PdvlN>L]dsLx
tio.run/nexus/…PowerShell, ConnorLSW
Fissure
J'ai commencé avec une solution plus petite au problème et j'ai complété mes noms de variables pour obtenir la correspondance avec l'expression régulière. Essayer de trouver une utilisation pour le côlon, je suppose, a été la partie la plus difficile à envelopper.
Explication
la source
$script
variable et des boucles vraiment désordonnées pour le rembourrer,[array]::Reverse()
c'était correct cependant, félicitations - je pense que vous voudrez peut-être égaliser la longueur$i
et$MySnakeIndex
bien.CJam, Lynn
Quelque chose comme ça:
Tous les espaces sont destinés à ... la "lisibilité" ... et peuvent être omis pour se conformer à l'expression régulière de Lynn.
Essayez-le en ligne!
Explication
Le regex nécessite que nous résolvions le problème en utilisant uniquement:
{}
, qui peut être utilisé pour créer des blocs.|
, principalement utilisé pour OR au niveau du bit.~
, "eval" et bitwise NOT (également "dump array", mais je ne vais pas l'utiliser).Puisque nous avons,
~
si nous pouvons construire des chaînes arbitraires, nous pouvons exécuter du code arbitraire. Cependant, au début, il n'est pas évident de savoir comment procéder.La première pièce du puzzle est que les blocs sont des morceaux de code non évalués, qui peuvent se transformer en chaînes avec
s
. Alors{abc}s
nous donne"{abc}"
. Ensuite, nous pouvons utilisereu
pour convertir ces chaînes en majuscules.L'avantage de ceci est que les lettres majuscules sont des variables pré-initialisées, donc nous pouvons obtenir beaucoup de valeurs constantes en créant une telle chaîne, et en l'évaluant deux fois (une fois pour transformer la chaîne en bloc et une fois pour exécuter ce bloc). Nous ne pouvons pas obtenir toutes les lettres, car certaines, comme
x
ne sont pas des commandes valides (donc CJam refusera d'analyser un bloc les contenant). Nous ne pouvons pas utiliserf
tel quel, car il doit être suivi d'une autre commande, mais nous pouvons utiliserfb
puis OU les deux valeurs ensemble. De même, nous pouvons utiliser à laee
place dee
. Avec cela, nous pouvons obtenir les chiffres0
,-1
,3
et10
à19
. Le-1
est pratique, car si nous le transformons en chaîne ("-1"
) puis en caractère ('-
), puis évaluez-le, nous pouvons obtenir une soustraction ou définir une différence. Comme je l'ai dit, nous ne pouvons pas obtenirX
(pour1
), mais nous pouvons prendre la valeur absolue de-1
withz
.Nous pouvons également utiliser
s
pour obtenir une chaîne contenant un espace, et utiliserc
pour transformer cela en un caractère d' espace :C'est pratique, car à partir de là, nous pouvons obtenir de nombreuses commandes utiles dans la plage ASCII inférieure en effectuant une opération OR sur l'espace avec différents nombres. Pour obtenir certains des caractères au-dessus du point de code
48
, nous utilisons'0
plutôt le caractère comme base:C'est déjà suffisant pour construire des chaînes arbitraires, car nous pouvons obtenir
'+
(addition et concaténation de chaînes) à partir de l'extrait de code suivant:Et nous avons un littéral
1
afin que nous puissions simplement pousser les caractères d'espace, les incrémenter à la valeur dont nous avons besoin, puis les concaténer tous ensemble, mais c'est un peu ennuyeux et le code deviendrait énorme.Au lieu de cela, je les ai générés
[
et]
supprimés, de sorte que tous les caractères entre lesquels je pousse sont automatiquement enveloppés dans une chaîne. Voilà ces deux lignes:Et enfin, nous aurons besoin
f
et~
dans la chaîne que nous générons. Bien que ce soient déjà des caractères valides, nous n'avons pas de littéraux de chaîne ou de littéraux de caractères, nous devons donc les générer également et créer des points de code plus grands à partir de l'espace est un peu ennuyeux. Au lieu de cela, j'ai utilisé la soustraction d'ensemble ici, mais en soustrayant deux blocs (pour se débarrasser de{}
):C'est à peu près tout ce qu'il y a à faire. Nous évaluons
[
. Nous poussons tous les caractères, obtenus par différents calculs à partir des quelques constantes intégrées que nous avons|
,-
(via eval) et+
(via eval). Nous évaluons]
. Nous aplatissons le tout dans une chaîne, car à un moment donné, j'ai ajouté des chaînes ou des nombres dans la liste. Nous évaluons notre chaîne arbitraire avec~
.Ils
ri...p
font partie du programme final, mais je les ai extraits car ils n'ont pas besoin d'encodage.Enfin, voici le programme que nous exécutons actuellement:
la source
tinylisp , @DLosc
Essayez-le en ligne!
Cela définit une fonction
f
qui renvoie la réponse. Il affiche également les noms des fonctions que j'ai définies sur stdout, mais je suppose que cela n'a pas d'importance, car [nous sommes autorisés à choisir notre flux de sortie] pour le code golf, au moins. Si c'est un gros problème, je pense que je peux le modifier pour ne pas les imprimer. Comment l'ai-je fait? J'ai commencé avec quelque chose d'assez standard:Ensuite, j'ai observé que l'on peut transformer des définitions de fonctions comme ceci:
devient
Et les appels de fonction comme ceci:
devient
J'ai utilisé cette macro récursive Vim, stockée dans le registre
q
, pour faire le second (j'aijk
mis en correspondance<Esc>
):f s(v(h(q(jkea))))jk@q
.Ces deux transformations ont suffi à éliminer tous les espaces.
la source
Swift, @James Webster
Vérification: https://regex101.com/r/7ukrM0/1
la source
(…)(4)
, pas besoin de convertir le littéral entier en CShort.PHP, @ JörgHülsermann
221 octets est trop long (donc le serpent), et le manque d'espace peut être facilement contourné.
Prettifié:
la source
Jelly, longueur 12, @JonathanAllan
Essayez-le en ligne!
Comment ça fonctionne
la source
Jelly , 12 octets, craque @ deuxième réponse de JonathanAllan
Essayez-le en ligne!
Explication
C'est presque la même chose que mon autre réponse . Je viens de faire deux changements:
Tout d'abord, j'ai changé
U
("inverser chaque élément") enṚ€
("inverser" "chaque élément"). Cela n'aide pas en soi, car ilṚ
est également interdit.Ensuite, j'ai changé le
Ṛ
("reverse") en;@/
(/
"fold by";
"concatenating"@
"dans l'ordre inverse de la liste d'origine"). Cela évite tous les caractères interdits, donnant une solution valide.Je suppose que la prochaine étape serait de commencer à interdire les rapides de manipulation de tableaux , en plus des atomes.
la source
€
...€
en termes de/
. C'est juste plus verbeux que cette solution.;@\ṫ0
, le regex s'allonge.Jelly, longueur 13, @JonathanAllan
Essayez-le en ligne!
Comment ça fonctionne
la source
m
?!Jelly, longueur 14, @JonathanAllan
Essayez-le en ligne!
la source
Scala, @Soapy
Je n'ai pas touché Scala depuis un moment, c'était amusant de revisiter. Malheureusement, cette solution passe à côté de nombreuses fonctionnalités intéressantes de Scala.
Essayez-le ici
Confirmation de l'expression régulière
la source
QBasic (QB64), @DLosc
Notez que puisque le
.
ne correspond pas\n
(U + 000A, LF), la nouvelle ligne ici est un\r
(U + 000D, CR).Vérifier:
La principale difficulté est de savoir comment insérer un mot après le
;
. Heureusement, QB64 traite CR comme une nouvelle ligne alors que l'expression régulière de Python ne le fait pas, donc nous pourrions glisser unREM\r
ici. Sur les cinq saveurs regex autorisées,"\r" =~ /./
!/./.test('\r')
(\n
,\r
,\u2028
,\u2029
sont tous les séparateurs de ligne )re.match('.', '\r')
( seul\n
est considéré comme un saut de ligne )regexp.Match(".", "\r")
/./ =~ "\r"
Donc, cette fissure est très bien tant que nous ne mentionnons pas JavaScript ... 🤐
la source
REM
suivre immédiatement une instruction sans séparateur d'instructions. Ma solution d'origine n'a pas utilisé de commentaires. J'ai une autre variation que je publierai sous peu. : DPython 3, kennytm
Vérification d'expression régulière
la source
> <>, torcado
la source
C, @Yimin Rong
Le programme ne peut pas contenir de nombres, mais nous pouvons obtenir des nombres via:
c
, communément appelé "argc", qui est toujours 2.+
et-
sont disponibles, nous pouvons donc créer 0 avecn-n
et créer 1 aveco=c;--o
.la source
Ruby, @Value Ink
[(-=Z-~]*
signifie "je peux écrire tout ce que j'aime :)"la source
tinylisp, @DLosc
Une solution très simple et totalement non optimisée :)
Appelez le
(disp (f 4))
.(p m n)
calcule m + n en utilisant la soustractions
(m + n == m - ((1 - 1) - n))(j f g)
génère(f f+1 f+2 ... g-1)
(r f g)
génère(g-1 g-2 g-3 ... f)
(k m o f g n)
générer une ligne de la matrice de serpent, puis se recourber pour la ligne suivante, jusqu'à ce que n lignes soient créées. Les argumentsm
,o
sont substitués parj
/r
pour générer l' augmentation ou la diminution des rangées. Les argumentsf
,g
sont des indices en cours d' exécution à savoir quelle ligne nous sommes.(f n)
appelle(k j r 1 1 n)
à démarrer la génération.la source
(f 4)
-disp
c'est implicite.)PHP, @Ionut Botizan
Pour le moment, je n'ai aucune meilleure idée de casser la solution d'origine.
Prend en charge n <= 15
C'est la première fois que j'utilise getopt. Ce n'est peut-être pas la meilleure idée d'utiliser des options en entrée.
commencer à partir de la ligne de commande comme celle-ci
Regex d'origine
Niveau 1:
Très belle combinaison de lettres. N'hésitez pas à voter pour le fil des flics.
Il me bloque des fonctions comme - strrev - array_reverse - get_defined_vars
https://regex101.com/r/5rGTnw/2
Niveau 2:
https://regex101.com/r/XtVl9G/1
Solution
Niveau 2:
la source