Hasło Biskupa Dobroć

10

Pochodzi z tego , teraz usunięty, opublikować.

Biorąc pod uwagę ciąg, odpowiedz (prawda / fałsz lub dwie spójne wartości), jeśli stanowi dobre hasło biskupa, czyli wtedy, gdy spełnione są wszystkie następujące warunki:

  1. ma co najmniej 10 znaków

  2. ma co najmniej 3 cyfry ( [0-9])

  3. to nie jest palindrom (identyczny z sobą po odwróceniu)

Otrzymasz 0 bajtów premii, jeśli Twój kod jest dobrym hasłem Bishopa.

Ostrzeżenie: Do nie używać bp dobroć jako miary rzeczywistej objętościowej hasła!

Przykłady

Dobre hasła biskupa

PPCG123GCPP
PPCG123PPCG
PPCG123gcpp
0123456789
Tr0ub4dor&3

Nie dobre hasła biskupa

PPCG123 (za krótki)
correct horse battery staple (za mało cyfr)
PPCG121GCPP (palindrom)
 (za krótki i za mało cyfr)
abc121cba (za krótki i palindrom)
aaaaaaaaaaaa (palindrom i za mało cyfr)
abc99cba (wszystko źle)

Adám
źródło
@KrystosTheOverlord Termin jest zdefiniowany w tym wyzwaniu. ;-P
Erik the Outgolfer
9
O, spodziewałem się reguł logiki szachowej…
Bergi
1
Przeczytałem wszystkie odpowiedzi i żadna nie zgłosiła się po bonus.
Veskah
1
@JDL naprawdę możesz odjąć 0 bajtów od swojego wyniku, jeśli kwalifikujesz się do tego bardzo prawdziwego bonusu! Na co czekasz?
Aaron
1
Jedno z twoich kryteriów jest w rzeczywistości odwrotnością tego, co zaproponował Bishop (2013). Zaproponował, że hasła muszą mieć maksymalnie 10 znaków, a nie więcej.
PyRulez

Odpowiedzi:

5

Python 2 , 61 59 54 51 bajtów

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

Wypróbuj online!

-5 bajtów, dzięki Erik the Outgolfer
-3 bajtów, dzięki xnor

TFeld
źródło
Choo Choo!
Erik the Outgolfer
@EriktheOutgolfer Thanks :)
TFeld
Możesz wykonać kontrolę długości jako s[:9]<s, która dobrze łączy się z kontrolą s[:9]<s!=s[::-1]
inną
@xnor Thanks :)
TFeld
4

05AB1E , 12 bajtów

gT@Iþg3@IÂÊP

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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
źródło
4

Japt , 17 14 bajtów

ʨA&U¦Ô&3§Uè\d

-3 bajty uporządkowane według @Shaggy

Wypróbuj online!


Japt , 15 bajtów (Bonus 0 bajtów: v)

ʨ10&U¦Ô&3§Uè\d

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
1
Dang! Powinienem sprawdzić rozwiązania, zanim zacznę własne! 14 bajtów
Kudłaty
4

R , 80 70 62 64 63 bajtów

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

Wypróbuj online!

Z digEmAll, a także niektórych zmian

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

Wypróbuj online!

Całkiem proste, nie ma tutaj żadnych niesamowitych sztuczek. Po wprowadzeniu przez użytkownika ciągu znaków:

  • Oddziela i przeszukuje ciąg w poszukiwaniu więcej niż 2 liczb. (3 lub więcej cyfr)
  • Sprawdza, czy nie wszystkie elementy są równe odwróconej wersji ciągu (palindrom)
  • Sprawdza, czy długość jest większa niż 9 (10 lub więcej znaków)
Sumner18
źródło
Myślę, że można zastąpić !all(s==rev(s))z any(s!=rev(s))której uratuje jeden bajt. ncharsum(x|1)
Wydaje
1
właściwie myślę, że any(s>rev(s))zadziała --- jeśli znak jest mniejszy niż jego palindromiczny odpowiednik, wtedy na drugim końcu hasła odwrotność będzie prawdziwa. To oszczędza kolejny bajt.
JDL
1
@digEmWszelkie przykłady zwracają wartość true, jeśli jest tylko jedna liczba, musisz dołączyć:>2
Aaron Hayman
1
64 ale poprawne;)
digEmAll 15.02.19
3

APL + WIN, 36, 30 29 bajtów

7 bajtów zapisanych dzięki Adámowi

Początek indeksu = 0

Monity o łańcuch wejściowy

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

Wypróbuj online! Dzięki uprzejmości Dyalog Classic

Wyjaśnienie:

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

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

>v≡⌽v Palindrome test

Kod kwalifikuje się również do premii, ponieważ jest to dobre hasło biskupa.

Graham
źródło
@ Adám. Dzięki za zapisanie 6 bajtów. W sprawie ⎕IO uzgodniono. v≡⌽v działa dobrze, jeśli dodam ~. Jeśli chodzi o użycie x, zwykle używam go podczas łączenia ze sobą testów boolowskich. Ten sam wynik taka sama liczba bajtów.
Graham
Czy masz, co jest ~? A nawet jeśli tego nie zrobisz, możesz połączyć ×~się z>
Adám
@ Adám Nie Nie mam ≢. Mogę scalić × ~ w> dla jeszcze jednego bajtu. Dzięki. Obawiam się, że moja gra polegająca na układaniu wciąż wymaga więcej ćwiczeń;)
Graham
3

Brachylog , 18 12 bajtów

Dzięki za wskazówki, Kroppeb i Fatalize !

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

Wypróbuj online!

Wyjaśnienie

Program jest pojedynczym predykatem, złożonym z dwóch powiązanych ze sobą części &.

Pierwszy:

¬       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

Druga:

 ˢ     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
źródło
{∋.∈Ị∧}ᶜmoże być{∋ị}ᶜ
Kroppeb
Stawiając najpierw klauzulę „nie palindrom” i zmieniając sposób wybierania cyfr, możesz zapisać 6 bajtów:¬↔?l>9&ịˢl>2
Fatalize
@Kroppeb Och, ciekawe! Nie zastanawiałem się , ale ma sens, że odniosłoby sukces, jeśli postać jest cyfrą. Dzięki!
DLosc
@Fatalize Aha - ponowne użycie tego ?typu jest fajne . Dzięki!
DLosc
2

Galaretka , 12 bajtów

~Tṫ3ȧL9<Ɗ>ṚƑ

Wypróbuj online!

[]jeśli za mało cyfr (pusta lista, fałsz), 0jeśli inaczej źle (zero, fałsz), 1jeśli jest dobry (niezerowy, prawda).

Erik the Outgolfer
źródło
2

Java 8, 92 bajty

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

Wypróbuj online.

Wyjaśnienie:

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
źródło
2

JavaScript, 60 56 46 bajtów

Pobiera dane wejściowe jako tablicę znaków. Wyjścia 1dla truthy i 0dla falsey.

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

Wypróbuj online!

Zaoszczędź 10 bajtów (!) Dzięki Arnauldowi .

Kudłaty
źródło
2

Rakieta , 122 bajty

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

Wypróbuj online!

Galen Iwanow
źródło
2

APL (Dyalog Unicode) , 25 bajtów SBCS

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

Wypróbuj online!

jastrząb
źródło
1
Dobrze. Teraz możesz zagrać w golfa, przekształcając go w pociąg: (9<≢)∧(3≤1⊥∊∘⎕D)∧⊢≢⌽a następnie zaoszczędzić jeszcze jeden bajt, zmieniając układ, aby uniknąć parens: (9<≢)∧≢∘⌽⍨∧3≤1⊥∊∘⎕DDaj im znać, jeśli potrzebujesz wyjaśnienia tych kroków.
Adám
1

Perl 5 -p, 33 bajtów

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

TIO

Nahuel Fouilleul
źródło
1

Czysty , 66 bajtów

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

Wypróbuj online!

  • s<>reverse s: snie jest palindromem
  • s%%(0,8)<s: pierwszych 9 znaków sjest mniej niż wszystkies
  • sum[1\\c<-s|isDigit c]>2: sma więcej niż dwie cyfry
Obrzydliwe
źródło
1

Retina 0.8.2 , 40 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

G`.{10}

Sprawdza co najmniej 10 znaków.

G`(\d.*){3}

Sprawdza co najmniej 3 cyfry.

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

Usuń pierwszy i ostatni znak, jeśli pasują.

^..

Jeśli są co najmniej 2 znaki, to nie był to palindrom.

Grupy równoważące .NET oznaczają, że można to zrobić za pomocą pojedynczego wyrażenia regularnego, ale zajmuje to 47 bajtów:

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

Wypróbuj online! Link zawiera przypadki testowe.

Neil
źródło
1

Czerwony , 117 111 bajtów

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]]

Wypróbuj online!

Galen Iwanow
źródło
1

Python 3 , 74 72 64 bajty

Dzięki Neil A. za -2 bajty!
Dzięki Jo King za -8 bajtów!

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

Wyjaśnienie:

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

Wypróbuj online!

Epicness
źródło
1

Perl 6 , 32 bajty

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

Wypróbuj online!

Anonimowy blok kodu, który po prostu wymusza przestrzeganie wszystkich reguł.

Wyjaśnienie:

{          &&         &&       }  # 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
źródło
1

K (oK) , 31 28 bajtów

-3 bajty dzięki ngn!

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

Wypróbuj online!

Galen Iwanow
źródło
1
możesz użyć +//(suma do konwergencji) zamiast +/+/(suma sumy)
ngn
1
Alternatywnie, można użyć x^x^y, aby znaleźć punkt przecięcia dwóch list: #x^x^,/!10. można to skrócić do #x^x^/!10( ^jest „bez”, x^/... to ^-redukcja o wartości początkowej x)
ngn
1
jeszcze jedna rzecz >(lub <) może być użyta jako „i nie”:{(x~|x)<(2<#x^x^/$!10)*9<#x}
ngn
@ngn Dziękujemy! Fajny sposób na znalezienie skrzyżowania!
Galen Iwanow
0

Pip , 19 bajtów

#a>9&XD Na>2&aNERVa

Wypróbuj online! (wszystkie przypadki testowe)

Wyjaśnienie

Przy aczym pierwszy argument wiersza poleceń:

#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
źródło
0

Pyth, 17 bajtów

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

Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .

&&<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
źródło
0

Groovy, (47 bajtów)

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

(Włączenie bonusu pozostawia się czytelnikowi jako ćwiczenie)

randomsimon
źródło