À ne pas confondre avec Password Bishop Goodness !
Étant donné une chaîne, répondez (vérité / fausse ou deux valeurs cohérentes) si elle constitue un mot de passe fort contre les évêques .
Un mot de passe est fort contre les évêques s'il s'agit d'une chaîne composée de lettres alternées (en a-h
) et de chiffres (en 1-8
) de sorte que chaque paire de caractères puisse être interprétée comme un carré sur un échiquier, et si vous placez un pion blanc sur chaque carré nommé dans le mot de passe, il n'y a aucun moyen pour un évêque blanc de voyager, dans n'importe quel nombre de mouvements consécutifs, de n'importe quel carré de la première ( 1
) ligne à n'importe quel carré de la dernière ( 8
) ligne.
Exemples
Des mots de passe forts contre les évêques
a1b1c1d1e1f1g1h1
a8b8c8d8e8f8g8h8
a1b2c3d4d5f5f4g3g4h2b5
h4g4f4e4c4b4a4c3e3
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
b4b5d4d5f4f5g3h5
Par exemple,
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
correspond à la position etb4b5d4d5f4f5g3h5
correspond à la position
Des mots de passe faibles contre les évêques
a4c4e4g4g5d6f6e3d2b2
(bien formé mais pas fort - merci Jo King pour cet exemple!)b1c1d1e1f1g1h1a8b8c8d8e8f8g8
(bien formé mais pas fort)h4g4f4e4c4b4a4c3
(bien formé mais pas fort)d4
(bien formé mais pas fort)b4b5d4d5f4f5g2h5
(bien formé mais pas fort)correct horse battery staple
(mal formé)1a1b1c1d1e1f1g8a8b8c8d8e8f8g
(mal formé)a
(mal formé)aa
(mal formé)
la source
1
par8
dans le premier cas de test? Il ne peut pas voyager vers chaque colonne, car laa
colonne est complètement remplie de pions, mais il peut voyager vers chaque ligne sans problème, n'est-ce pas? J'ai l'impression de manquer quelque chose ..: SRéponses:
Ruby,
115182163 octetsEssayez-le en ligne!
Retourne
1
pour fort etnil
pour faible. (Les +67 octets étaient destinés à prendre en compte le "retour en arrière".)Quelques astuces qui ont été utilisées:
Au lieu de la plage numérique
0..99
, nous utilisons le plage de chaînes'00'..'99'
afin que le nombre soit automatiquement rempli à gauche à 2 chiffres et stratifié. Cela rend la vérification hors limites très courte - correspondance avec l'expression régulière/[09]/
.À l'intérieur de la fonction d'aide, tout en construisant la liste des nouvelles coordonnées
[x-11, x-9, x+9, x+11]
, nous attribuons simultanémentz[x]
à9
dans le processus, qui se trouve être une valeur vraie (marquant le carré visité).Dans la dernière ligne, nous voulons vérifier que le tableau
z[81,9]
ne contient pas9
. Nous faisons cela en supprimant toutes les instances de9
(z[81,9]-[9]
), puis en demandant le 9ème élément du tableau résultant ([8]
). Puisque nous savons que le tableau avait à l'origine 9 éléments, s'il en a été supprimé, nous obtiendronsnil
, alors que s'ils sont tous restés, nous obtiendrons le dernier élément du tableau (qui se trouve toujours être1
).la source
Python 2 ,
330318313309370 octetsEssayez-le en ligne!
Essayez la version pratique en ligne! (l'original peut prendre 4 ^ 32 opérations pour vérifier complètement, je suggère d'utiliser celui-ci - même nombre d'octets)
Pas une solution super courte - je ne pouvais pas comprendre comment rendre une version de la fonction lambda de g plus courte que g elle-même.
-4 octets grâce à Quuxplusone
+61 octets pour le retour en arrière (merci d'avoir signalé cela à Jo King et pour les conseils de golf)
la source
q=r=1
serait plus court queq=1 r=1
, non? Etif r:
plus court queif r>0:
.Python 2 ,
490476474Essayez-le en ligne!
Cela fonctionne par "inondation". Nous créons d'abord une liste
a
de quels carrés sont adjacents à quels autres carrés, dans le sens de l'évêque. Ensuite, nous créons un ensemblex
d'exclusions (basé sur le mot de passe). Ensuite, nous initialisons un ensembler
de carrés accessibles, qui commence comme juste la première ligne (moins toutes les exclusions), et "envahit" à plusieurs reprises à partir de là, 99 fois, ce qui devrait être plus que suffisant. Enfin, nous testons pour voir si l'un des carrés de la dernière ligne s'est retrouvé dans notre ensemble accessible. Si oui, nous avons un mot de passe faible! Sinon, nous avons un mot de passe fort.Inconvénient, peut-être disqualifiant (je ne connais pas la règle habituelle ici): si le mot de passe est mal formé (tel que "batterie de cheval correcte"), nous lançons une exception au lieu de revenir
False
. Mais nous revenons toujoursTrue
si le mot de passe est fort!Moins 16 octets grâce à Jo King. Nous nous alignons
a
au seul endroit où il est utilisé et nous multiplions constamment les mathématiques.la source
for
secondes que je ne pouvais pas voir comment supprimer. J'ai trouvé que le remplacementrange(99)
par desrepr(f)
travaux sur ma machine locale mais pas sur l'interpréteur de tio.run ... mais j'ai trouvé que[1]*99
c'était quand même plus court! Cela a donc permis d'économiser 4 octets supplémentaires.for
s que je ne voyais pas comment supprimer - Oh! Apparemment, Python traite33for
comme deux jetons (alors qu'ilfor33
s'agirait d'un jeton). Aujourd'hui j'ai appris. Moins 2 octets de plus, alors.Nettoyer , 285 octets
Essayez-le en ligne!
$[]
est$ :: [[Int]] [Char] -> Bool
composé avec le premier argument, donnant\ [Char] -> Bool
.La fonction fonctionne en consommant la chaîne deux caractères à la fois, retournant immédiatement false si la chaîne est dans un format invalide dès qu'elle voit la partie invalide. Une fois la chaîne traitée, elle place un évêque sur chaque case vide d'un côté du plateau et les déplace de toutes les manières possibles 64 fois et vérifie si l'une des positions finales se trouve dans la ligne cible.
la source
True
poura1b1c1d1e1f1g1
? Non pas que je comprenne quoi que ce soit sur son fonctionnement. :)Wolfram Language (Mathematica) ,
339316358353345 octets-23 octets grâce à @Doorknob.
+42 octets représentant le retour en arrière.
Essayez-le en ligne!
J'ai réécrit la plupart de cela pour tenir compte du retour en arrière, je pense qu'il peut y avoir un moyen plus facile de définir le graphique
g
, Mathematica aGraphData[{"bishop",{8,8}}]
qui est le graphique de tous les mouvements qu'un évêque peut faire sur un échiquier ( Bishop Graph ), mais ce graphique comprend des connexions plus loin que le voisin diagonal le plus proche. Si quelqu'un connaît un moyen plus court de le faire, faites le moi savoir. Le mérite de la construction du graphique revient à cette réponse MathematicaSE .Renvoie
True
les mots de passe forts, les mots de passeFalse
faibles / mal formés. Notez que pour la plupart des mots de passe mal formés, il produira un tas de messages d'erreur, puis reviendraFalse
. Si cela n'est pas conforme aux règles, elles peuvent être supprimées en passantf[n_]:=...
àf[n_]:=Quiet@...
6 octets.Non golfé:
Panne:
Prend un argument de chaîne et le divise en une liste de chaînes de longueur chacune
m
.Renvoie
False
si des messages d'erreur sont produits, c'est ainsi que nous interceptons les chaînes mal formées (c'est-à-dire supposons qu'elles sont bien formées, produisant inévitablement une erreur sur toute la ligne).Prend la chaîne de positions de pion et la divise telle qu'elle
"a2h5b"
devient{{"a","2"},{"h","5"},{"b"}}
, puisLetterNumber
convertira la lettre en un nombre (a -> 1
, etc.) etFromDigits
convertit le chiffre en entier. Si la chaîne n'est pas bien formée, cette étape produira une erreur qui sera interceptée enCheck
retournantFalse
. Ces deux nombres sont ensuite convertis en un entier correspondant à un carré du tableau.Construit le graphique de toutes les arêtes diagonales du plus proche voisin avec les positions de pion supprimées.
Ce sont des listes de sommets de début et de fin inoccupés, respectivement
Boucles sur les sommets de début et de fin, pour chaque paire
FindPath
sera une liste de chemins entre eux. S'il n'y a pas de chemin entre eux, ce sera une liste vide, doncLength@
retourne0
. S'il n'y a aucun chemin, alorsm
sera zéro, et nous reviendronsTrue
, sinon revenonsFalse
.la source
True
etFalse
peuvent être1>0
et0>1
respectivement.p[1]@#&/@
équivaut à justep@1/@
.Sequence@@
peut être remplacé par##&@@
. Au lieu de{LetterNumber[#[[1]]],FromDigits[#[[2]]]}&/@
, vous pouvez utiliser{LetterNumber@#,FromDigits@#2}&@@@
.p@1/@
, mais je vois l'idée générale. Je supposep@1 = StringPartition[#,1]&
, c'est un peu déroutant pour moi, je suppose, parce quep
prend deux arguments de deux manières différentes, l'une commem_
et l'autre comme#...&
, je suppose que c'est juste une question de priorité. Cela a du sens cependantp@m = p[m]
.f
qui prend un seul argument,f@#&
a le même comportement que justef
- ici,f
estp[1]
. (Puis j'ai changé la[]
notation en@
, qui est toujours identique sauf pour la priorité.)