階段番号


29

階段番号は正の整数xで、そのn番目の桁(最下位桁から始まるインデックス付き)はx%(n + 1)に等しくなります。それはちょっと一口なので、例を見てみましょう。テイク7211311を我々はモジュラー残基取る場合、7211311の範囲に2-8私たちは以下のようになります。

7211311 % 2 = 1
7211311 % 3 = 1
7211311 % 4 = 3
7211311 % 5 = 1
7211311 % 6 = 1
7211311 % 7 = 2
7211311 % 8 = 7

これらは7211311の数字です!したがって、7211311は階段番号です。

仕事

入力として正の数を与えたときに取るコードを書くと、2つの異なる値が出力されます。1つ階段番号であり、もう1つはそうでない場合です。

これは競合なので、目的はソースコードのバイト数を最小限にすることです。

テストケース

最初の13の階段番号は次のとおりです。

1, 10, 20, 1101, 1121, 11311, 31101, 40210, 340210, 4620020, 5431101, 7211311, 12040210

0階段番号ではありませんか?多くの答えがそう思います。
Okx

3
@Okxのタスクは、正の階段番号と正の非階段番号を区別することだけであるため、0および負の番号の動作は未定義です。
パエロエベルマン

回答:


10

Haskell、55 57バイト

f m|let n#x=n==0||n`mod`10==m`mod`x&&div n 10#(x+1)=m#2

他のHaskellソリューションとは異なるアプローチ。

2バイトを保存してくれてありがとう。


4
このヒントを使用して、let式を短縮できます。
-xnor

別の短いアプローチ。よくやった!+1
qfwfq


7

Javascript、42 41 39 38バイト

@Shaggyと@ETHProductionsのおかげで-4バイト

s=>[...s].some(d=>s%i++^d,i=~s.length)

これは、数値を文字列としてfalse取得し、数値が階段番号であるtrue場合とそうでない場合に戻ります。

サンプルコードスニペット:

f=
s=>[...s].some(d=>s%i++^d,i=~s.length)

function update() {
  o.innerText = f(document.getElementById("i").value)
}
<input id="i" type="number">
<button onclick="update()">Test</button>
<p id="o">


2
!チャレンジではtrue、trueとfalsefalseを返す必要があることを明示的に指定していないため、単純に2つの異なる値を返す必要があるため、をドロップできるはずです。
シャギー

2
これは非常によくゴルフされ、よくやった。i自分で計算すれば、さらに2バイトをs=>[...s].some(d=>s%i--^d,i=s.length+1)
圧縮

2
実際、~x == -(x+1)整数とでx%-y == x%y、もう1つを取得できると思いますs=>[...s].some(d=>s%i++^d,i=~s.length)
。– ETHproductions

6

05AB1E、6バイト

コード:

ā>%JRQ

05AB1Eエンコードを使用します。オンラインでお試しください!

説明:

ā        # Get the range [1 .. len(input)]
 >       # Increment by 1
  %      # Vectorized modulo
   J     # Join the array into a single number
    RQ   # Reverse that number and check if it's equal to the original input

6

Haskell、60バイト

数値を整数として受け取ります

x n|s<-show n=reverse s==(rem n.(+1)<$>[1..length s]>>=show)



5

Japt9 7バイト

入力を文字列として受け取ります。

¥£%´JÃw

試して

  • ETHproductionsの支援で2バイト節約されました。

説明

入力として暗黙的に文字列を受け取ります。

£   Ã

文字列の各文字にマップします。

´J

JはのJapt定数で-1´パスごとに1ずつ減り--ます(JavaScriptで)。したがって、最初のパスで、これは私たちに与え-2ます。

%

この値を使用して、プロセスで整数に自動的にキャストされる入力文字列に対してモジュロ演算を実行します。JavaScript x%-yでは、と同じ結果が得られx%yます。

w

結果の文字列を逆にします。

¥

新しい文字列が元の入力と等しいかどうかを確認し、結果をブール値として暗黙的に出力します。


くそおやっ(Y+2それは、少なくとも1バイトに短くすることができますように、私は感じて...
ETHproductions

1
...そしてそれができる::¥£%´JÃwx%y == x%-y
-ETHproductions

ああ、はい、その計算を2バイトに減らすためにいくつかの異なることを試みていました。
シャギー




2

Perl 6、32バイト

{$_ eq[~] $_ «%«(1+.comb...2)}

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

  • .comb入力引数の文字列表現の文字数$_(つまり、桁数)です。
  • 1 + .comb ... 2 は、桁数よりも1から2まで大きい数字のシーケンスです。
  • «%«は、$_左の入力引数が右のシーケンスの各要素で除算されるときに剰余を与えるモジュラスハイパー演算子です$_ % 2, $_ % 3, ...
  • [~]これらの数字を新しい数値に連結し、文字列等価演算子を使用して入力引数と比較しeqます。


2

Pyth、13バイト

Okxのおかげで-1バイト。

qsjk_m%QhdSl`

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

説明

             QQ    # Implicit input
          Sl`Q     # Generate [1, len(str(Q))]
     m%Qhd         # For digit d in above range, perform Q % (d + 1)
 sjk_              # Reverse, then convert to number
q             Q    # Test equality with input

代替ソリューション、まだ13バイト(karlkastorに感謝)

qi_.e%Q+2k`QT

オンラインでお試しください!それiは、数値の配列から数値への変換に使用すること、および範囲が異なる方法で生成されることを除いて、基本的に最初のソリューションと同じです。


1
で置き換えss`M_jk_2バイト節約できます。
Okx

@Okx必要なのjは文字列を出力するのに対し、入力と比較する数値(数値)が必要だからです。
ジム

1
別の13バイトの解決策は、マップの代わりにqi_.e%Q+2k`QT列挙マップ(.e)を使用することです。そして、結合を使用する代わりに、リストから残りをベース10 intに変換します。
カールカストール

2

C ++、104バイト

1)オリジナルバージョン:

int main(){int N,T,R=1;cin>>N;T=N;for(int i=1;i<=log10(N)+1;i++){if(N%(i+1)!=T%10){R=0;}T/=10;}cout<<R;}

2)読み取​​り可能な形式:

int main()
{
    int N, T, R = 1;

    cin >> N;
    T = N;

    for (int i = 1; i <= log10(N) + 1; i++)
    {
        if (N % (i + 1) != T % 10)
        {
            R = 0;
        }

        T /= 10;
    }

    cout << R;
}

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



1

パイソン266の60 58 57バイト

  • 6バイトの@Leaky修道女に感謝:不要なものを削除しますx and(0をチェックすべきではありません)
  • 1バイトの@Einkorn Enchanterに感謝します: enumerate
lambda x:all(a==`x%(i+2)`for i,a in enumerate(`x`[::-1]))

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



ありがとうございました。そしてねえ、私はあなたが小麦の魔法使いであることに気づきました。:D
officialaimm

1

Python 3:63バイト

lambda m:all(int(x)==m%(n+2)for n,x in enumerate(str(m)[::-1]))

「列挙」の回数を短くしたい場合は...

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


うん、そして、@ officialaimmが与えた答えとまったく同じであることに気付いた...削除すべきか?
ベンドル

それらはpython 2にあり、あなたは独立してそれを思いついたので、私はそれを残すでしょう。
小麦ウィザード

2で列挙を開始し、論理を再配置することで2バイトを節約できますlambda m:all(m%n==int(x)for n,x in enumerate(str(m)[::-1],2))
。– nocturama


1

Java 8、156 149バイト

interface B{static void main(String[]s){String f="";for(int i=1;i<=s[0].length();)f=new Long(s[0])%++i+f;System.out.print(f.equals(s[0]));}}

アンゴルフド:

interface B {
    static void main(String[] s) {
        String f = "";
        for (int i = 1; i <= s[0].length();)
            f = new Long(s[0]) % ++i + f;
        System.out.print(f.equals(s[0]));
    }
}

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

更新:
-7バイト:役に立たない削除され、-9バイトに{}置き換えられましInteger.parseInt(...)た:Kevin Cruijssenのおかげで、の代わりにとの代わりに使用される多数の役に立たないものを削除しました。ありがとうケビン!new Integer(...)
()LongIntegerprintprintln


1
いい答え、私からの+1。ところで、いくつかのゴルフに小さなもの:new Integer可能new Long(-3バイト)。(-2バイト)にprintlnすることができますprintnew Long(s[0])%i+f;(-4バイト)を囲む括弧を削除できます。
ケビンCruijssen

すごくいい !ありがとう、これを更新します!
アレックスフェレッティ



0

q / kdb +、34バイト

溶液:

{s~raze($)x mod'2+(|)(!)(#)s:($)x}

例:

q){s~raze($)x mod'2+(|)(!)(#)s:($)x}7211311 / this is a staircase number (true)
1b
q){s~raze($)x mod'2+(|)(!)(#)s:($)x}7211312 / this is not (false)
0b
q)t(&){s~raze($)x mod'2+(|)(!)(#)s:($)x}each t:1 + til 1000000 / up to a million
1 10 20 1101 1121 11311 31101 40210 340210

説明:

入力番号を文字列にキャストし、0..stringの長さから数え、すべてに2を加え、それを逆modにして、元の入力とともに各数値を入力します。modの結果を文字列にキャストし、リストを縮小し、入力番号の文字列と等しいかどうかを確認します。

{s~raze string x mod'2 + reverse til count s:string x} / ungolfed solution
{                                                    } / lambda function
                                           s:string x  / convert input to string, save as s
                                     count             / return length of this string
                                 til                   / like python's range() function
                         reverse                       / reverses the list
                     2 +                               / adds two to each element in the list
               x mod'                                  / ' is each both, so feeds x, and each element of the list to modulo function
        string                                         / converts output list to string list ("7";"2";"1"..etc)
   raze                                                / reduce list ("721...")
 s~                                                    / is s equal to this reduced list, returns boolean

ノート:

ほとんどの解決策は2,3,4..リストを生成するためのものです。より少ない処理を行う別の解決策がありますが、ゴルフ後に37バイトになります

{s~x mod'reverse 2 + til count s:("J"$) each string x} / ungolfed
{s~x mod'(|)2+til(#)s:("J"$)each($)x}                  / golfed

0

Clojure、75バイト

#(=(sort %)(sort(map(fn[i c](char(+(mod(Integer. %)(+ i 2))48)))(range)%)))

入力は文字列であり、使用するmapと末尾%for[i(range(count %))]アプローチよりも短くなります。


0

Haskell、62バイト

f x=and$zipWith(==)(reverse$show x)$map(head.show.mod x)[2..]

(無限の)モジュラスのリストを逆にする代わりに、整数xの逆の文字列表現でリストを圧縮することによりリストを切り捨てます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.