บิชอป


10

มาจากสิ่งนี้ลบโพสต์แล้ว

ให้สตริงคำตอบ (ความจริง / เท็จหรือค่าที่สอดคล้องกันสองค่า) ถ้ามันถือว่าเป็นรหัสผ่านบิชอปที่ดีซึ่งเป็นเมื่อตรงตามเงื่อนไขต่อไปนี้ทั้งหมด:

  1. มันมีอย่างน้อย 10 ตัวอักษร

  2. มันมีอย่างน้อย 3 หลัก ( [0-9])

  3. มันไม่ใช่ palindrome (เหมือนกับตัวมันเองเมื่อกลับด้าน)

คุณจะได้รับโบนัส 0 ไบต์หากรหัสของคุณเป็นรหัสผ่านบิชอปที่ดี

คำเตือน: Do ไม่ใช้ความดีบิชอปเป็นตัวชี้วัดความแข็งแรงของรหัสผ่านที่เกิดขึ้นจริง!

ตัวอย่าง

รหัสผ่านบิชอปที่ดี

PPCG123GCPP
PPCG123PPCG
PPCG123gcpp
0123456789
Tr0ub4dor&3

รหัสผ่านบิชอปไม่ดี

PPCG123 (สั้นเกินไป)
correct horse battery staple (ตัวเลขไม่เพียงพอ)
PPCG121GCPP (palindrome)
 (สั้นเกินไปและไม่เพียงพอตัวเลข)
abc121cba (สั้นเกินไปและ palindrome)
aaaaaaaaaaaa (palindrome และตัวเลขไม่เพียงพอ)
abc99cba (ทุกอย่างผิดปกติ)


@ KrystosTheOverlord คำนี้ถูกกำหนดไว้ในความท้าทายนี้เอง ;-P
Erik the Outgolfer

9
อ๊ะผมคาดหวังว่ากฎของรหัสผ่านตรรกะหมากรุกบางอย่าง ...
Bergi

1
ฉันอ่านคำตอบทั้งหมดและไม่มีใครอ้างสิทธิ์โบนัส
Veskah

1
@JDL คุณจะได้รับ substract จากคะแนนของคุณ 0 หากคุณมีสิทธิ์ได้รับโบนัสจริง ๆ นี้! คุณกำลังรออะไรอยู่?
แอรอน

1
หนึ่งในเกณฑ์ของคุณคือสิ่งที่ตรงกันข้ามกับสิ่งที่อธิการ (2556) เสนอ เขาเสนอว่ารหัสผ่านจะต้องมีอักขระไม่เกิน 10 ตัวไม่เกิน
PyRulez

คำตอบ:


5

Python 2 , 61 59 54 51 ไบต์

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

ลองออนไลน์!

-5 ไบต์ขอบคุณ Erik the Outgolfer
-3 ไบต์ขอบคุณ xnor



@EriktheOutgolfer ขอบคุณ :)
TFeld

คุณสามารถทำการตรวจสอบความยาวเป็นs[:9]<sซึ่งรวมกันได้ดีกับการตรวจสอบที่ไม่ใช่ palindrome:s[:9]<s!=s[::-1]
xnor

@xnor ขอบคุณ :)
TFeld

4

05AB1E , 12 ไบต์

gT@Iþg3@IÂÊP

ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

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 ไบต์

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

ลองออนไลน์!

จาก digEmAll และมีการจัดเรียงใหม่ด้วย

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

ลองออนไลน์!

ตรงไปตรงมาสวยไม่มีเทคนิคที่น่าตื่นตาตื่นใจจริง ๆ ที่นี่ หลังจากที่ผู้ใช้ป้อนสตริง:

  • แยกและค้นหาสตริงสำหรับตัวเลขมากกว่า 2 ตัว (3 หลักขึ้นไป)
  • ตรวจสอบว่าองค์ประกอบทั้งหมดไม่เท่ากับรุ่นย้อนกลับของสตริง (palindrome)
  • ตรวจสอบว่ามีความยาวมากกว่า 9 (10 ตัวหรือมากกว่า)

ฉันคิดว่าคุณสามารถแทนที่!all(s==rev(s))ด้วยany(s!=rev(s))ซึ่งจะบันทึกหนึ่งไบต์ ฉันรู้สึกเหมือนการตรวจสอบความยาวสามารถลดลงได้เช่นกัน แต่ไม่แน่ใจว่า (อย่างใดอย่างหนึ่งncharหรือชนิดของบางsum(x|1)สับ)
JDL

1
จริง ๆ แล้วฉันคิดว่าany(s>rev(s))จะใช้งานได้ - ถ้าตัวละครมีค่าน้อยกว่าตัวอักษร palindromic จากนั้นอีกส่วนหนึ่งของรหัสผ่านการสนทนาจะเป็นจริง นั่นช่วยประหยัดไบต์อื่น
JDL


1
@digEmAll ตัวอย่างของคุณจะคืนค่าเป็นจริงเมื่อมีเพียงหมายเลขเดียวคุณจะต้องรวม>2
Aaron Hayman


3

APL + WIN, 36, 30 29 ไบต์

บันทึกไปแล้ว 7 ไบต์ขอบคุณAdám

ดัชนีกำเนิด = 0

พร้อมต์สำหรับสตริงอินพุต

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

ลองออนไลน์! ความอนุเคราะห์จาก Dyalog Classic

คำอธิบาย:

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

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

>v≡⌽v Palindrome test

รหัสนี้มีคุณสมบัติรับโบนัสเนื่องจากเป็นรหัสผ่านบิชอปที่ดี


@ อดัม ขอบคุณสำหรับการบันทึก 6 ไบต์ เมื่อวันที่⎕IOเห็นด้วย v≡⌽vทำงานได้ดีถ้าฉันเติม ~ ในการใช้งานของ x ฉันมักจะใช้เมื่อทำการรวมการทดสอบบูลีนเข้าด้วยกัน ผลลัพธ์เดียวกันจำนวนไบต์เท่ากัน
เกรแฮม

คุณมีซึ่งเป็น~... ? และแม้ว่าคุณจะไม่ได้คุณสามารถผสาน×~เข้า>
อดัม

@ Adámไม่ฉันไม่มี≢ ฉันสามารถรวม× ~ เข้ากับ> อีกหนึ่งไบต์ ขอบคุณ ฉันเกรงว่า "เกมวาง" ของฉันยังต้องการการฝึกฝนมากกว่านี้)
เกรแฮม

3

Brachylogขนาด18 12 ไบต์

ขอบคุณสำหรับเคล็ดลับKroppebและFatalize !

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

ลองออนไลน์!

คำอธิบาย

โปรแกรมเป็นภาคแสดงเดียวประกอบด้วยสองส่วนที่ถูกล่ามโซ่ด้วย &โปรแกรมนี้เป็นภาคเดียวที่ประกอบด้วยสองส่วนที่ถูกล่ามโซ่ไว้กับ

ครั้งแรก:

¬       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

ประการที่สอง:

 ˢ     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

{∋.∈Ị∧}ᶜสามารถ{∋ị}ᶜ
Kroppeb

การใส่ประโยค "not palindrome" เป็นอันดับแรกและเปลี่ยนวิธีการเลือกตัวเลขคุณสามารถบันทึกได้ 6 ไบต์:¬↔?l>9&ịˢl>2
ทำให้เสียชีวิต

@Kroppeb โอ้น่าสนใจ! ฉันไม่ได้พิจารณาแต่มันก็สมเหตุสมผลว่ามันจะประสบความสำเร็จถ้าตัวละครเป็นตัวเลข ขอบคุณ!
DLosc

@Fatalize Aha - นำสิ่ง?ที่เป็นระเบียบมาใช้ซ้ำ ขอบคุณ!
DLosc


2

Java 8, 92 ไบต์

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

ลองออนไลน์

คำอธิบาย:

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 ไบต์

รับอินพุตเป็นอาร์เรย์ของอักขระ ผลลัพธ์1สำหรับความจริงและ0เพื่อความเท็จ

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

ลองออนไลน์!

ที่บันทึกไว้ 10 ไบต์ (!) ขอบคุณที่Arnauld



2

APL (Dyalog Unicode) , 25 ไบต์SBCS

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

ลองออนไลน์!


1
ดี. ตอนนี้คุณสามารถตีมันด้วยการลงรถไฟ: (9<≢)∧(3≤1⊥∊∘⎕D)∧⊢≢⌽จากนั้นประหยัดอีกหนึ่งไบต์โดยจัดเรียงใหม่เพื่อหลีกเลี่ยงการล้อเลียน: (9<≢)∧≢∘⌽⍨∧3≤1⊥∊∘⎕Dให้พวกเขารู้ว่าคุณต้องการคำอธิบายขั้นตอนเหล่านี้หรือไม่
อดัม



1

เรติน่า 0.8.2 , 40 ไบต์

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

ลองออนไลน์! ลิงก์มีกรณีทดสอบ คำอธิบาย:

G`.{10}

ตรวจสอบอย่างน้อย 10 ตัวอักษร

G`(\d.*){3}

ตรวจสอบอย่างน้อย 3 หลัก

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

ลบอักขระตัวแรกและตัวสุดท้ายออกถ้าตรงกัน

^..

หากมีอย่างน้อย 2 ตัวอักษรแสดงว่าไม่ใช่ palindrome

กลุ่มดุลของ. NET หมายความว่าสิ่งนี้สามารถทำได้ในนิพจน์ปกติเดียว แต่ใช้เวลา 47 ไบต์:

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

ลองออนไลน์! ลิงก์มีกรณีทดสอบ



1

Python 3 , 74 72 64 ไบต์

ขอบคุณNeil A.สำหรับ -2 ไบต์!
ขอบคุณJo Kingสำหรับ -8 ไบต์!

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

คำอธิบาย:

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

ลองออนไลน์!



1

Perl 6 , 32 ไบต์

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

ลองออนไลน์!

บล็อคโค้ดแบบไม่ระบุชื่อที่บังคับให้ปฏิบัติตามกฎทั้งหมดเท่านั้น

คำอธิบาย:

{          &&         &&       }  # 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 ไบต์

-3 ไบต์ด้วย ngn!

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

ลองออนไลน์!


1
คุณสามารถใช้+//(ผลรวมจนกระทั่งการบรรจบกัน) แทน+/+/(ผลรวม)
ngn

1
อีกทางเลือกหนึ่งที่คุณสามารถใช้เพื่อหาจุดตัดระหว่างสองรายการ:x^x^y #x^x^,/!10สิ่งนี้สามารถย่อให้เล็กลง#x^x^/!10( ^คือ "ไม่มี", x^/... คือ - ^ลดค่าเริ่มต้นx)
ngn

1
อีกสิ่งหนึ่ง>(หรือ<) สามารถใช้เป็น "และไม่ใช่":{(x~|x)<(2<#x^x^/$!10)*9<#x}
ngn

@ngn ขอบคุณ! เป็นวิธีที่ดีที่จะหาทางแยก!
Galen Ivanov



0

Pip , 19 ไบต์

#a>9&XD Na>2&aNERVa

ลองออนไลน์! (กรณีทดสอบทั้งหมด)

คำอธิบาย

ด้วยaการเป็นอาร์กิวเมนต์บรรทัดคำสั่งแรก:

#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 ไบต์

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

ลองออนไลน์ได้ที่นี่หรือตรวจสอบทุกกรณีการทดสอบในครั้งเดียวที่นี่

&&<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 ไบต์)

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

(การรวมโบนัสถูกทิ้งไว้เป็นแบบฝึกหัดให้ผู้อ่าน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.