นี่เป็นหมายเลขบันไดหรือไม่


15

ถาม:

ตรวจสอบว่าตัวเลขที่กำหนดเป็น a number staircaseหรือไม่


อินพุต:

จำนวนเต็ม (มากกว่า 0 และไม่ใช่ทศนิยม) หมายเหตุ: คุณสามารถรับอินพุตเป็นสตริงอาร์เรย์ของตัวเลข


ผลผลิต:

ค่าความจริง / เท็จขึ้นอยู่กับว่าหมายเลขเป็นบันไดหรือไม่


จำนวนบันได:

จำนวนบันไดเป็นจำนวนเต็มว่าเมื่ออ่านจากซ้ายไปขวา: การ

  • เริ่มต้นด้วย 1
  • ซึ่งอาจตามด้วย 2
  • ซึ่งอาจตามมาด้วย 3
  • และอื่น ๆ จนถึง n
  • จากนั้นตัวเลขจะเริ่มต้นที่ n - 1
  • จากนั้น n - 2
  • จากนั้น n - 3
  • และจนกว่าจะถึง 1

บันทึก :

อาจจะเป็นส่วนหนึ่งที่จะใช้ในการระบุว่าหากความยาว> เป็นมากกว่า 1. ถ้าเป็นคำสั่งที่จะต้องปฏิบัติตามที่เป็นอยู่ เช่น: 12321


ตัวอย่าง:

12321                          ---> true
12345654321                    ---> true
9                              ---> false
1                              ---> true
2                              ---> false
123421                         ---> false
112312318901323                ---> false
123456789101110987654321       ---> true

บันทึก :

ข้อมูลที่ป้อนให้จะเป็นจำนวนเต็มมากกว่า 0 เสมอและจะไม่เป็นทศนิยม เอาต์พุตของคุณต้องเป็นtruthy or falsyค่าขึ้นอยู่กับอินพุต


ข้อ จำกัด :

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ (สำหรับแต่ละภาษาการเขียนโปรแกรม) ชนะ



2
เราสามารถรับข้อมูลเป็นรายการตัวเลขได้หรือไม่? ชอบ[1,2,3,4,5,6,7,8,9,1,0,1,1,1,0,9,8,7,6,5,4,3,2,1]สำหรับ123456789101110987654321?
Mr. Xcoder

@ Mr.Xcoder: ฉันอยากจะมากกว่าถ้าคุณไม่ได้ แต่ฉันคิดว่าคุณสามารถ
Muhammad Salman

มีขีด จำกัด บนของอินพุตหรือไม่
mypetlion

@mypetlion: ไม่ได้จริงๆก็จะสูงถึงรหัสของคุณสามารถสนับสนุนปกติสูงสุดภาษาของคุณสามารถสนับสนุน ( แต่ไม่ใช่ในกรณีนี้) (ไม่รวม hardcoded และ purposedly คนที่ต่ำ.)
มูฮัมหมัดซัลมาน

ขอให้เราใส่สตริงของอักขระเป็นอินพุตให้กับฟังก์ชั่นได้ไหม (หรือเป็นเพียงการป้อนข้อมูลที่ยอมรับได้สำหรับโปรแกรมเต็มรูปแบบหรือไม่?)
Jonathan Allan

คำตอบ:


5

R , 97 ไบต์

function(n)"if"(n>1,{while({T=T+1;x=paste(c(1:T,T:2-1),collapse="");nchar(x)<nchar(n)})0;x==n},T)

ลองออนไลน์!

ใช้nเป็นcharacterหรือinteger; ใช้characterจะให้ผลลัพธ์ที่ถูกต้องสำหรับจำนวนเต็มที่ไม่สามารถจัดขึ้นได้อย่างแม่นยำเป็น double64

สร้างหมายเลขบันไดจนกว่าจะพบอย่างน้อยหนึ่งตราบเท่าที่nเป็นแล้วทดสอบเพื่อความเท่าเทียมกัน

เทียบเท่ากับ:

function(n)
    if(n > 1){
        T <- T + 1
        x <- paste(c(1:T,T:2-1),collapse="")
        while(nchar(x) < nchar(n)){
            T <- T + 1
            x <- paste(c(1:T,T:2-1),collapse="")
        }
        return(x == n)
    } else
        return(TRUE)


จะไม่แทนที่function(n)ด้วยn=scan();จะสั้นกว่าหรือไม่ (สำหรับจำนวนเต็มแน่นอน)
pajonk

@pajonk ฉันคิดอย่างนั้น แต่ฉันจะบอกว่าฉันใช้มันเป็นสตริงดังนั้นคำตอบนี้ถูกต้องสำหรับอินพุตที่ใหญ่ขึ้น
Giuseppe


3

JavaScript (ES6), 62 57 ไบต์

บันทึก 2 ไบต์ต้องขอบคุณ @ l4m2

ส่งคืนบูลีน

f=(s,k=1)=>(m=s.match(`^${k}(.*)${k}$`))?f(m[1],k+1):s==k

ลองออนไลน์!

อย่างไร?

เริ่มต้นด้วยk = 1เรามองหาkที่จุดเริ่มต้นและจุดสิ้นสุดของสตริงและสำทับซ้ำขั้นตอนที่เหลือตรงกลางสตริงย่อยกับk + 1 การเรียกซ้ำจะหยุดทันทีที่ไม่มีการแข่งขันอีกต่อไป การป้อนข้อมูลเป็นจำนวนบันไดถ้าสุดท้ายสตริงย่อยเท่ากับk

ตัวอย่างสำหรับ s = "1234321":

 k | s         | match     | s == k 
---+-----------+-----------+--------
 1 | "1234321" | 1(23432)1 | no     
 2 | "2343"    | 2(343)2   | no     
 3 | "343"     | 3(4)3     | no     
 4 | "4"       | null      | yes    

55 ไบต์ สมมติว่า 0 เป็นความจริงและ null เป็นเท็จ (เขาไม่ได้ระบุอย่างแน่นอนว่าเขา)

ฉันไม่เห็นว่าการเดานั้นไม่ถูกต้อง ขออภัย

@ ฉันไม่เป็นไรไม่ต้องกังวล! ที่น่าสนใจการลบออกm[0]==s&จะทำให้มันผ่านกรณีทดสอบทั้งหมด (แต่ก็ยังล้มเหลวในกรณีอื่น ๆ เช่น"123217")
Arnauld

f=(s,k=1)=>(m=s.match(`^${k}(.*)${k}$`))?f(m[1],k+1):s==k?
l4m2


2

Pyth, 13 12 ไบต์

/mjk+Sd_Stdl

บันทึกเป็นไบต์ด้วย RK
ลองที่นี่

คำอธิบาย

/mjk+Sd_Stdl
 m         lQ   For each d up to the length of the (implicit) input...
    +Sd_Std     ... get the list [1, 2, ..., d, d-1, ..., 1]...
  jk            ... concatenated.
/               Count how many times the input appears.

หากคุณต้องการให้อินพุทเป็นจำนวนเต็มจริงๆคุณสามารถใช้}Qmsjk+Sd_Stdแทนได้ แต่สิ่งนี้ช้ามากอย่างน่ากลัว


คุณสามารถใช้/แทนการ}Qเติมข้อความอัตโนมัติQในตอนท้าย
RK


2

C # (Visual C # Interactive คอมไพเลอร์) , 138 107 102 ไบต์

bool t(List<int>s)=>s.Select((j,i)=>s[0]==1&&s.Last()==1&&(i==0||j+1==s[i-1]||j-1==s[i-1])).All(x=>x);

ลองออนไลน์!

คำอธิบาย:

bool t(List<int>s)=>
    s.Select((j,i) =>         //iterate over each item and store the return value
        s[0]==1&&s.Last()==1  //does the sequence start and end with 1?
        &&                    //AND
        (i==0                 //is it the first item?
        ||                    //OR
        j+1==s[i-1]           //is the item 1 greater than the previous?
        ||                    //OR
        j-1==s[i-1])          //is the item 1 smaller than the previous?
    ).All(x=>x);              //did all pass the criteria?

ที่จริงแล้วZip...Skipวิธีการในความคิดเห็นก่อนหน้าของฉันล้มเหลวใน[1,1]ซึ่งควรกลับtrueถ้าฉันเข้าใจ spec ฉันลบมันแล้ว
benj2240

ขอขอบคุณ! ฉันไม่เคยใช้ Zip มาก่อน แต่ตอนนี้ฉันเห็นแล้วว่ามันมีประโยชน์อย่างไร
Kahzaar

1

05AB1E , 9 8 ไบต์

L€L€ûJså

คำเตือน: ช้ามาก! เพิ่มgไปยังจุดเริ่มต้นเพื่อเพิ่มความเร็ว

ลองออนไลน์!

คำอธิบาย:

L           1..input
 €L         for each element, map to 1..element 
   €û       palindromize each element
     J      join each element from a list to a string
      så    is the input in that list?

คำอธิบายเก่า:

F           For [0 .. input] map over
 NL          Push 1..i
   û         Palindromize
    J        Join
     ¹       First input
      Q      Equal?
       }   end loop
        O  Sum.

ลองออนไลน์!


ทำหมัน? สิ่งนี้ทำอะไร เพราะอย่างที่คุณอาจรู้ว่าบันไดที่มี 10+ นั้นไม่มี palindromes
Yassin Hajaj

@YassinHajaj มันเป็นตัวรบกวนอาร์เรย์ไม่ใช่สตริง
Okx

เอาล่ะขอบคุณสำหรับข้อมูล
Yassin Hajaj

@YassinHajaj gLη€ûJsåเป็นอีกหนึ่งที่คุณสามารถดู vectorization ของ palindromization โดยใช้€ûpalindromize แต่ละ
Magic Octopus Urn

@okx gLη€ûJsåสำหรับขนาด 8 ไบต์ที่ไม่ทำให้ TIO เสียหาย
Magic Octopus Urn

1

Python 2 , 77 ไบต์

lambda s,r=range:s in[''.join(map(str,r(1,k+2)+r(k,0,-1)))for k in r(len(s))]

ลองออนไลน์!


บันทึกสี่โดยการยอมรับเป็นจำนวนเต็มถ้าเราอาจเกิดข้อผิดพลาดเมื่อเราตี longs: TIO เราต้องการเวลาและความทรงจำในจุดนี้อยู่ดี!
Jonathan Allan

1

Stax , 14 ไบต์

Ç╗☻W╧ΩÆΘαφ←≤─♣

เรียกใช้และแก้ไขข้อบกพร่อง

ช้ามากสำหรับจำนวนที่มากขึ้น



การเปลี่ยนแปลงเล็กน้อยสำหรับ7 ไบต์
เรียกซ้ำ

และอันรวดเร็วที่8 ไบต์
เรียกซ้ำ

1

ทูต , 57 55 46 ไบต์

{GenerateFirst[N@Join@Bounce@1&`:,`>=:`#&_]=_}

ลองออนไลน์! อ่านั่นมันเยี่ยมกว่ามาก

ด้วยGenerate(49 ไบต์):

{g@Generate[{g@_>=#_2}&_]=_}g:=N@Join@Bounce@1&`:

คำอธิบาย

{GenerateFirst[N@Join@Bounce@1&`:,`>=:`#&_]=_}
{                                            }   anonymous lambda, argument: _
 GenerateFirst[                  ,        ]      find the first element satisfying...
               N@Join@Bounce@1&`:                    this generation function
                                  `>=:`#&_           and this condition
                                           =_    is it equal to the input?

ฟังก์ชั่นการสร้างเพียงสร้างNหมายเลขบันไดที่ จากนั้นการค้นหานี้จะสิ้นสุดลงเมื่อ`>=:`#&_มีความพึงพอใจ ขยายตัวนี่คือ:

 `>=:`#&_
 (`>= : `#) & _      NB. remember _ is the input
                     NB. also, f:g is f[...Map[g, args]]
 { #_1 >= #_2 } & _
 { Size[_1] >= Size[_2] } & _
 { Size[_1] >= Size[the original input] }
 [n] -> { Size[n] >= Size[input] }

ดังนั้นสิ่งนี้จะสิ้นสุดลงเมื่อความยาวของเอาต์พุตของฟังก์ชันการสร้างเป็นอย่างน้อยของอินพุต ดังนั้นสิ่งนี้จะสร้างหมายเลข staircase ที่เล็กที่สุดอย่างน้อยเท่ากับหมายเลขอินพุท ดังนั้นหากอินพุตเป็นหมายเลขบันไดผลลัพธ์จะเป็นหมายเลขบันไดเดียวกันและเป็นหมายเลขบันไดยาวที่สุดถัดไป ดังนั้นการตรวจสอบอย่างง่าย ๆ ที่มีความเท่าเทียมกับอินพุตต้นฉบับนั้นเพียงพอสำหรับการพิจารณาว่าเป็นหมายเลขบันไดหรือไม่

ทูตขนาด 55 ไบต์

0&{If[#_2>#g[_],$[_+1,_2],_2=g!_]}g:=N@Join@Bounce@1&`:

ลองออนไลน์!ด้วยการเรียกซ้ำแผนเฒ่า




1

K , 36 ไบต์

{|/($x)~/:{,/$(1+!x),1+1_|!x}'1+!#x}

รับค่าสตริงเช่น "12321" เป็นพารามิเตอร์

ฟังก์ชั่นนี้เขียนขึ้นเป็นแอพพลิเคชั่นฟังก์ชั่นที่มีสายยาวf g h xดังนั้นโปรดอ่านเวอร์ชั่นที่ถูกคอมเม้นต์จากด้านล่าง {x+1}is lambda x: x+1, x คือชื่อพารามิเตอร์เริ่มต้น ตรวจสอบhttps://pastebin.com/cRwXJn7Zหรือความช่วยเหลือของล่ามสำหรับความหมายของผู้ปฏิบัติงาน

เราสร้างหมายเลขบันไดที่nอยู่ตรงกลางโดย{,/$(1+!x),1+1_|!x}:

{,/                      / join all the chars
   $                     / tostring each number
     (1+!x)              / take the range [0..x-1]; add 1 to each
            ,            / concat
             (1+1_|!x)}  / take the range [0..x-1]; reverse it; drop 1; add 1 to each

ฟังก์ชั่นทั้งหมด{|/($x)~/:{,/$(1+!x),1+1_|!x}'1+!#x}:

{|/                                   / any_is_true
   ($x)~/:                            / match the string with each of the generated staircases
          {,/$(1+!x),1+1_|!x}'        / make staircase number of each of the numbers
                                      / (note: the x in the inner lambda shadows the outer x)
                              1+!#x}  / take the range [1..length of the string, inclusive]

0

Haskell , 64 60 58 ไบต์

-6 ขอบคุณ @BMO!

elem.show<*>(`take`[[1..n]++[n-1,n-2..1]>>=show|n<-[1..]])

ลองออนไลน์!


ในทางทฤษฎีใช้งานได้12345678910987654321หากคุณสามารถสร้างรายการที่มีองค์ประกอบมากมาย
แยกผลไม้

@BMO ฉันรู้ว่าต้องมีวิธีการทำเช่นนั้น ขอบคุณ
แยกผลไม้

@BMO สนามกอล์ฟของคุณมีความชัดเจนในการเข้าใจถึงปัญหา ...
เสี้ยวผลไม้

นอกจากนี้ยังใกล้มากฉันจะแนะนำให้เป็นการปรับปรุงหากฉันไม่ได้โพสต์ไว้ (ฉันไม่เห็นคุณจนกว่าฉันจะโพสต์ของฉัน)
ბიმო


0

Java 10, 142 ไบต์

s->{int n=1,l,f=1;try{for(;;s=s.substring(l=(n+++"").length(),s.length()-l))if(!s.matches(n+".*"+n)&!s.equals(n+""))f=0;}finally{return f>0;}}

ลองออนไลน์

คำอธิบาย:

s->{                 // Method with String parameter and boolean return-type
  int n=1,           //  Stair integer, starting at 1
      l,             //  Length integer to reduce bytes
      f=1;           //  Result-flag, starting at 1
  try{for(;;         //  Loop until an error occurs
          s=s.substring(l=(n+++"").length(),s.length()-l))
                     //    After every iteration: remove `n` from the sides of the String
        if(!s.matches(n+".*"+n)
                     //   If the current String with the current `n` isn't a stair
           &!s.equals(n+""))
                     //   And they are also not equal (for the middle)
          f=0;       //    Set the flag to 0
   }finally{         //  After the error (StringOutOfBoundsException) occurred:
      return f>0;}}  //   Return whether the flag is still 1

0

Japt, 11 ไบต์

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

Êõõ mê m¬øU

ลองมัน


คำอธิบาย

                :Implicit input of string U
Ê               :Length of U
 õ              :Range [1,Ê]
  õ             :Range [1,el] for each element
    mê          :Map & palidromise
       m¬       :Map & join
         øU     :Contains U?

ทางเลือก10 9 ไบต์

วิธีการแก้ปัญหานี้ซึ่งสามารถป้อนเป็นสตริงหรือจำนวนเต็มจะส่งกลับอาร์เรย์ของตัวเลขสำหรับความจริงหรือในที่สุดก็โยนข้อผิดพลาดสำหรับเท็จถ้ามันไม่ทำลายเบราว์เซอร์ของคุณก่อนหน้านั้น ใช้ด้วยความระมัดระวัง

@¥Xê q}aõ

ลองมัน


0

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

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

ลองออนไลน์!ลิงก์มีกรณีทดสอบ แก้ไข: บันทึก 2 ไบต์ขอบคุณ @Leo คำอธิบาย:

$
;1

initialise n1ไป

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

ในขณะที่ sเริ่มต้นและสิ้นสุดด้วยn:

$2;$.(_$1*

ลบ nออกจากส่วนท้ายของsnและเพิ่มขึ้น

^(.+);\1$

ทดสอบว่าnเหลืออยู่หรือไม่


ฉันคิดว่าคุณ\dสามารถเป็น.และช่วยคุณสองไบต์
Leo


-1

ขอบคุณผู้ใช้งานดังต่อไปนี้:

@Nooneishere
@LyricLy
@JoKing

Python 2 , 147 ไบต์

g=s=input()
f=1
o='1'==s[0]
while`f`==s[0]:s=s[len(`f`):];f+=1
f-=2
o&=`f`==s[0]
while s and`f`==s[0]:s=s[len(`f`):];f-=1
o&=f==0
o|=g=='1'
print o

ลองออนไลน์!


การส่งออกไม่จำเป็นต้องเป็นสตริงtrueและfalseแต่ truthy และ falsey ค่า 1และ0จะทำงานเช่น
dylnan

@dylnan: ฉันเพิ่งอ่านมันขอบคุณ ยังคงเล่นกอล์ฟ (มากไป)

คุณไม่สามารถใช้s[0]แทนได้startswithใช่ไหม อนุญาตให้มีข้อผิดพลาดและคุณสามารถพูดว่า 'เอาต์พุต 1 สำหรับขั้นบันไดสิ่งอื่น ๆ (รวมถึงไม่มีอะไร) [เนื่องจาก stderrr ถูกละเว้น] สำหรับที่ไม่ใช่บันได'
NoOne อยู่ที่นี่

@ NoOneIsHere: ความคิดที่ดี เห็นได้ชัดว่าการเข้ารหัสขณะนอนหลับนั้นไม่ใช่ความคิดที่ดีขอบคุณ

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