Intro
Il y a 3 clous dans le mur. Vous avez un morceau de ficelle qui est fixé au cadre avec les deux extrémités. Pour accrocher la photo, vous avez emmêlé la ficelle avec les ongles. Mais avant de laisser tomber l'image: pouvez-vous prédire si l'image va tomber, il suffit de regarder comment la ficelle est enroulée autour des ongles?
Dans le premier exemple, l'image ne tombera pas. Dans le deuxième exemple, l'image va tomber.
Défi
En fonction du tracé de la ficelle autour des N
ongles, déterminez si l'image va tomber ou non. Retourne une valeur de vérité si l'image doit tomber, et une valeur de fausseté sinon.
Détails
- Vous pouvez supposer que les ongles et l'image sont disposés de manière régulière
N+1
, avec l'image en bas. - Vous pouvez supposer qu’il n’ya pas de nœuds dans la corde, c’est-à-dire que la corde peut être déroulée en continu à partir de l’une des extrémités.
- Chaque clou est énuméré dans le sens des aiguilles d'une montre avec une lettre de l'alphabet. Vous pouvez supposer qu'il y a au plus 26 clous (AZ).
- La lettre minuscule entoure un clou, tandis que la lettre majuscule est enroulée dans le sens inverse.
Le premier exemple ci-dessus sera codé comme BcA
, le deuxième exemple est codé comme CAbBac
.
Pour le lecteur incliné: Ce problème revient à déterminer si un élément du groupe libre - généré par l’ensemble de clous - est l’identité ou non. Cela signifie qu'il est suffisant d'annuler de manière répétée des sous-chaînes telles que aA
ou Aa
jusqu'à ce que vous ayez atteint un point fixe. Si le point fixe est une chaîne vide, il s'agit de l'élément neutre, sinon ce n'est pas le cas.
Exemples
Picture will fall:
Aa
CAbBac
aBbA
DAacAaCdCaAcBCBbcaAb
ARrQqRrUuVHhvTtYyDdYyEKRrkeUWwua
AKkQqEeVvBESWwseYQqyXBbxVvPpWwTtKkVHLlWwNBbAanYYyyhWwEJZUuNnzjYyBLQqQqlEGgebeEPLlTtZzpUuevZzSsbXSGgsUuLlHhUQquPpHUuFfhTZzIitGgFAaBRrBbbYXxOoDZTDdtzVvXxUudHhOVvoUuXKkxyBEeLlbFfKkHhfVAaQqHAaJjODdoVvhSsZzMZzmPpXNBbnxBbUuSSsUuDRrdNnUusJDIiUuIidCEGgeMmcLlDPOopdTEeQqCAETtNnYyeGUuPEFfSsWwHheAaBbpgCcOHUuhAaCcoEFBbfeaFHhfcCFFffNncGFfgtjMVUuKAakvKkXxLlTMmtmOFfoUuXSsYZzLXxlyxUuRPZzTtprSsWwRrPLlpGgMmKRrDHhdRCcUurYNnKCckykXJjxWwUSsJjKkLlKkuBbBbOoWwWwIiUuPDdBbCcWHBbCFfcDdYBbLlyVvSsWGgEewCchDdYywAaJjEepPpPpQXxZzFfLGXxglNnZzYDdyqCcKWXxwXxQqXTtxkFfBSSAasTFftZzsXGgxSsLlLlbZzAaCCccXVvYyxTIiOoBbFftCVQqDdBbGgAavQqKkDPpKTCctRrkdcvAaQWOowLOolqVMmvZAaHCBbcPphIiRKkrLlzFMOomDIiXJjIixMmdNnMHhmfNTtIiKkSDdTtsVvHhnAaNSVvTUutNnXxsGIiXxPpPHhUupgNnAaAAOoaaIiHJjhVvLlnYyXxQqSsTtKJjkBbNnVvEYCcFfMHGghBbmNnEeJTtjJjWYywyeNWwDIiZYyzOodnMQqmVvCcQqxVvGNnEeNBbngVvUGgYyBbDdVvIiAAaauPpQKDdEekNnVLlvHhGSDIidPZzpsPCcpgQqKkQqNOonLlIiLlJjqPAaPXxTtppYyCPpHhCIicARBbracXxWwXEVUuUuGgZHhzBSsbvGgFfeVvxLlNKknWwBLlIibWOowNnRSsrSEeKAakOosLZzZRrHhzTtTFfUuNnOKkotXxTtla
Picture will not fall:
A
BcA
ABCD
aBaA
bAaBcbBCBcAaCdCaAcaCAD
ARrQqRrUatuVHhvTYyDdYyEKRrkeUAua
AEEeQqNneHhLlAIiGgaECXxcJjZzeJFfVWwDdKkvYWwyTJjtCXxANIinaXWwxcTWwtUuWwMmTBbVWIiFLlWwZzfwPLlEepvWZzwKkEYEeWXxwySXTtEexRIiNBbnWAaTtQqNnBMSsWwOombwWwPVPpGPpgYyvDdpBbrQqHhUusKRrDAVvadLlWwOZzokGJCXSSssXxxJPpGIigZzjJjLlOoNRrnPpcMZzmjgJjNDEeQqWKkNTtnSswIidCcnYBGgbyJSsjPpIiMmMmMmSNnWVvwZzIQqLXHhxTPptlisOoeTtTtYMmVvPpyKNnMFfmkXxSVvsCGJjXxgXYJPpjWwQIiXxqyDdxFfDdAaRNnJjrctHBbZzhEQqMmeCcRBbrGgAaAaJNnRrYyWwSDdVvsJOojQGgWWwIBbiwRrqJjjWwOoFPMmDdRrQOoqNnRrDPJjpMmdPpGFfVvWUuwgpWCcNnPpwfUXCcZzJjUSsuXxxUuuRGgHhrSQqJjOosMMTtmHhmKkXxDdLlWwjSUuAaMmKYyksZzVvPZzVEeVvvHhZZOozBbzMmZCczYyGgISsiQqpXxMmXxEMmeRrAGgaGgMOGgomZFfDdzSSssBGPpgbTtBbOoRWWwGgLJjlEeGgLDdRrUulNnZzJjJjUKkuXxFfwATtaZzLVvlWwSsMmrBAaELleGBLFflbgHhbIFfiBbPpTWZzwKkKLASsaTJYyjtBbBbWwIiZCcWwzIiZLlUTtuBbYyBbIizTJjtLTtDOOoBbodBbllSsUGgLlAKkauYykUuUNnPpuDFfAaLNVvnVvlHhdMmBAaBbIiVRrGWOoPpwgWXwKkvJjOoTtYCUucVGgYyLlVvFfvRrMmySsDdbtICZzcNnINSOosDQAaXoxRGgKkrqdZznDdXxZzMGgmiJjNnACcMQqmaNnWZzUOuwTVvAJjSsaRrGgSsTtOMmRroVvRrtAVGgvMmaINniDGCcOogRrWwMVvYFfyTtmTtVvOoOIiodRrGgAxaSsGgiJja
Réponses:
Retina , 21 octets
Essayez-le en ligne!
Comme la solution de flawr, cette opération supprime de manière répétée les paires adjacentes majuscules / minuscules, puis vérifie si le résultat est vide ou non.
Pour ce qui est de savoir comment on fait correspondre une paire majuscule / minuscule:
la source
MATLAB, 76 octets
Octave,827977 octetsC'est peut-être la première fois que je vois où MATLAB est plus court qu'Octave (d'un octet entier)!
Nouvelle réponse dans MATLAB:
Réponse en octave:
A sauvé
troiscinq octets grâce à flawr.~nnz(c)
est plus court queisempty(c)
, et a'Aa'
deux octets plus courts que[0,32]
.Essayez la version Octave en ligne!
Explication:
c=input('')
demande à l'utilisateur d'entrer. Nous définissonsk='Aa'
comme un tableau de caractères.while k++<1e5
: Bien que la boucle où les deux élémentsk
sont incrémentées à chaque itération,Aa
,Bb
,Cc
et ainsi de suite. La boucle continuera jusqu'à ce que le plus grand élément soit1e5
, ce qui devrait être suffisamment élevé pour la plupart des chaînes. Vous pouvez l'augmenter9e9
sans augmenter le nombre d'octets.Nous allons prendre la
strrep
fonction par étapes, en partant du milieu.En utilisant,
mod(k,64)
nous aurons ce qui suit lorsque nous atteindrons la fin de l'alphabet (si nous reconvertissonsk
en caractères):Comme vous pouvez le constater, il y aura quelques symboles entre les deux, mais le texte reprendra son tour et recommencera avec l'alphabet, mais maintenant avec les lettres minuscules en premier. C'est un moyen très court pour vérifier les deux
Aa
etaA
.['',65+mod(k,64)]
concatène les valeurs numériques de l'mod
appel -call, avec une chaîne vide, convertissant les nombres en caractères.strrep
est utilisé pour supprimer des éléments de la chaînec
et les renvoyer. Il recherchera toutes les occurrences dek
dans la chaîne et la remplacera par une chaîne vide.Après les
1e5
itérations, nous aurons soit une chaîne vide, soit une chaîne non vide. Nous vérifions s'il y a des éléments àc
utilisernnz(c)
. Nous revenonsnot(nnz(c))
, donc1
s'il est vide, et0
s'il reste des caractères dansc
la source
Minkolang 0,15 , 30 octets
Essayez-le ici!
Explication
La nature toroïdale de Minkolang est utilisée ici pour éliminer le besoin d'une boucle externe. L'idée générale ici est de vérifier si les deux éléments supérieurs de la pile sont séparés de 32 unités (c'est-à-dire qu'ils sont une paire majuscule / minuscule) et, le cas échéant, séparez-les. Comme cela se fait "en temps réel", pour ainsi dire, l’imbrication des paires est gérée correctement.
la source
Haskell, 62 octets
Essayez-le en ligne
Crédit à flawr pour le
abs
et Laikoni pour lafromEnum
carte .La fonction d'assistance
%
prend une chaîne déjà simplifiéel
et ajoute le symbolea
avant de simplifier le résultat. Sil
commence par le caractère inverse dea
, ils annulent. Sinon,a
est simplement ajouté Notez qu'aucune simplification supplémentaire n'est nécessaire à ce stade.La fonction principale
f
ajoute et simplifie chaque caractère via afoldr
. Ensuite, il vérifie si le résultat est vide.Pour vérifier si deux caractères sont des cas opposés et doivent donc être annulés, voyez si leurs valeurs ASCII diffèrent de 32. Chaque élément est traité par
fromEnum
avant d'être passé à%
.la source
05AB1E , 17 octets
Essayez-le en ligne!
Explication
la source
Haskell ,
98 97 8581 octetsIl s'agit simplement d'une implémentation naïve qui tente à plusieurs reprises d'annuler des lettres adjacentes jusqu'à ce qu'il n'y ait plus de changement, puis en détermine le résultat.
Merci @nimi pour -12 octets et @xnor pour un autre -4 octets!
Essayez-le en ligne! ou vérifiez tous les exemples!
la source
f=null.until(\a->r a==a)r.map fromEnum
devrait sauver deux octets.(\a->r a==a)
peut être((==)=<<r)
.=r l
enl
, l’idée étant qu’il suffit de ne faire qu’un remplacement par cycle.=<<
, ça semble magique XD=<<
est comme>>=
mais avec les arguments échangés. L'expression apparaît souvent sous la forme((==)=<<r)
qui signifie "est invariant sousr
".Mathematica, 102 octets
Fonction sans nom prenant une chaîne alphabétique en entrée et renvoyant
True
ouFalse
.Le cœur de l'implémentation est la création d'une fonction qui supprime toute paire d'annulation, comme
"Pp"
ou"gG"
, d'une chaîne. L'expression{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}
produit une paire ordonnée de listes de caractères, la première{"a","b",...,"Z"}
et la seconde{"A","B",...,"z"}
.#<>#2&~MapThread~
Produit ensuite une liste dans laquelle les éléments correspondants de ces deux listes ont été concaténés, à savoir{"aA","bB",...,"Zz"}
. L’expression amusante donne""|##&@@
ensuite (par la magie de la séquence des arguments##
) une liste d’alternatives"" | "aA" | "bB" | ... | "Zz"
; enfin,StringDelete[...]
est une fonction qui supprime toute occurrence d’une de ces alternatives d’une chaîne.Il suffit maintenant d'appliquer de manière répétée cette fonction à la chaîne d'entrée jusqu'à ce que le résultat ne change pas, ce qui est accompli par
~FixedPoint~#
, puis de vérifier si le résultat est la chaîne vide""==
.la source
JavaScript (ES6), 73 octets
Contrairement à .NET, JavaScript ne permet pas de désactiver la distinction entre majuscules et minuscules au milieu d'une correspondance. Nous devons donc rechercher toutes les sous-chaînes de lettres répétées sans tenir compte de la casse, puis supprimer toute paire de caractères adjacents qui ne correspondent pas, qui une paire majuscule / minuscule.
la source
Perl, 28 octets
Explication:
Perl permet d'inclure une expression régulière générée dynamiquement dans une expression régulière standard.
Les
.
matchs rien.Le
(??{
est le début de la regex générée.La
$&
variable contiendra toute la chaîne correspondante jusqu'à présent, ce qui dans ce cas correspond à ce qui.
correspond.L'
^
opérateur effectue un xor numérique ou une chaîne xor, en fonction des valeurs des opérandes. Dans ce cas, ce sera la chaîne xor.Il
' '
s’agit simplement d’une chaîne contenant un espace, dont la valeur ascii (ou unicode!) Est 32. Lorsqu'un espace est xor avec un caractère compris dans la plage az ou AZ, il passe du haut au minuscule ou de l'étau. vice versa.Le
})
est la fin de la regex générée.1 while s/whatever//
cherchera plusieurs fois un motif et le remplacera par la chaîne vide.$_
est la variable par défaut. Cette variable est ce sur quoi perl fait des choses amusantes et excitantes lorsque vous ne spécifiez pas une autre variable. Ici, je l'utilise pour renvoyer une valeur de vérité ou de fausseté, car une chaîne de longueur nulle est fausse et une chaîne de longueur non nulle qui n'est pas égale"0"
est vraie. Je suppose également que la chaîne d'entrée a été placée à l'origine dans celle-ci.Essayez ici
la source
!
avant la finale$_
. Si vous le maintenez de cette manière, vous pouvez économiser 4 octets en le changeant ens/.(??{$&^' '})//&&redo
+1 octet pour le-p
drapeau. Cela ne fonctionnera pas dans un sous-programme comme vous l'avez maintenant car ce{ code }
n'est pas une boucle (donc&&redo
ne fonctionnera pas), mais le-p
met dans unewhile
boucle.' '
par$"
. Jetez un coup d'oeil à ceci pour voir à quoi ressemble le code.Prolog (SWI) , 151 octets
Il faut beaucoup de temps pour traiter les faux cas plus longs en raison du retour en arrière.
Essayez-le en ligne!
Ungolfed
la source
MATL , 20 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test (cela prend un certain temps).
Explication
la source
Mathematica, 65 octets
la source
JavaScript (Node.js) , 47 octets
Essayez-le en ligne!
la source
Python 3 , 71 octets
Essayez-le en ligne!
la source