これは階段番号ですか?


15

チャレンジ:

指定された番号がaを形成するnumber staircaseかどうかを確認します


入力:

整数(10進数ではなく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:しなかったらいいのですが、できると思います
ムハンマドサルマン

入力に上限はありますか?
-mypetlion

@mypetlion:実際には、コードがサポートできるほど高い(ハードコーディングされた、意図的に低いコードを除く)。通常、言語がサポートできる最高の(この場合はそうではない)
Muhammad Salman

関数への入力として文字列を使用できますか?(または、これは完全なプログラムに対してのみ許容される入力ですか?)
ジョナサンアラン

回答:


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として取ります。を使用すると、64ビットとして正確に保持できない整数に対して正しい結果が得られますcharacterintegercharacterdouble

少なくとも1つが見つかるまで階段番号を生成します 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そう思う。しかし、私はそれを文字列として取っていると言うので、この答えは大きな入力に対して正しいです。
ジュゼッペ


3

JavaScript(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を真理、nullを偽と仮定します(彼は正確に指定しませんでした)

ええ、私はそれが無効だとは思いませんでした。申し訳ありません

@心配無用!興味深いことに、m[0]==s&代わりに削除すると、すべてのテストケースに合格します(ただし、などの他のテストケースでは失敗します"123217")。
アーナウルド

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のおかげで1バイト節約できました。
ここで試してみてください

説明

/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 Compiler)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を使用したことはありませんが、Zipがどのように役立つかがわかりました。
カザール

1

05AB1E9 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 +以上の階段は回文ではありません
ヤシン・ハジャイ

@YassinHajaj文字列ではなく配列を回文します
Okx

情報に感謝
ヤシン・ハジャイ

@YassinHajajももうgLη€ûJså1 つで、€ûそれぞれpalindromizeを使用して回文のベクトル化を確認できます。
魔法のタコ

gLη€ûJsåTIOを爆破しない8バイトの@okx 。
魔法のタコ



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

Haskell64 60 58バイト

-6 @BMOに感謝します!

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

オンラインでお試しください!


12345678910987654321多数の要素を含むリストを作成できる場合、理論的にはに対して機能します。
エソランジングフルーツ

@BMOそれをする方法がなければならないと知っていました。ありがとう
エソランジングフルーツ

@BMO あなたのゴルフは ...後知恵で本当に明白である
Esolangingフルーツ

また、非常に近いので、まだ投稿していない場合は改善策として提案していました(投稿するまでは表示されませんでした)。
ბიმო


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 43バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。編集:@Leoのおかげで2バイト保存されました。説明:

$
;1

に初期化n1ます。

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

s始まり、次で終わるn

$2;$.(_$1*

nの両端から削除し、sをインクリメントしますn

^(.+);\1$

n残っているかどうかをテストします。


私はあなたの考えて\dsがなることができます.し、あなたに2つのバイトを保存
レオ


-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

オンラインでお試しください!


出力は文字列である必要はありませんtruefalseなく、truthyとfalsey値。1そして0、例えば
-dylnan

@dylnan:読んだだけだ、ありがとう。まだゴルフをする(たくさん行く)

使っていただけませんか s[0]代わりにstartswithか?エラーは許可され、「階段の場合は出力1、非階段の場合は(stderrrが無視されるため)他のすべて(何も含まない)」と言うことができます。
-NoOneIsHere

@NoOneIsHere:良いアイデア。どうやら睡眠中のコーディングはあまり良いアイデアではありません。感謝

1
138バイトのソリューションは常にg1 であるため、常にFalseを返します。投稿する前にこれらのソリューションをテストする必要があります。
ジョー・キング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.