Şifre Bishop İyilik


10

Türeyen bu , şimdi, yayın sildi.

Bir dize verildiğinde, aşağıdaki koşulların tümü karşılandığında iyi bir Bishop parolası oluşturuyorsa (doğru / yanlış veya iki tutarlı değer) yanıt verin:

  1. en az 10 karakteri var

  2. en az 3 basamaklı ( [0-9])

  3. bir palindrom değildir (tersine çevrildiğinde kendi kendine özdeştir)

Kodunuz iyi bir Bishop şifresi ise 0 bayt bonusu alırsınız.

Uyarı: Do not gerçek şifre gücü ölçüsü olarak Bishop iyilik kullanın!

Örnekler

İyi Bishop şifreleri

PPCG123GCPP
PPCG123PPCG
PPCG123gcpp
0123456789
Tr0ub4dor&3

İyi Bishop şifreleri

PPCG123 (çok kısa)
correct horse battery staple (yeterli basamak yok)
PPCG121GCPP (palindrom)
 (çok kısa ve yeterli basamak yok)
abc121cba (çok kısa ve palindrom)
aaaaaaaaaaaa (palindrom ve yeterli basamak yok)
abc99cba (her şey yanlış)


@KrystosTheOverlord Terim bu zorluğun kendisinde tanımlanmıştır. -P
Erik Outgolfer

9
Ah, bazı satranç mantığı şifre kuralları bekliyordum…
Bergi

1
Tüm cevapları okudum ve kimse bonusu talep etmedi.
Veskah

1
@JDL Eğer bu çok gerçek bonusa hak kazanırsanız, skorunuzdan gerçekten 0 bayt alırsınız! Ne için bekliyorsun?
Aaron

1
Kriterlerinizden biri aslında Bishop'un (2013) önerdiklerinin tersidir. Şifrelerin 10 karakter veya daha az olması gerektiğini, daha fazla olmamasını önerdi.
PyRulez

Yanıtlar:



4

05AB1E , 12 bayt

gT@Iþg3@IÂÊP

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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)


4

R , 80 70 62 64 63 bayt

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

Çevrimiçi deneyin!

DigEmAll ve bazıları da yeniden düzenleniyor

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

Çevrimiçi deneyin!

Oldukça basit, burada gerçekten şaşırtıcı hileler yok. Kullanıcı dize girdikten sonra:

  • Dizeyi ayırır ve 2'den fazla sayı arar. (3 veya daha fazla basamak)
  • Tüm öğelerin dizenin ters sürümüne (palindrome) eşit olup olmadığını kontrol eder
  • Uzunluğun 9'dan (10 veya daha fazla karakter) fazla olduğunu kontrol eder

Bence bir bayt kurtaracak olan !all(s==rev(s))ile değiştirebilirsiniz any(s!=rev(s)). Uzunluk kontrolü de azaltılabilir gibi hissediyorum, ama nasıl (ya ncharda bir tür sum(x|1)kesmek) emin değilim
JDL

1
aslında, any(s>rev(s))işe yarayacağını düşünüyorum --- bir karakter palindromik muadili daha az ise, o zaman parola diğer ucunda converse doğru olacaktır. Bu başka bir bayt tasarrufu sağlar.
JDL


1
@digEmTüm örneğiniz yalnızca bir sayı olduğunda doğru döndürür, bir>2
Aaron Hayman


3

APL + WIN, 36, 30 29 bayt

Adám'a 7 bayt kaydedildi

Endeks kaynağı = 0

Giriş dizesi istemleri

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

Çevrimiçi deneyin! Dyalog Classic'in izniyle

Açıklama:

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

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

>v≡⌽v Palindrome test

Kod ayrıca iyi bir Bishop şifresi olduğu için bonusa hak kazanır.


ADAM @. 6 bayt kaydettiğiniz için teşekkür ederiz. ⎕IO kabul etti. v≡⌽v ~ 'yi önlerse iyi çalışır. X kullanımı ile ilgili olarak boole testlerini birleştirirken kullanmaya eğilimliyim. Aynı sonuç aynı sayıda bayt.
Graham

Eğer var mı ki ~... ? Aksi bile, sen birleştirebilirsiniz ×~içine>
Adam

@ Adám Hayır Bende ≢ yok. Bir bayt daha × ~ içine birleştirebilirim. Teşekkürler. Korkarım "oyun koyarak" hala daha fazla uygulamaya ihtiyaç duyuyor;)
Graham

3

Brachylog , 18 12 bayt

İpuçları için teşekkürler, Kroppeb ve Fatalize !

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

Çevrimiçi deneyin!

açıklama

Program zincirleme iki bölümden oluşan tek bir yüklemdir &.

İlk:

¬       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

İkinci:

 ˢ     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

{∋.∈Ị∧}ᶜolabilir{∋ị}ᶜ
Kroppeb

Önce "palindrome değil" yan tümcesini koymak ve basamak seçme yolunu değiştirmek, 6 bayt kaydedebilirsiniz:¬↔?l>9&ịˢl>2
ölümcül

@Kroppeb Oh, ilginç! Ben düşünmedim , ama karakter bir rakam ise başarılı olur. Teşekkürler!
DLosc

@ Aatalize et Aha - ?böyle bir şeyi tekrar kullanmak düzgün. Teşekkürler!
DLosc


2

Java 8, 92 bayt

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

Çevrimiçi deneyin.

Açıklama:

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)

2

JavaScript, 60 56 46 bayt

Girişi bir karakter dizisi olarak alır. 1Doğruluk ve falsey 0için çıktılar .

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

Çevrimiçi Deneyin!

Arnauld sayesinde 10 bayt (!) Kurtardı .



2

APL (Dyalog Unicode) , 25 bayt SBCS

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

Çevrimiçi deneyin!


1
İyi. Şimdi bir tren haline getirerek golf yapabilirsiniz: (9<≢)∧(3≤1⊥∊∘⎕D)∧⊢≢⌽ve sonra parens önlemek için yeniden düzenleyerek bir bayt daha kaydedin: (9<≢)∧≢∘⌽⍨∧3≤1⊥∊∘⎕DBu adımları açıklamak gerekiyorsa em bildirin.
Adám


1

Temiz , 66 bayt

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

Çevrimiçi deneyin!

  • s<>reverse s: sbir palindrom değil
  • s%%(0,8)<s: ilk 9 karakteri s hepsinden azs
  • sum[1\\c<-s|isDigit c]>2: sikiden fazla basamağa sahip

1

Retina 0.8.2 , 40 bayt

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Açıklama:

G`.{10}

En az 10 karakter olup olmadığını kontrol eder.

G`(\d.*){3}

En az 3 hane olup olmadığını kontrol eder.

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

Eşleşirlerse ilk ve son karakteri kaldırın.

^..

En az 2 karakter varsa, o zaman bir palindrom değildi.

.NET'in dengeleme grupları, bunun tek bir düzenli ifadede yapılabileceği anlamına gelir, ancak 47 bayt alır:

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir.



1

Python 3 , 74 72 64 bayt

-2 bayt için Neil A. teşekkürler ! Jo King'e -8 bayt için
teşekkürler !

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

Açıklama:

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

Çevrimiçi deneyin!



1

Perl 6 , 32 bayt

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

Çevrimiçi deneyin!

Tüm kurallara uyulmasını zorlayan anonim kod bloğu.

Açıklama:

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

1

K (ok) , 31 28 bayt

Ngn sayesinde -3 bayt!

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

Çevrimiçi deneyin!


1
Eğer kullanabilirsiniz +//(yakınlaşma kadar toplamı) yerine +/+/(toplamı toplamı)
ngn

1
alternatif olarak şunu kullanabilirsiniz x^x^yiki liste arasında kesişim bulmak için: #x^x^,/!10. bu kısaltılabilir #x^x^/!10( ^"olmadan", x^/... ^başlangıç ​​değerine sahip bir x
indirgeme

1
bir şey daha, >(veya< ) "değil" olarak kullanılabilir:{(x~|x)<(2<#x^x^/$!10)*9<#x}
ngn

@ngn Teşekkürler! Kavşağı bulmak için güzel bir yol!
Galen Ivanov



0

Pip , 19 bayt

#a>9&XD Na>2&aNERVa

Çevrimiçi deneyin!(tüm test örnekleri)

açıklama

İle ailk komut satırı argümanı olarak:

#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


0

Pyth, 17 bayt

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

Buradan çevrimiçi olarak deneyin veya tüm test senaryolarını burada bir kerede doğrulayın .

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

0

Groovy, (47 bayt)

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

(Bonus katılımı okuyucuya bir alıştırma olarak bırakılmıştır)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.