มันตรงกับรูปแบบหลักหรือไม่?


23

เมื่อเร็ว ๆ นี้ฉันมีการทดสอบวิชาคณิตศาสตร์และสังเกตเห็นว่าตัวเลขในการสอบตรงกับรูปแบบที่น่าสนใจ หมายเลข ( 28384) ตรงกับลำดับหลักทั่วไปที่มีลักษณะเช่นนี้

(n)(x)(n+1)(x)(n+2)(x)(n+3) etc...

ที่ไหนnและxเป็นจำนวนเต็มหลักเดียว ลำดับสามารถเริ่มต้นด้วยอย่างใดอย่างหนึ่งxหรือnและจบลงด้วยการอย่างใดอย่างหนึ่งหรือxn+y

งานของคุณคือกำหนดจำนวนเต็มบวกหลายหลักส่งออกค่าจริงหรือเท็จขึ้นอยู่กับว่าการป้อนข้อมูลตรงกับรูปแบบ อินพุตจะอยู่ระหว่าง 4 ถึง 18 หลัก คุณอาจจะใส่เป็นตัวแทนสตริงของจำนวนเต็ม อินพุตจะไม่ขึ้นต้นด้วย 0 แต่สามารถมีหรือลงท้ายด้วย 0

n+y จะเป็นตัวเลขหลักเดียวเสมอ (ดังนั้นทำไมขีดจำกัดความยาวคือ 18)

กรณีทดสอบ

สิ่งเหล่านี้ควรสร้างมูลค่าที่แท้จริง

182838485868788898
4344
85868
12223242526

และสิ่งเหล่านี้ควรเป็นเท็จ

12345
6724013635
36842478324836
1222232425
5859510511

เช่นเดียวกับ golf code ทั้งหมดรหัสที่สั้นที่สุดชนะ! ขอให้โชคดีและอาจเป็นไปได้ที่คุณโปรดปราน!


เราสามารถรับอินพุตเป็นสตริงได้หรือไม่?
Kritixi Lithos

@KritixiLithos "คุณอาจรับอินพุตเป็นตัวแทนสตริงของจำนวนเต็ม"
Mr. Xcoder

มีทั้งxและnไม่เป็นศูนย์สำหรับตัวเลขที่เหมาะสมกับกฎหรือไม่
Mr. Xcoder

@ Mr.Xcoder ตัวเลขไม่สามารถขึ้นต้นด้วย 0 แต่สามารถมีหรือลงท้ายด้วย 0s
caird coinheringaahing

คำตอบ:


8

Python 2 , 84 81 80 79 ไบต์

-1 ไบต์ขอบคุณ ovs

lambda x:g(x,1)|g(x,0)
g=lambda x,a:len(set(x[a::2]))==(x[a<1::2]in"123456789")

ลองออนไลน์!


Python 3 , 82 79 78 77 ไบต์

lambda x:g(x,1)|g(x,0)
g=lambda x,a:len({*x[a::2]})==(x[a<1::2]in"123456789")

ลองออนไลน์!

สั้นลงเล็กน้อยใน Python 3 แต่ฉันไม่คิดว่ามันสมควรได้รับคำตอบของมัน


คำอธิบาย

เราตั้งค่าฟังก์ชั่นgที่รับสตริงและดัชนี (ทั้ง 1 หรือ 0) gจากนั้นส่งกลับหรือไม่len(set(x[a::2]))นั่นคือจำนวนของตัวเลขที่ไม่ซ้ำกันในทุกตำแหน่งอื่น ๆ เท่ากับ(x[a==0::2]in"123456789")หรือไม่ว่าตัวเลขอื่น ๆ อยู่ในลำดับจากน้อยไปหามาก หากตัวเลขอยู่ในลำดับที่สูงขึ้นสิ่งนี้จะส่งกลับหรือไม่ว่าตัวเลขทั้งหมดนั้นเหมือนกันหรือไม่ถ้าไม่ใช่จะถามว่าเซตว่างเปล่าหรือไม่ซึ่งมันไม่สามารถเป็นได้ดังนั้นจะส่งคืนค่าเท็จเสมอ


ตามปกติแล้วฉันถูกโตขึ้น>. <
นาย Xcoder

x[a<1::2]in"123456789"สามารถ"0"<x[a<1::2]<":"(เปรียบเทียบตัวอักษรเปรียบเทียบอักขระรหัส)
CalculatorFeline

@CalculatorFeline ฉันไม่คิดว่าเป็นเรื่องจริง เพียงตรวจสอบว่าสตริงเริ่มต้นด้วยตัวเลข
ตัวช่วยสร้างข้าวสาลี

โอ้ใช่ แต่มันใช้ได้กับตัวละครตัวเดียว
CalculatorFeline

แต่คุณต้องการจริงa<1เหรอ? aดูเหมือนว่าอาจจะเป็นแค่
CalculatorFeline


2

05AB1E , 15 ไบต์

TG9LNýN.øŒ})˜Iå

ลองออนไลน์!

คำอธิบาย

TG9LNýN.øŒ})˜Iå
TG        }     # For 1 to 9...
  9L             # Push [1 .. 9]
    Ný           # Join with current value 
      N.ø        # surround with current value
         Œ       # Push substrings
           )    # Wrap stack to array
            ˜   # Deep flatten the array
             I  # Push input
              å # Is the input in the array?
                # Implicit print

มันควรใช้งานได้ (กรณีทดสอบทำ) แต่ถ้าคุณพบข้อบกพร่องโปรดแจ้งให้เราทราบ

14 ไบต์หากไม่มีการนับออกเป็นเท็จ:

TG9LNýN.øŒIåi1


2

Haskell, 108 113 97 95 ไบต์

d(x:_:r)=x:d r
d r=r
c(x:n:r)=and$all(==x)(d r):zipWith(==)(d$n:r)[n..]
f s@(_:n:_)=c s||c(n:s)

โทรตัวอย่าง: f "182838485868788898"อัตราผลตอบแทนTrue

รุ่นที่ไม่ได้บรรจุพร้อมคำอธิบาย:

-- Take every other element from the string, starting with the first
d (x:_:r) = x : d r
d r       = r
c (x:n:r) = and $ all (== x) (d r)              -- Every other char is equal to the first
                : zipWith (==) (d $ n:r) [n..]  -- The remaining chars are a prefix of n(n+1)(n+2)...
f s@(_:n:_) = c s      -- The case where s already starts with x
           || c (n:s)  -- If not, prepend a dummy x and try again

2
ยินดีต้อนรับสู่การเล่น PPCG และ Haskell โดยเฉพาะ! isPrefixOfไม่ได้อยู่ในโหมโรงเพื่อให้คุณมีที่จะรวมในรหัสของคุณหรือใช้ทางเลือกเช่นimport Data.List and(zipWith(==)(n:r)[n..])
Laikoni

@Laikoni: ขอบคุณสำหรับคำใบ้! ฉันเปลี่ยนฟังก์ชั่นตาม
siracusa

1
ฉันคิดว่าx/=yอาจเป็น1>0เพราะถ้าไม่ใช่x/=yตอนนี้x==yและกรณีแรกที่จับมัน
CalculatorFeline

นอกจากนี้คุณยังไม่จำเป็นต้องwhereกำหนดcและdเสริมฟังก์ชั่นเสริมด้านนอกfด้วย fสามารถทำให้สั้นลงf s@(_:n:_)=c s||c(n:s)ได้
Laikoni

1
แล้วคุณอาจจะสนใจในแนวทางในการเล่นกอล์ฟกฎใน Haskell ;แม้ว่ามันจะไม่ได้เป็นกฎที่คุณสามารถใช้การขึ้นบรรทัดใหม่แทน มันเป็นจำนวนไบต์เดียวกัน แต่ช่วยเพิ่มความสามารถในการอ่านรหัส
Laikoni

1

JavaScript (ES6), 66 63 60 ไบต์

รับอินพุตเป็นสตริง

s=>[...s].every((d,i)=>d-s[j^(k=i+j&1)]==k*i>>1,j=s[2]-s[0])

กรณีทดสอบ



1

Python 3 , 99 96 89 ไบต์

  • บันทึกแล้ว 3 ไบต์: การใช้all()ฟังก์ชั่น
  • @WheatWizard บันทึก 7 ไบต์: shorthanding & |และแทนที่ตัวแปรพิเศษด้วยk<1
lambda x,g=lambda x,k:(x[k<1::2]in'123456789')&all(j==x[k]for j in x[k::2]):g(x,0)|g(x,1)

ลองออนไลน์!

คำอธิบาย:

ก่อนอื่นแบ่งสตริงออกเป็นสองรายการ: รายการหนึ่งที่มีการจัดทำดัชนีคี่และอื่น ๆ ที่มีองค์ประกอบที่จัดทำดัชนีคู่ สองรายการ A และ B ควรเป็นเช่นนั้น:

  1. A มีหมายเลขเดียวกันและ B มีหมายเลขติดต่อกันในลำดับจากน้อยไปหามาก

หรือตรงกันข้าม

  1. B มีหมายเลขเดียวกันและ A มีหมายเลขติดต่อกันในลำดับจากน้อยไปหามาก

เงื่อนไขต่อเนื่องถูกตรวจสอบโดย: a in '123456789'

เงื่อนไขหมายเลขเดียวกันถูกตรวจสอบโดย: all(i=a[x] for i in a)


1
คุณสามารถแทนที่อินสแตนซ์ของiด้วยk<1และปล่อยiอาร์กิวเมนต์ทั้งหมดเข้าด้วยกัน
ข้าวสาลีตัวช่วยสร้าง

1
นอกจากนี้คุณยังสามารถล้อมรอบกริยาแรกใน parens และใช้แทน& andคุณorสามารถถูกแทนที่ด้วย|เช่นกัน
ข้าวสาลี Wizard

1
ฉันเห็นสิ่งนี้ในที่สุดก็แปรเปลี่ยนเป็นคำตอบของคุณ .. : D
Officialaimm

1

PHP , 68 ไบต์

for(;$v<10;)$s.=strstr(+$v.join(+$v,range(1,9)).+$v++,$argn);echo$s;

ลองออนไลน์!

เอาท์พุทส่วนหนึ่งของสตริงการค้นหาเริ่มต้นจากและรวมถึงการเกิดขึ้นครั้งแรกของการป้อนข้อมูลไปยังจุดสิ้นสุดของสตริงการค้นหาเป็นค่าความจริงและไม่มีอะไรผิดพลาด

สำหรับ 2 ไบต์มากขึ้นคุณสามารถแทนที่echo$s;ด้วย!!echo$s;เพื่อให้ได้1ค่าตามจริง

ค้นหาการเกิดขึ้นของอินพุตในหนึ่งในสตริงต่อไปนี้ในอาร์เรย์

Array
(
    [0] => 0102030405060708090
    [1] => 1112131415161718191
    [2] => 2122232425262728292
    [3] => 3132333435363738393
    [4] => 4142434445464748494
    [5] => 5152535455565758595
    [6] => 6162636465666768696
    [7] => 7172737475767778797
    [8] => 8182838485868788898
    [9] => 9192939495969798999
)


1

MATL , 15 ไบต์

2L&),duw]hSFTX=

ลองออนไลน์!

ด้วยความช่วยเหลือของ @LuisMendo ในการแชท โปรดทราบว่าถ้าเอาท์พุทที่ว่างเปล่า + ข้อผิดพลาดถือว่ายัง 'falsy' ที่Xสามารถปล่อยออกนำคะแนนไป14 ไบต์

2L&)     % Split the input into odd and even-indexed elements
    ,   ] % Do twice (new feature since MATL v20.0), i.e., on both halves of the input
     d     % Pairwise differences of the array. Results in [0,0,...] for the 'constant' part,
            %  and [1,1,...] for the 'increasing' part.
      u      % Get unique elements. Results in [0] for the constant part, [1] for the increasing part.
       w      % Swap the stack to do the same for the other half of the input.
         hS    % Horizontal concatenation followed by sort. Results in [0,1] for the desired string.
           FTX= % Check if the result is indeed [0,1]. Implicit display.


0

Pyth , 20 ไบต์

ASm.+sMd.Tcz2&-GZ-H1

เอาท์พุต []เมื่อตัวเลขตรงกับรูปแบบหลักสิ่งอื่นใด

ลองออนไลน์!

คำอธิบาย (ตัวอย่างพร้อมอินพุต85868)

ASm.+sMd.Tcz2&-GZ-H1

          cz2           # Chop the input in pairs: ['85', '86', '8']
        .T              # Transpose, ignore absences: ['888', '56']
     sM                 # Convert to integers: [[8, 8, 8], [5, 6]]
  m.+  d                # Compute deltas: [[0, 0], [1]]
 S                      # Sort: [[0, 0], [1]]
A                       # Assign first list to G and second list to H
              -GZ       # Filter 0 on G (on absence): [0, 0] -> []
                 -H1    # Filter 1 on H (on absence): [1] -> []
             &          # Check both lists are empty (logical and): [] & [] -> []

0

Pyth, 17 ไบต์

qU2Ssm{.+d.TcjQT2

ลองที่นี่

อัลกอริทึมเช่นเดียวกับคำตอบวุ้นของฉัน

คำอธิบาย:

qU2Ssm{.+d.TcjQT2 Accepts an integer
             jQT  Take digits of input
            c   2 Split in pairs
          .T      Transpose
     m            Map the following on each of the two resulting lists:
       .+d          Take deltas
      {             Deduplicate
    s             The list is now in [[a, b, ...], [A, B, ...]] format, convert it to [a, b, ..., A, B, ...]
   S              Sort
qU2               Check if equal to [0, 1]

0

Python 3 , 167 161 157 131 106 ไบต์

-55 ไบต์ขอบคุณคำแนะนำของ @ WheatWizard

def g(t):k,c,f,j=t[::2],t[1::2],'123456789',''.join;return(len({*k})and j(c)in f)or(len({*c})and j(k)in f)

ลองออนไลน์!


สามารถตีกอล์ฟต่อไปได้ ฉันแก้ไขแล้ว
นาย Xcoder

คุณอาจได้เห็นเคล็ดลับนี้ในคำตอบของฉัน แต่เป็นเช่นเดียวกับset(c) {*c}(อย่างน้อยในไพ ธ อน 3)
Wheat Wizard

@WeatWizard ขอบคุณ การแก้ไข
Mr. Xcoder

3
[t[z]for z in range(0,len(t),2)]ยังเป็นเพียงรายการต่อกัน t[::2]คุณสามารถทำเช่นนี้เพียงกับ หากคุณไม่คุ้นเคยกับไวยากรณ์นี้ฉันขอแนะนำให้ดูเอกสารเพราะมันมีประโยชน์มาก
ข้าวสาลีตัวช่วยสร้าง

@WeatWizard ว้าวนั่นมันมีประโยชน์จริงๆ น่าเศร้าที่ฉันไม่สามารถแก้ไขคำตอบได้ในขณะนี้ ฉันจะทำทันทีที่ฉันสามารถ Thaks มากสำหรับคำแนะนำ ...
นาย Xcoder

0

Java (OpenJDK 8) , 128 119 118 108 107 104 ไบต์

s->{int i=3,a=s[2]-s[0],b=s[3]-s[1];for(;++i<s.length;)a+=b-(b=s[i]-s[i-2]==a?a:2);return(a|b)==1&a!=b;}

ลองออนไลน์!

คำอธิบาย:

s->{                             // lambda
  int i=3,                       //  iterating index
      a=s[2]-s[0],               //  diff of even-indexed characters
      b=s[3]-s[1];               //  diff of odd-indexed characters
  for(;++i<s.length;)            //  iterate
    a+=b-(b=                     //   swap a and b
        s[i]-s[i-2]==a?a:2       //    or set b to 2 if the diffs don't match
      ));                        //
  return (a|b)==1                //  return true if both a and b are in (0,1)
        &a!=b;                   //         but different
}

0

เรติน่า 47 ไบต์

.
$*11;
(1+)(?<=\1;1+;\1)

^1+;1+

^;?(;1;)+;?$

ลองออนไลน์!

ส่งออก 1 หากตรงกับรูปแบบ 0 ถ้าไม่ได้

คำอธิบาย

.
$*11;

แปลงแต่ละหลัก n เป็น n + 1 ในเอกภาพคั่นด้วยเครื่องหมายอัฒภาค

(1+)(?<=\1;1+;\1)

(ขึ้นบรรทัดใหม่) แปลงแต่ละหลักเพื่อความแตกต่างระหว่างตัวเองและหนึ่ง 2 จุดก่อนมัน

^1+;1+

(ขึ้นบรรทัดใหม่) ลบตัวเลข 2 ตัวแรก

^;?(;1;)+;?$

นับจำนวนการจับคู่ของรูปแบบนี้ซึ่งจะตรวจสอบการสลับ 0 และ 1

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