50,000未満のスネーキング番号のリストを作成します


24

スネークナンバーチャレンジ

1〜50,000のスネークナンバーがいくつあるのだろうか。

ノキアのヘビ

このゲームのスネーキング番号は、1つのキーを上下左右に動かすことにより、従来の番号パッド(下の形式)で入力できる番号です。

7 8 9
4 5 6
1 2 3
 0

たとえば、5番から始める場合、次の有効な移動として4、6、8、または2を選択できますが、7、3、9、および1は現在のキーに対して斜めに配置されるため、立ち入り禁止です。したがって、5、2の場合、次に実行可能なキーの選択肢は0、1、3、または5です。

このコードゴルフの演習では、1〜50kの正のスネーキング数のリストと、基準を満たすすべての数の最終カウントを出力します。

ルール

  1. 数字をゼロから始めることはできません。
  2. 数値は正の整数でなければなりません。
  3. 左から右に読むそれぞれの連続した数字は、数字パッドの周りに「蛇」しなければなりません。
  4. ヘビはキーを斜めに移動できません
  5. 番号0は、番号1と2の両方からアクセスできます。
  6. 番号をペアにすることはできません(例:22)

有効なスネーキング番号の例:

12369
45201
1254
10102
1
12
987

無効な番号の例

1238 - 8 is not connected
0001 - multiple leading 0s
0101 - leading 0
159  - snake cannot travel diagonally
4556 - duplicate 5

通常のコードゴルフによると、目標は最小バイトです!

私の数学とルールによれば、リストには670個の有効なスネーキング番号があり、さらに最後の番号として670自体が印刷されているはずです。


2
出力をソートする必要がありますか?または、それは任意の順序で許可されていますか?
tsh

2
固定された有限の整数セットを出力するように求めているのを見て、仕様に完全なリストを含めることをお勧めします。
シャギー


4
これはA215009のサブセットです。
bigyihsuan

最初に 670を印刷しても大丈夫でしょうか?
ダナ

回答:


14

K(ngn / k)60 57バイト

(x;#x:{*/1=3!5&+/x*x:+1_-':(+0 1,'2*!3 3)@10\x}#1+!50000)

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

!500000..のリスト49999

1+ すべてに1を追加

{ }# 関数でフィルター { }

10\x 引数の10進数

( )@ のインデックスとして使用...

  • !3 3 リストのペア: (0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)

  • 2* すべてを2倍する

  • 0 1,'先頭に追加0最初のリストにし、1第二に

  • +転置(リストのペア->ペアのリスト)。これにより、おおよそのボタン座標が得られます。

-':各ペアから前のペアを引きます。0 0最初の前に虚数要素として使用します。

1_ 最初のドロップ

+ 転置

x*x:正方形(に割り当ててxで乗算x)。ここxにリストがあります-∆xsと∆ys

+/ 2つのリストの合計(要素ごと)

5& 5分で

3! mod 3

1= 1に等しい場所のブールリスト

*/ 製品(ブール値 "and")

(x;#x: )結果と結果の長さ(#)のペアを作成します


9

ゼリー 24  23 バイト

5ȷ4µDo1.’d3ZIASĊ’ẸµÐḟṄL

すべての結果と結果の数のリストを印刷する完全なプログラム。

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

どうやって?

5ȷ4µDo1.’d3ZIASĊ’ẸµÐḟṄL - Main Link: no arguments
5ȷ4                     - 5*10^4 = 50000
   µ              µÐḟ   - filter discard those for which this is truthy:
                        -                  e.g.: 8520        ... or           4559 
    D                   -   decimal digits       [8,5,2,0]                    [4,5,5,9]
      1.                -   literal 1.5
     o                  -   logical OR           [8,5,2,1.5]                  [4,5,5,9]
        ’               -   decrement            [7,4,1,0.5]                  [3,4,4,8]
         d3             -   div-mod by 3         [[2,1],[1,1],[0,1],[0,0.5]]  [[1,0],[1,1],[1,1],[2,2]]
           Z            -   transpose            [[2,1,0,0],[1,1,1,0.5]]      [[1,1,1,2],[0,1,1,2]]
            I           -   deltas               [[-1,-1,0],[0,0,-0.5]]       [[0,0,1],[1,0,1]]
             A          -   absolute value       [[1,1,0],[0,0,0.5]]          [[0,0,1],[1,0,1]]
              S         -   sum (vectorises)     [1,1,0.5]                    [1,0,2]
               Ċ        -   ceiling              [1,1,1]                      [1,0,2]
                ’       -   decrement            [0,0,0]                      [0,-1,1]
                 Ẹ      -   any?                 0 (i.e. keep)                1 (i.e. discard)
                     Ṅ  - print and yield
                      L - length
                        - implicit print

これがどのように機能するかを知りたいです。故障する可能性はありますか?
MightBeAlon

1
@MightBeAlonは後で行います...
ジョナサンアラン

私は興味がありますが、どのように1.評価し1.5ますか?
無知の具体化

@EmbodimentofIgnoranceは、ピリオドが5として扱われた後、欠落している数字をリテラルで解析している間。interacter.pyのparse_literalの最後のelse節を
Jonathan Allan


7

Python 2、101バイト

print[n for n in range(1,50000)if all(`n`[i:i+2]in`0x20b33ec8bc49a10589e76b15`for i in range(4))],670

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

16進数は10進数で10120214525632365878969854741、互いに隣接して表示される可能性のあるすべての順序付けられた数字のペアをエンコードします。


5

JavaScript(V8) 112 106 バイト

@NahuelFouilleulのおかげで2バイト節約

完全なプログラム。

for(n=0;++n<5e4;)[...n+''].every(x=>'6589632145201478'.match(x+p+'|'+p+(p=x)),p='')&&print(n)
print(670)

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

または、逆の順序で数値を出力できる場合は96バイト

for(n=5e4;n--;)[...n+''].every(x=>'6589632145201478'.match(x+p+'|'+p+(p=x)),p='')&&print(n||670)

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


また、最後の除去に動作3するので、多分36文字列にすでにある
ナウエルFouilleul

@NahuelFouilleul良いキャッチ。ありがとう!
アーナルド

1
また6589632145201478、1バイト短くなります
Nahuel Fouilleul

4

スタックス37 35 バイト

ü╞╡~▄ⁿ♪eµïê◙ü╔ï▼ΔJr¥æ≤PH╟♀I♣Δz8─¶Γ╞Ç▓

staxlang.xyzで実行してデバッグしてください!

それはそうでなかったまで、それはとても素晴らしく、短かった。

開梱(42バイト)および説明

49999{E2B{{om"#qYY>!(AFI"%A|E2B{{om-C_Qf%p
49999{                                 f      Filter range [1..49999]:
      E2B                                       All adjacent pairs of digits
         {{om                                   Each sorted
             "#qYY>!(AFI"%A|                    Literal 2012365478963258741
                            E2B{{om             Pairs of digits, each sorted
                                   -            Set difference
                                    C           Cancel block execution if any remain
                                     _Q         Print current value
                                        %p    Print length

2012365478963258741はキーパッドをエンコードします。隣接する数字のペアを見てください。おそらく、ペアごとに両方向に行く適切な短い選択肢を得ることができれば、8バイトをカットすることができます{{om

末尾の670がなければ、単純なフィルターで十分です:f..!ではなく{..C_Qf%p。この不規則性を処理するためのより良い方法があるかもしれません。どちらの場合でも、このフィルター範囲の動作は文書化されていません。


ドキュメントのギャップについては申し訳ありません。FWIW、それは次のリリース、1.1.7にあります。プレビューはstax.tomtheisen.comで見ることができますが、秘密なので誰にも教えないでください。;)
再帰

3

PHP、145バイト

for(;$i++<5e4;$f&&print$i._)for($f=1,$l=b;''<$d=("$i")[$$i++];$l=$d)$f&=$l>a||strstr([12,240,1053,26,157,2468,359,48,579,68][$l],$d)>'';echo 670;

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

1から50,000までのすべての数字について、その数字のすべての数字を左から右にチェックします。すべての数字が前の数字の有効な数字のリストにある場合、その数字が出力されます。実際にカウントするよりもバイト数が少ないため、最後にハードコードされた670を出力します。


3

05AB1E、23バイト

ŽÅKLʒSÌYX;:3‰üαï€OP}=g=

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

ポート・オブ・ジョナサン・アランのジェリー回答


1
ああ、5バイトを3バイトで圧縮するだけです。私が使用していたとき、₄50*または4°5*以前に試行したとき。そして、最初に私にあなたが持っていた理由は混乱していた€OPだけではなくOP、その後私は(後に空のリストであることの1桁の数を実現üα)次のようになり[] → 0 → 0代わりに[] → [] → 1。:)
ケビンクルーッセン

1
@KevinCruijssen 4°5*いつできるの5°;?ZAKの方が好きです。ええ、1桁の数字のエッジケースは苦痛です。
グリムミー


3

JavaScript(SpiderMonkeyの)179の 173 151 129バイト

[12,240,1350,26,157,2468,359,48,579,68].map((_,i,l)=>i&&(f=(v,t)=>print(v)|v<5e3&&[...l[t]+''].map(k=>f(v+k,k)))(i,i)),print(670)

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

Arnauldに感謝-22バイトdanaに感謝-22バイト

説明:

[12,240,1350,26,157,2468,359,48,579,68] 
// an array where keys are current position and values, the possible destinations
.map((_,i,l)=>                    // loop over it
    i&&(                          // if key is not 0
        f=(v,t)=>                 // create a function
                 print(v)|        // which print the value
                          v<5e3&& // and if the limit is not attained
                                 [...l[t]+''].map(k=>f(v+k,k)) 
                    // recurcively call itself with for each destinations
                                                              )(i,i)),
                    // make the first call with each digit
print(670) // finally print 670

@danaは、670を最初に印刷できる場合、123バイトのソリューションも提供しました。

[21,420,5310,62,751,8642,953,84,975,86].map((_,i,a)=>(f=(v,t)=>print(i?v:640)|i&v<5e3&&[...a[t]+''].map(k=>f(v+k,k)))(i,i))

@Arnauldは、私は、このルールを忘れて感謝
jonatjanoを


129
ダナ

640を最初に印刷できる場合は123
ダナ


2

スタックス28 26 バイト

Δh┤♣É╦&·é╝n$K»à¶▲v═NÆ;↨m≥8

実行してデバッグする

開梱されていない、コメントされていない、これはこのように見えます。

G               Call to unbalanced trailing '}', then resume here
670P            Print 670
}               Call target
219J            219 squared (47961)
f               Filter 1-based range by the rest of the program; implicitly output
  $2B           Convert to string and get adjacent pairs; e.g. 213 -> ["21", "13"]
  O             Push 1 under list of pairs
  F             Iterate over pairs, using the rest of the program
    o           Order each pair; e.g. "21" -> "12"
    "{<f:[/T8Z" string literal with code points [123 60 102 58 91 47 84 56 90]
    $           concate as string i.e. "12360102589147845690"
    s#          How many times does the current pair appear in the constant string?
    *           Multiply this by running total.  Any zero will cause the result to be zero.

これを実行する

秘密のソースは文字列リテラルにあり"{<f:[/T8Z"ます。すべてのコードポイントをまとめてジャムすると、が得られ12360102589147845690ます。この文字列の昇順のペアは、有効な蛇の動きです。


1
15JJ代わりに219J同様に動作しますが、に1バイトの定数がない限り、そこから任意のバイトをゴルフできるとは思いません15
アーナウルド


1

、42バイト

≔ΦI…·¹×⁵⁰φ⬤ι№”)¶∧XRτ_ΠGêR⁵m⎇λ”✂ιμ⁺²μ¹θθILθ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

≔ΦI…·¹×⁵⁰φ

以下からの包括的な範囲を処理1する50,000文字列へのキャスト。

⬤ι№”)¶∧XRτ_ΠGêR⁵m⎇λ”✂ιμ⁺²μ¹θ

圧縮された文字列に含まれていない数字のペアを持つものを除外します01478963202125458565236987410

θILθ

残りの配列とその長さを出力します。



1

Perl 6、64バイト

{670,grep {[+&](:36<12HGX91H8VCL3MG0FDVQ>X+>m:ov/../)%2},1..5e4}

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

説明

{670,grep {...},1..5e4}  # Meet questionable output requirements

# Actual decision problem

     :36<12HGX91H8VCL3MG0FDVQ>  # Bit field of allowed transitions
                                # encoded in base 36
                                 m:ov/../  # All 2-digit substrings
                              X+>  # Right shift by each substring
                                   # (implicitly converted to an integer)
[+&](                                    )  # Binary and
                                          %2  # Modulo 2

それは残念だ~>そうしないと、ビットフィールドが文字列であることで、単なる文字列演算子でこれを行うことができるかもしれない、まだ実装されていません
ジョー・キング

1

Pyth68 65 45バイト

l
f.Am}dCtB+J`65874589632012541_PJCtB`TS50000

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

修正されたルックアッププロセスのインスピレーションは、Khuldraeseth na'BaryaのStax answerから来ました。


編集2:大量のバイトを保存するために書き直した、以前のバージョン:

l
f.Am}ed@c"12 024 0135 26 157 2468 359 48 579 68";shdCtB`TS50000

編集:文字列検索を使用して3バイトをゴルフ、以前のバージョン:

l
f.Am}ed@sMMc"12 024 0135 26 157 2468 359 48 579 68";hdCtBjT;S50000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.