Passwort Bischof Güte

10

Abgeleitet von diesem , jetzt gelöschten Beitrag.

Antworten Sie mit einer Zeichenfolge (wahr / falsch oder zwei konsistente Werte), wenn es sich um ein gutes Bischofspasswort handelt. Dann sind alle folgenden Bedingungen erfüllt:

  1. Es hat mindestens 10 Zeichen

  2. es hat mindestens 3 Ziffern ( [0-9])

  3. es ist kein Palindrom (identisch mit sich selbst, wenn es umgekehrt ist)

Sie erhalten einen Bonus von 0 Byte, wenn Ihr Code ein gutes Bishop-Passwort ist.

Achtung: Do nicht verwenden Bischof Güte als Maß für die tatsächliche Stärke von Passwörtern!

Beispiele

Gute Bischofspasswörter

PPCG123GCPP
PPCG123PPCG
PPCG123gcpp
0123456789
Tr0ub4dor&3

Nicht gute Bischofspasswörter

PPCG123 (zu kurz)
correct horse battery staple (nicht genug Ziffern)
PPCG121GCPP (Palindrom)
 (zu kurz und nicht genug Ziffern)
abc121cba (zu kurz und Palindrom)
aaaaaaaaaaaa (Palindrom und nicht genug Ziffern)
abc99cba (alles falsch)

Adam
quelle
@KrystosTheOverlord Der Begriff wird in dieser Herausforderung selbst definiert. ;-P
Erik der Outgolfer
9
Aw, ich hatte einige Schachlogik-Passwortregeln erwartet…
Bergi
1
Ich habe alle Antworten durchgelesen und keiner hat den Bonus beansprucht.
Veskah
1
@JDL Sie können wirklich 0 Bytes von Ihrer Punktzahl abziehen, wenn Sie sich für diesen sehr realen Bonus qualifizieren! Worauf wartest du?
Aaron
1
Eines Ihrer Kriterien ist das Gegenteil von dem, was Bishop (2013) vorgeschlagen hat. Er schlug vor, dass Passwörter 10 Zeichen oder weniger und nicht mehr enthalten dürfen.
PyRulez

Antworten:

5

Python 2 , 61 59 54 51 Bytes

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

Probieren Sie es online aus!

-5 Bytes dank Erik dem Outgolfer
-3 Bytes dank xnor

TFeld
quelle
Choo Choo!
Erik der Outgolfer
@EriktheOutgolfer Danke :)
TFeld
Sie können die Längenprüfung als durchführen s[:9]<s, was sich gut mit der Prüfung ohne Palindrom kombinieren lässt:s[:9]<s!=s[::-1]
xnor
@xnor Danke :)
TFeld
4

05AB1E , 12 Bytes

gT@Iþg3@IÂÊP

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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
quelle
4

R , 80 70 62 64 63 Bytes

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

Probieren Sie es online aus!

Von digEmAll und einigen Neuanordnungen

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

Probieren Sie es online aus!

Ziemlich einfach, keine wirklich erstaunlichen Tricks hier. Nach Benutzereingaben Zeichenfolge:

  • Trennt und durchsucht die Zeichenfolge nach mehr als 2 Zahlen. (3 oder mehr Ziffern)
  • Überprüft, ob nicht alle Elemente der umgekehrten Version des Strings (Palindrom) entsprechen.
  • Überprüft, ob die Länge größer als 9 ist (10 oder mehr Zeichen).
Sumner18
quelle
Ich denke, Sie können ersetzen, !all(s==rev(s))durch any(s!=rev(s))die ein Byte sparen wird. Ich denke, dass die Längenprüfung auch reduziert werden kann, aber nicht sicher, wie (entweder ncharoder irgendeine Art von sum(x|1)Hack)
JDL
1
Eigentlich denke ich, dass any(s>rev(s))es funktionieren wird - wenn ein Zeichen kleiner als sein palindromisches Gegenstück ist, dann ist am anderen Ende des Passworts die Umkehrung wahr. Das spart ein weiteres Byte.
JDL
1
@digEmAll Ihr Beispiel gibt true zurück, wenn es nur eine Zahl gibt, müssen Sie ein>2
Aaron Hayman
1
64 aber richtig;)
digEmAll
3

APL + WIN, 36, 30, 29 Byte

7 Bytes gespeichert dank Adám

Indexursprung = 0

Fordert zur Eingabe der Zeichenfolge auf

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

Probieren Sie es online aus! Mit freundlicher Genehmigung von Dyalog Classic

Erläuterung:

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

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

>v≡⌽v Palindrome test

Der Code qualifiziert sich auch für den Bonus, da es sich um ein gutes Bischofspasswort handelt.

Graham
quelle
@Adam. Vielen Dank für die Einsparung von 6 Bytes. Auf ⎕IO vereinbart. v≡⌽v funktioniert gut, wenn ich ~ voranstelle. Die Verwendung von x wird normalerweise verwendet, wenn boolesche Tests aneinandergereiht werden. Gleiches Ergebnis gleiche Anzahl von Bytes.
Graham
Hast du was ist ~... ? Und selbst wenn Sie dies nicht tun, können Sie ×~in>
Adám
@ Adám Nein, ich habe nicht ≢. Ich kann × ~ in> für ein weiteres Byte zusammenführen. Vielen Dank. Ich fürchte, mein "Putting-Spiel" braucht noch mehr Übung;)
Graham
3

Brachylog , 18 12 Bytes

Danke für die Tipps, Kroppeb und Fatalize !

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

Probieren Sie es online aus!

Erläuterung

Das Programm ist ein einzelnes Prädikat, das aus zwei Teilen besteht, die verkettet sind &.

Zuerst:

¬       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

Zweite:

 ˢ     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
quelle
{∋.∈Ị∧}ᶜkann sein{∋ị}ᶜ
Kroppeb
Wenn Sie die Klausel "not palindrome" an die erste Stelle setzen und die Art und Weise ändern, Ziffern auszuwählen, können Sie 6 Bytes sparen:¬↔?l>9&ịˢl>2
Fatalize
@ Kroppeb Oh, interessant! Ich habe nicht darüber nachgedacht , aber es macht Sinn, dass es gelingen würde, wenn das Zeichen eine Ziffer ist. Vielen Dank!
DLosc
@Fatalize Aha - die Wiederverwendung ?dergleichen ist ordentlich. Vielen Dank!
DLosc
2

Gelee , 12 Bytes

~Tṫ3ȧL9<Ɗ>ṚƑ

Probieren Sie es online aus!

[]wenn nicht genug Ziffern (leere Liste, falsch), 0wenn sonst schlecht (Null, falsch), 1wenn gut (ungleich Null, wahr).

Erik der Outgolfer
quelle
2

Java 8, 92 Bytes

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

Probieren Sie es online aus.

Erläuterung:

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
quelle
2

JavaScript, 60 56 46 Bytes

Nimmt die Eingabe als Array von Zeichen auf. Ausgaben 1für wahrheitsgemäß und 0für falsch.

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

Probieren Sie es online aus!

10 Bytes (!) Dank Arnauld gespeichert .

Zottelig
quelle
2

Schläger , 122 Bytes

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

Probieren Sie es online aus!

Galen Ivanov
quelle
2

APL (Dyalog Unicode) , 25 Byte SBCS

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

Probieren Sie es online aus!

voidhawk
quelle
1
Gut. Jetzt können Sie Golf spielen, indem Sie es in einen Zug verwandeln: (9<≢)∧(3≤1⊥∊∘⎕D)∧⊢≢⌽und dann ein weiteres Byte sparen, indem Sie es neu anordnen, um Parens zu vermeiden: (9<≢)∧≢∘⌽⍨∧3≤1⊥∊∘⎕DLassen Sie sie wissen, wenn Sie eine Erklärung dieser Schritte benötigen.
Adám
1

Perl 5 -p, 33 Bytes

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

TIO

Nahuel Fouilleul
quelle
1

Sauber , 66 Bytes

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

Probieren Sie es online aus!

  • s<>reverse s: sist kein Palindrom
  • s%%(0,8)<s: Die ersten 9 Zeichen von ssind kleiner als alles
  • sum[1\\c<-s|isDigit c]>2: shat mehr als zwei Ziffern
Οurous
quelle
1

Retina 0,8,2 , 40 Bytes

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

Probieren Sie es online aus! Link enthält Testfälle. Erläuterung:

G`.{10}

Überprüft, ob mindestens 10 Zeichen vorhanden sind.

G`(\d.*){3}

Überprüft auf mindestens 3 Ziffern.

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

Entfernen Sie das erste und das letzte Zeichen, wenn sie übereinstimmen.

^..

Wenn es mindestens 2 Zeichen gibt, war es kein Palindrom.

Die Ausgleichsgruppen von .NET bedeuten, dass dies in einem einzelnen regulären Ausdruck erfolgen kann, dies jedoch 47 Byte dauert:

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

Probieren Sie es online aus! Link enthält Testfälle.

Neil
quelle
1

Python 3 , 74 72 64 Bytes

Danke Neil A. für -2 Bytes!
Danke Jo King für -8 Bytes!

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

Erläuterung:

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

Probieren Sie es online aus!

Episch
quelle
1

Perl 6 , 32 Bytes

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

Probieren Sie es online aus!

Anonymer Codeblock, der einfach erzwingt, dass alle Regeln eingehalten werden.

Erläuterung:

{          &&         &&       }  # 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
Scherzen
quelle
1

K (oK) , 31 28 Bytes

-3 Bytes dank ngn!

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

Probieren Sie es online aus!

Galen Ivanov
quelle
1
Sie könnten +//(Summe bis Konvergenz) anstelle von +/+/(Summe Summe) verwenden
ngn
1
Alternativ können Sie x^x^yden Schnittpunkt zwischen zwei Listen ermitteln : #x^x^,/!10. Dies kann verkürzt werden auf #x^x^/!10( ^ist "ohne", x^/... ist ^-reduktion mit Anfangswert x)
ngn
1
eine weitere Sache, >(oder <) kann als "und nicht" verwendet werden:{(x~|x)<(2<#x^x^/$!10)*9<#x}
ngn
@ngn Danke! Schöner Weg, um die Kreuzung zu finden!
Galen Ivanov
0

Pip , 19 Bytes

#a>9&XD Na>2&aNERVa

Probieren Sie es online aus! (alle Testfälle)

Erläuterung

Mit adem ersten Befehlszeilenargument:

#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
quelle
0

Pyth, 17 Bytes

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

Versuchen Sie es online hier oder überprüfen alle Testfälle auf einmal hier .

&&<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
quelle
0

Groovy, (47 Bytes)

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

(Die Einbeziehung des Bonus wird dem Leser als Übung überlassen.)

randomsimon
quelle