Kata Sandi Uskup, Kebaikan


10

Berasal dari pos ini , sekarang dihapus,.

Diberikan string, jawab (kebenaran / kepalsuan atau dua nilai yang konsisten) jika itu merupakan kata sandi Uskup yang baik, yaitu saat semua persyaratan berikut dipenuhi:

  1. ini memiliki setidaknya 10 karakter

  2. memiliki setidaknya 3 digit ( [0-9])

  3. itu bukan palindrome (identik dengan dirinya sendiri ketika terbalik)

Anda mendapatkan bonus 0 byte jika kode Anda adalah kata sandi Bishop yang baik.

Peringatan: Do tidak menggunakan Uskup kebaikan sebagai ukuran kekuatan password yang sebenarnya!

Contohnya

Kata sandi Uskup yang bagus

PPCG123GCPP
PPCG123PPCG
PPCG123gcpp
0123456789
Tr0ub4dor&3

Kata sandi Bishop Tidak Baik

PPCG123 (terlalu pendek)
correct horse battery staple (tidak cukup digit)
PPCG121GCPP (palindrome)
 (terlalu pendek dan tidak cukup digit)
abc121cba (terlalu pendek dan palindrome)
aaaaaaaaaaaa (palindrom dan tidak cukup digit)
abc99cba (semuanya salah)


@KrystosTheOverlord Istilah ini didefinisikan dalam tantangan ini sendiri. ;-P
Erik the Outgolfer

9
Ah, saya mengharapkan beberapa aturan kata sandi logika catur ...
Bergi

1
Saya membaca semua jawaban dan tidak ada yang mengklaim bonus.
Veskah

1
@JDL Anda benar-benar bisa mengurangi 0 byte dari skor Anda jika Anda memenuhi syarat untuk bonus yang sangat nyata ini! Apa yang kamu tunggu?
Aaron

1
Salah satu kriteria Anda sebenarnya kebalikan dari apa yang Uskup (2013) usulkan. Dia mengusulkan bahwa kata sandi harus 10 karakter atau kurang, tidak lebih.
PyRulez

Jawaban:


5

Python 2 , 61 59 54 51 byte

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

Cobalah online!

-5 byte, terima kasih kepada Erik the Outgolfer
-3 byte, terima kasih kepada xnor



@EriktheOutgolfer Terima kasih :)
TFeld

Anda dapat melakukan pemeriksaan panjang sebagai s[:9]<s, yang menggabungkan dengan baik dengan pemeriksaan non-palindrome:s[:9]<s!=s[::-1]
xnor

@ xnor Terima kasih :)
TFeld

4

05AB1E , 12 byte

gT@Iþg3@IÂÊP

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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 byte

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

Cobalah online!

Dari digEmAll, dan beberapa mengatur ulang juga

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

Cobalah online!

Cukup mudah, tidak ada trik nyata yang luar biasa di sini. Setelah pengguna memasukkan string:

  • Memisahkan dan mencari string untuk lebih dari 2 angka. (3 digit atau lebih)
  • Cek apakah tidak semua elemen sama dengan versi string yang terbalik (palindrome)
  • Periksa bahwa panjangnya lebih besar dari 9 (10 karakter atau lebih)

Saya pikir Anda dapat mengganti !all(s==rev(s))dengan any(s!=rev(s))yang akan menghemat satu byte. Saya merasa seperti pengecekan panjang dapat dikurangi juga, tetapi tidak yakin bagaimana (salah satu ncharatau beberapa jenis sum(x|1)peretasan)
JDL

1
sebenarnya, saya pikir any(s>rev(s))akan berfungsi --- jika sebuah karakter kurang dari rekan palindromiknya, maka di ujung lain kata sandi yang sebaliknya akan benar. Itu menghemat byte lain.
JDL


1
@digEmSemua contoh Anda mengembalikan true ketika hanya ada satu nomor, Anda harus menyertakan>2
Aaron Hayman


3

APL + WIN, 36, 30 29 byte

7 byte disimpan berkat Adám

Indeks asal = 0

Anjuran untuk input string

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

Cobalah online! Atas perkenan Dyalog Classic

Penjelasan:

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

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

>v≡⌽v Palindrome test

Kode ini juga memenuhi syarat untuk bonus karena merupakan kata sandi Uskup yang baik.


@ Adám. Terima kasih telah menghemat 6 byte. Pada ⎕IO disepakati. v≡⌽v berfungsi dengan baik jika saya menambahkan ~. Seperti untuk menggunakan x saya cenderung menggunakannya saat merangkai tes boolean. Menghasilkan jumlah byte yang sama.
Graham

Apakah Anda memiliki yang ~... ? Dan bahkan jika tidak, Anda dapat bergabung ×~ke>
Adám

@ Adám Tidak, saya tidak punya ≢. Saya dapat menggabungkan × ~ menjadi> untuk satu byte lagi. Terima kasih. Saya khawatir "permainan permainan" saya masih membutuhkan lebih banyak latihan;)
Graham

3

Brachylog , 18 12 byte

Terima kasih atas tipsnya, Kroppeb dan Fatalkan !

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

Cobalah online!

Penjelasan

Program ini merupakan predikat tunggal, terdiri dari dua bagian yang dirantai &.

Pertama:

¬       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

Kedua:

 ˢ     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

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

Menempatkan klausa "not palindrome" terlebih dahulu, dan mengubah cara untuk memilih digit, Anda dapat menyimpan 6 byte:¬↔?l>9&ịˢl>2
Fatalize

@ Kalpeb Oh, menarik! Saya tidak mempertimbangkan , tetapi masuk akal bahwa itu akan berhasil jika karakter adalah angka. Terima kasih!
DLosc

@Fatalize Aha - menggunakan kembali ?seperti itu rapi. Terima kasih!
DLosc


2

Java 8, 92 byte

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

Cobalah online.

Penjelasan:

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 byte

Mengambil input sebagai array karakter. Keluaran 1untuk kebenaran dan 0falsey.

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

Cobalah secara Online!

Disimpan 10 byte (!) Berkat Arnauld .



2

APL (Dyalog Unicode) , 25 byte SBCS

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

Cobalah online!


1
Baik. Sekarang Anda dapat bermain golf dengan membuatnya menjadi kereta: (9<≢)∧(3≤1⊥∊∘⎕D)∧⊢≢⌽dan kemudian simpan satu byte lagi dengan mengatur ulang untuk menghindari parens: (9<≢)∧≢∘⌽⍨∧3≤1⊥∊∘⎕DBeri tahu mereka jika Anda perlu penjelasan tentang langkah-langkah ini.
Adám


1

Bersih , 66 byte

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

Cobalah online!

  • s<>reverse s: sbukan palindrome
  • s%%(0,8)<s: 9 karakter pertama skurang dari semuas
  • sum[1\\c<-s|isDigit c]>2: smemiliki lebih dari dua digit

1

Retina 0.8.2 , 40 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

G`.{10}

Memeriksa setidaknya 10 karakter.

G`(\d.*){3}

Cek minimal 3 digit.

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

Hapus karakter pertama dan terakhir jika cocok.

^..

Jika setidaknya ada 2 karakter maka itu bukan palindrome.

Grup penyeimbang .NET berarti bahwa ini dapat dilakukan dalam ekspresi reguler tunggal, tetapi itu membutuhkan 47 byte:

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

Cobalah online! Tautan termasuk kasus uji.



1

Python 3 , 74 72 64 byte

Terima kasih Neil A. untuk -2 byte!
Terima kasih Jo King untuk -8 byte!

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

Penjelasan:

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

Cobalah online!



1

Perl 6 , 32 byte

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

Cobalah online!

Blok kode anonim yang hanya menegakkan bahwa semua aturan dipatuhi.

Penjelasan:

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

-3 byte terima kasih kepada ngn!

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

Cobalah online!


1
Anda bisa menggunakan +//(sum sampai konvergensi) bukan +/+/(sum sum)
ngn

1
alternatif, Anda bisa menggunakan x^x^yuntuk menemukan persimpangan antara dua daftar: #x^x^,/!10. ini dapat disingkat menjadi #x^x^/!10( ^adalah "tanpa", x^/... adalah ^-pengurangan dengan nilai awal x)
ngn

1
satu hal lagi, >(atau <) dapat digunakan sebagai "dan tidak":{(x~|x)<(2<#x^x^/$!10)*9<#x}
ngn

@ ngn Terima kasih! Cara yang bagus untuk menemukan persimpangan!
Galen Ivanov



0

Pip , 19 byte

#a>9&XD Na>2&aNERVa

Cobalah online!(semua kasus uji)

Penjelasan

Dengan amenjadi argumen baris perintah pertama:

#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 byte

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

Coba online di sini , atau verifikasi semua uji sekaligus di sini .

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

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

(Penyertaan bonus dibiarkan sebagai latihan untuk pembaca)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.