이것은 계단 번호입니까?


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보다 큰 정수이며 10 진수가 아닙니다. 출력은 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 : 정말, 그것은 당신의 코드가 지원할 수있는 높은 같다 일반적으로 가장 높은 언어가 (하지만이 경우) 지원 (하드 코딩 및 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)

온라인으로 사용해보십시오!

취하고 nA와 characterinteger; 를 사용 character하면 정확히 64 비트로 유지할 수없는 정수에 대한 올바른 결과가 제공됩니다 double.

최소한 하나 이상을 찾을 때까지 계단 번호를 생성 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 나는 그렇게 생각합니다. 그러나 나는 그것을 문자열로 받아 들여서이 답변이 더 큰 입력에 맞다고 말할 것입니다.
주세페


3

자바 스크립트 (ES6), 62 57 바이트

@ l4m2 덕분에 2 바이트 절약

부울을 반환합니다.

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을 진실이라고 가정하고 거짓을 거짓으로 가정하십시오 (정확히 지정하지 않은 경우)

흠 나는 그것이 틀린 추측을 보지 못했다. 죄송합니다

@Immone 걱정하지 마세요! 흥미롭게도 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 # 대화식 컴파일러) , 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. 삭제했습니다.
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+ 이상의 계단은 회문이 아닙니다
Yassin Hajaj

@YassinHajaj 그것은 문자열이 아니라 배열을 palindromise합니다
Okx

정보를 주셔서 감사합니다
Yassin Hajaj

@YassinHajaj gLη€ûJså€ûpalindromize 각각을 사용하여 palindromization 의 벡터화를 볼 수있는 또 다른 곳 입니다.
Magic Octopus Urn

gLη€ûJsåTIO를 폭파시키지 않는 8 바이트의 경우 @okx .
Magic Octopus Urn



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] }

따라서 생성 함수의 출력 길이가 입력의 길이보다 길면 종료됩니다. 따라서, 이것은 최소한 입력 번호만큼 가장 작은 계단 번호를 생성합니다. 따라서 입력이 계단 번호 인 경우 결과는 동일한 계단 번호이고 그렇지 않으면 다음으로 가장 긴 계단 번호가됩니다. 따라서 원래 입력과 동일한 간단한 검사만으로도 계단 번호인지 여부를 판단 할 수 있습니다.

첨부, 55 바이트

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

온라인으로 사용해보십시오! 계획 ol '재귀와 함께.




1

K , 36 바이트

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

"12321"과 같은 문자열을 매개 변수로 사용합니다.

이 함수는에서와 같이 긴 함수 애플리케이션 체인으로 작성 f g h x되므로 아래에서 주석이 달린 버전을 읽으십시오. {x+1}이고 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

하스켈 , 64 60 58 바이트

@BMO 덕분에 -6!

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

온라인으로 사용해보십시오!


12345678910987654321많은 요소로 목록을 작성할 수 있다면 이론적으로 작동합니다 .
Esolanging 과일

@ BMO 나는 그렇게 할 방법이 있어야한다는 것을 알고있었습니다. 감사
Esolanging 과일

@BMO 골프 는 뒷골목 에서 정말 분명합니다 ...
Esolanging Fruit

그것은 또한 매우 가깝습니다. 아직 게시하지 않았다면 개선으로 제안했을 것입니다 (내가 게시 할 때까지는 보지 못했습니다).
ბიმო


0

자바 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

apt, 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 43 바이트

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

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 편집 : @Leo 덕분에 2 바이트가 절약되었습니다. 설명:

$
;1

로 초기화 n하십시오 1.

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

s시작하고 끝나는 동안 n:

$2;$.(_$1*

n끝에서 삭제 s하고 증가시킵니다 n.

^(.+);\1$

n남아 있는지 테스트하십시오 .


나는 당신 \d.2 바이트 가되어 당신을 2 바이트 절약 할 수 있다고 생각합니다.
Leo


-1

다음 사용자 덕분에 :

@Nooneishere
@LyricLy
@JoKing

파이썬 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가 무시되므로) 아무것도 포함하지 않음'이라고 말할 수 있습니다.
NoOneIsHere4

@NoOneIsHere : 좋은 생각입니다. 수면 중에 코딩하는 것은 그리 좋은 생각이 아닙니다

1
138 바이트 솔루션은 항상 g
Jo King
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.