Mot de passe Bishop Bishop

10

Dérivé de ce message, maintenant supprimé.

Étant donné une chaîne, répondez (vérité / fausse ou deux valeurs cohérentes) si elle constitue un bon mot de passe Bishop, c'est-à-dire lorsque toutes les conditions suivantes sont remplies:

  1. il a au moins 10 caractères

  2. il a au moins 3 chiffres ( [0-9])

  3. ce n'est pas un palindrome (identique à lui-même lorsqu'il est inversé)

Vous obtenez 0 octets de bonus si votre code est un bon mot de passe Bishop.

Avertissement: N'utilisez pas la bonté Bishop comme mesure de la force réelle du mot de passe!

Exemples

Bons mots de passe Bishop

PPCG123GCPP
PPCG123PPCG
PPCG123gcpp
0123456789
Tr0ub4dor&3

Pas de bons mots de passe Bishop

PPCG123 (trop court)
correct horse battery staple (pas assez de chiffres)
PPCG121GCPP (palindrome)
 (trop court et pas assez de chiffres)
abc121cba (trop court et palindrome)
aaaaaaaaaaaa (palindrome et pas assez de chiffres)
abc99cba (tout va mal)

Adam
la source
@KrystosTheOverlord Le terme est défini dans ce défi lui-même. ;-P
Erik the Outgolfer
9
Aw, je m'attendais à des règles de mot de passe pour la logique des échecs…
Bergi
1
J'ai lu toutes les réponses et aucune n'a réclamé le bonus.
Veskah
1
@JDL, vous pouvez vraiment soustraire 0 octets de votre score si vous vous qualifiez pour ce bonus très réel! Qu'est-ce que tu attends?
Aaron
1
L'un de vos critères est en fait l'inverse de ce que Bishop (2013) a proposé. Il propose que les mots de passe doivent comporter 10 caractères ou moins, pas plus.
PyRulez

Réponses:

5

Python 2 , 61 59 54 51 octets

lambda s:sum(map(str.isdigit,s))>2<s[:9]<s<>s[::-1]

Essayez-le en ligne!

-5 octets, grâce à Erik l'Outgolfer
-3 octets, grâce à xnor

TFeld
la source
Choo choo!
Erik the Outgolfer le
@EriktheOutgolfer Merci :)
TFeld
Vous pouvez faire le contrôle de longueur comme s[:9]<s, ce qui se combine bien avec le contrôle non palindrome:s[:9]<s!=s[::-1]
xnor
@xnor Merci :)
TFeld
4

05AB1E , 12 octets

gT@Iþg3@IÂÊP

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

g      # Get the length of the (implicit) input
 T@    # Check if this length >= 10
Iþ     # Get the input and only leave the digits
  g    # Then get the length (amount of digits)
   3@  # And check if the amount of digits >= 3
IÂ     # Get the input and the input reversed
  Ê    # Check if they are not equal (so not a palindrome)
P      # Check if all three above are truthy (and output implicitly)
Kevin Cruijssen
la source
4

R , 80 70 62 64 63 octets

any(rev(U<-utf8ToInt(scan(,'')))<U)&sum(U>47&U<58)>2&sum(U|1)>9

Essayez-le en ligne!

De digEmAll, et certains réarrangements aussi

sum((s<-el(strsplit(scan(,''),"")))%in%0:9)>2&!all(s==rev(s))&s[10]>''

Essayez-le en ligne!

Assez simple, pas de vrais trucs incroyables ici. Après la chaîne de saisie utilisateur:

  • Sépare et recherche dans la chaîne plus de 2 nombres. (3 chiffres ou plus)
  • Vérifie si tous les éléments ne sont pas égaux à la version inversée de la chaîne (palindrome)
  • Vérifie que la longueur est supérieure à 9 (10 caractères ou plus)
Sumner18
la source
Je pense que vous pouvez remplacer !all(s==rev(s))par any(s!=rev(s))ce qui permettra d'économiser un octet. J'ai l'impression que la vérification de la longueur peut également être réduite, mais je ne sais pas comment ( ncharou une sorte de sum(x|1)piratage)
JDL
1
en fait, je pense que any(s>rev(s))cela fonctionnera --- si un personnage est inférieur à son homologue palindromique, alors à l'autre extrémité du mot de passe, l'inverse sera vrai. Cela économise un autre octet.
JDL
1
@digEmAll votre exemple retourne vrai quand il n'y a qu'un seul numéro, vous devrez inclure un>2
Aaron Hayman
1
64 mais correct;)
digEmAll
3

APL + WIN, 36, 30 29 octets

7 octets économisés grâce à Adám

Origine de l'index = 0

Demande la chaîne d'entrée

(10≤⍴v)×(3≤+/v∊∊⍕¨⍳10)>v≡⌽v←⎕

Essayez-le en ligne! Gracieuseté de Dyalog Classic

Explication:

(10≤⍴v) Length test pass 1 fail 0

(3≤+/v∊∊⍕¨⍳10) Number of digits test

>v≡⌽v Palindrome test

Le code est également admissible au bonus car il s'agit d'un bon mot de passe Bishop.

Graham
la source
@Adam. Merci d'avoir économisé 6 octets. Le ⎕IO a accepté. v≡⌽v fonctionne bien si je préfère ~. Quant à l'utilisation de x, j'ai tendance à l'utiliser lors de l'enchaînement de tests booléens. Même résultat, même nombre d'octets.
Graham
Avez-vous ce qui est ~? Et même si vous ne le faites pas, vous pouvez fusionner ×~en>
Adám
@ Adám Non, je n'ai pas ≢. Je peux fusionner × ~ dans> pour un octet de plus. Merci. J'ai bien peur que mon "jeu de putting" ait encore besoin de plus d'entrainement;)
Graham
3

Brachylog , 18 12 octets

Merci pour les conseils, Kroppeb et Fatalize !

¬↔?l>9&ịˢl>2

Essayez-le en ligne!

Explication

Le programme est un prédicat unique, composé de deux parties chaînées &.

Première:

¬       The following assertion must fail:
 ↔        The input reversed
  ?       can be unified with the input
        Also, the input's
   l    length
    >9  must be greater than 9

Seconde:

 ˢ     Get all outputs from applying the following to each character in the input:
ị        Convert to number
       This gives an integer for a digit character and fails for a non-digit, so
       we now have a list containing one integer for each digit in the password
  l    Its length
   >2  must be greater than 2
DLosc
la source
{∋.∈Ị∧}ᶜpeut être{∋ị}ᶜ
Kroppeb
En mettant la clause "non palindrome" en premier et en changeant la façon de sélectionner les chiffres, vous pouvez économiser 6 octets:¬↔?l>9&ịˢl>2
Fatalize
@ Kroppeb Oh, intéressant! Je n'y ai pas pensé , mais il est logique que cela réussisse si le caractère est un chiffre. Merci!
DLosc
@Fatalize Aha - réutiliser ce ?qui est bien. Merci!
DLosc
2

Gelée , 12 octets

~Tṫ3ȧL9<Ɗ>ṚƑ

Essayez-le en ligne!

[]si pas assez de chiffres (liste vide, fausse), 0sinon mauvais (zéro, fausse), 1si bon (différent de zéro, vrai).

Erik le Outgolfer
la source
2

Java 8, 92 octets

s->s.length()>9&s.replaceAll("\\D","").length()>2&!s.contains(new StringBuffer(s).reverse())

Essayez-le en ligne.

Explication:

s->                        // Method with String parameter and boolean return-type
  s.length()>9             //  Check if the length of the input-String is more than 9
  &s.replaceAll("\\D","")  //  AND: remove all non-digits from the input-String
    .length()>2            //       and check if the amount of digits is more than 2
  &!s.contains(new StringBuffer(s).reverse())
                           //  AND: check if the input-String does NOT have the reversed
                           //       input-String as substring (and thus is not a palindrome)
Kevin Cruijssen
la source
2

JavaScript, 60 56 46 octets

Prend l'entrée comme un tableau de caractères. Sorties 1pour véridique et 0pour falsey.

s=>/(\d.*){3}/.test(s[9]&&s)&s+``!=s.reverse()

Essayez-le en ligne!

10 octets enregistrés (!) Grâce à Arnauld .

Hirsute
la source
2

Raquette , 122 octets

(define(d s)(let([t(string->list s)])(and(< 2(length(filter char-numeric? t)))(< 9(length t))(not(equal? t(reverse t))))))

Essayez-le en ligne!

Galen Ivanov
la source
2

APL (Dyalog Unicode) , 25 octets SBCS

{∧/(9<≢⍵)(3≤+/⍵∊⎕D),⍵≢⌽⍵}

Essayez-le en ligne!

voidhawk
la source
1
Bien. Vous pouvez maintenant jouer au golf en le transformant en train: (9<≢)∧(3≤1⊥∊∘⎕D)∧⊢≢⌽puis enregistrez un octet de plus en le réorganisant pour éviter les parens: (9<≢)∧≢∘⌽⍨∧3≤1⊥∊∘⎕Dfaites-leur savoir si vous avez besoin d'explications sur ces étapes.
Adám
1

Perl 5 -p, 33 octets

$_=/.{10}/&y/0-9//>2&reverse ne$_

TIO

Nahuel Fouilleul
la source
1

Nettoyer , 66 octets

import StdEnv
$s=s<>reverse s&&s%(0,8)<s&&sum[1\\c<-s|isDigit c]>2

Essayez-le en ligne!

  • s<>reverse s: sn'est pas un palindrome
  • s%%(0,8)<s: les 9 premiers caractères de s sont inférieurs à touss
  • sum[1\\c<-s|isDigit c]>2: sa plus de deux chiffres
Οurous
la source
1

Retina 0.8.2 , 40 octets

G`.{10}
G`(\d.*){3}
+`^(.)(.*)\1$
$2
^..

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

G`.{10}

Vérifie au moins 10 caractères.

G`(\d.*){3}

Vérifie au moins 3 chiffres.

+`^(.)(.*)\1$
$2

Supprimez le premier et le dernier caractère s'ils correspondent.

^..

S'il y a au moins 2 personnages, ce n'était pas un palindrome.

Les groupes d'équilibrage de .NET signifient que cela peut être fait dans une seule expression régulière, mais cela prend 47 octets:

^(?!(.)*.?(?<-1>\1)*$(?(1).))(?=.{10})(.*\d){3}

Essayez-le en ligne! Le lien inclut des cas de test.

Neil
la source
1

Rouge , 117 111 octets

func[s][d: charset"0123456789"n: 0 parse s[any[d(n: n + 1)|
skip]]all[n > 2 9 < length? s s <> reverse copy s]]

Essayez-le en ligne!

Galen Ivanov
la source
1

Python 3 , 74 72 64 octets

Merci Neil A. pour -2 octets!
Merci Jo King pour -8 octets!

lambda s:s[9:]and re.findall('\d',s)[2:]and s[::-1]!=s
import re

Explication:

lambda s: # Create lambda                                          
           s[9:] # Check if the string is at least 10 characters long                                 
                     and re.findall('\d',s)[2:] #Check for at least 3 matches of the regex \d (which matches all digits)
                     and s[::-1] != s # Check if the string reversed is equal to the string (palindrome test)
import re  # Import regex module

Essayez-le en ligne!

Epicness
la source
1

Perl 6 , 32 octets

{$_ ne.flip&&m:g/\d/>2&&.comb>9}

Essayez-le en ligne!

Bloc de code anonyme qui applique simplement que toutes les règles sont respectées.

Explication:

{          &&         &&       }  # Anonymous code block
 $_ ne.flip                       # Input is not equal to its reverse
             m:g/\d/>2            # There are more than two digits
                        .comb>9   # There are more than 9 characters
Jo King
la source
1

K (oK) , 31 28 octets

-3 octets grâce à ngn!

{(x~|x)<(2<#x^x^/$!10)*9<#x}

Essayez-le en ligne!

Galen Ivanov
la source
1
vous pouvez utiliser +//(somme jusqu'à convergence) au lieu de +/+/(somme somme)
ngn
1
Sinon, vous pouvez utiliser x^x^ypour trouver l'intersection entre deux listes: #x^x^,/!10. cela peut être raccourci à #x^x^/!10( ^est "sans", x^/... est ^-réduction avec la valeur initiale x)
ngn
1
une dernière chose, >(ou <) peut être utilisée comme "et non":{(x~|x)<(2<#x^x^/$!10)*9<#x}
ngn
@ngn Merci! Belle façon de trouver l'intersection!
Galen Ivanov
0

Pip , 19 octets

#a>9&XD Na>2&aNERVa

Essayez-le en ligne! (tous les cas de test)

Explication

Étant ale premier argument de ligne de commande:

#a > 9      Length of a is greater than 9
&           and
XD N a > 2  Number of matches of regex [0-9] iN a is greater than 2
&           and
a NE RV a   a is not (string-)equal to reverse of a
DLosc
la source
0

Pyth, 17 octets

&&<2l@`MTQ<9lQ!_I

Essayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .

&&<2l@`MTQ<9lQ!_IQ   Implicit: Q=eval(input()), T=10
                     Trailing Q inferred
      `MT            [0-10), as strings
     @   Q           Take characters from input which are in the above
    l                Length
  <2                 Is the above greater than 2?
            lQ       Length of Q
          <9         Is the above greater than 9?
               _IQ   Is Q unchanged after reversal?
              !      Logical NOT
&&                   Logical AND the three results together
Sok
la source
0

Groovy, (47 octets)

{p->p=~/.{10}/&&p=~/(\d.*){3}/&&p!=p.reverse()}

(L'inclusion de bonus est laissée au lecteur comme exercice)

randomsimon
la source