ホッピング番号


14

仕事

整数nを出力します。ここで12 <= n <= 123456789、およびn の連続する数字のすべてのペアは、それらの間で同じ正の差を持ちます(2469ではなく2468など)。

入力なし。

出力:

12
13
14
15
16
17
18
19
23
24
25
26
27
28
29
34
35
36
37
38
39
45
46
47
48
49
56
57
58
59
67
68
69
78
79
89
123
135
147
159
234
246
258
345
357
369
456
468
567
579
678
789
1234
1357
2345
2468
3456
3579
4567
5678
6789
12345
13579
23456
34567
45678
56789
123456
234567
345678
456789
1234567
2345678
3456789
12345678
23456789
123456789

ルール

  1. 標準の抜け穴が適用されます。
  2. 入力なし

最短のコードが勝ちます。

クレジット アナーキーゴルフ


8
この問題は無政府状態のゴルフに起因しています。(あなたがそれを提出した人であっても)クレジットを与える必要があります
xnor

5
順番に印刷する必要がありますか?
H.PWiz

11
私はこの問題をアナゴルに提出しました:)
Lynn

2
このリストのすべての整数が0≤n<100ではないのはなぜですか?
ドニエル

3
@DonielF整数は12以上である必要があり、前方差分は正でなければならないためです。
デニス

回答:


11

ゼリー12 11バイト

9œcḊẎIE$ÐfY

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

使い方

9œcḊẎIE$ÐfY  Main link. No arguments.

9            Set the argument and return value to 9.
   Ḋ         Dequeue; yield [2, ..., 9].
 œc          Take all k-combinations of [1, ..., 9], for each k in [2, ..., 9].
    Ẏ        Concatenate the arrays of k-combinations.
        Ðf   Filter the result by the link to the left.
     IE$         Compute the increments (I) of the combination / digit list and
                 tests if all are equal (E).
          Y  Join the results, separating by linefeeds.

ìà Find fastest route between two points using Dykstra's Algorithm
ニール

7

Python 2、81バイト

k=71
exec"k+=1;r=range(k/8%9+1,10,k%8+1)\nif r[k/72:]:print`r`[1:k/24+2:3]\n"*576

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

アナーキーゴルフからの私のソリューション。考えは、長さ、開始値、およびステップのすべての可能なトリプルを反復することで、ソートされた出力を提供します。三重値として符号化されるrから72647、およびコンポーネントは、次のように抽出されk/72k/8%9およびk%8k十分に高く開始すると、1桁の数字が出力されなくなります。

xsot は、をハードコードされた数字列に置き換えることにより、これから2バイト節約しました。range'123456789'

これは、2秒の実行時制限の制約の下で作成されました。数値を生成するのではなく、数値をフィルタリングするより遅い戦略は、より短いかもしれません。


1
おもしろい事実:この問題は実際、アナーキーゴルフランタイムの制限に合わせて「設計」されているため、PPCGに提出しませんでした。から1にループする提出物を失格にしたかったのですが123456789、代わりに、正しい(ソートされた)順序で正しい番号を生成するための賢い方法を答えに思い付かせました。
リン

6

C、166 152バイト

p,l,d,i=11;main(){for(char s[10];i<=1e9;){sprintf(s,"%d",++i);p=0;for(l=strlen(s);--l>0;){d=s[l]-s[l-1];if(!p)p=d;if(p^d|d<1)break;p=d;}if(!l)puts(s);}}

@KevinCruijssenのおかげで6バイト節約されました!

@JonathanFrechのおかげで8バイトが節約されました!

オンラインで試す

上記のコードの完全にフォーマットされたバージョンを以下に示します。

#include <string.h>
#include <stdio.h>

int main( void )
{
int prev_diff, diff, len;
int num = 11;
char str[10];

while(num<123456789)
    {
    prev_diff = 0;
    sprintf(str,"%d",++num);
    len = strlen(str)-1;
    for( ; len > 0; len-- )
        {
        diff = str[len] - str[len-1];
        if( prev_diff == 0 )
            {
            prev_diff = diff;
            }
        if( prev_diff != diff || diff < 1 )
            {
            break;
            }
        prev_diff = diff;
        }
    if ( len == 0 )
        {
        puts(str);
        }
    }
}

私は何かが欠けていない限り、べきではないwhile(i<123456789)ことがwhile(i<=123456789)課題範囲に応じ代わりに?:また、あなたは6つのバイトによってゴルフをすることができますp,l,d,i=11;main(){for(char s[10];i<=123456789;){sprintf(s,"%d",++i);p=0;for(l=strlen(s);--l>0;){d=s[l]-s[l-1];if(p<1)p=d;if(p^d|d<1)break;p=d;}if(l<1)puts(s);}}
ケビンCruijssen

@KevinCruijssen私は同意しますが、より高い値を選択することで1バイトの比較を使用し続けることができます。i<1e9
ジョナサンフレッチ

@KevinCruijssenまた、私が間違えていなければ、負の値に決して到達しないl<1ため!l、にゴルフできlます。
ジョナサンフレッチ

@JonathanFrechについての良い点i<1e9。そして!llいつ>=0CIを推測するのが妥当なように聞こえます(私自身はCでプログラミングしたことがありません)
ケビンCruijssen

@KevinCruijssen "i"はsprintf()でインクリメントされ、i == 123456788のときにループに入り、123456789のままにしておくことができます。これらの多目的forループと(l == 0 )->(l <1)最適化、おかげで:)
Jacobinski

5

ゼリー14、13のバイト

DIµEȧ>0Ȧ
Ç77#

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

@MrXcoderのおかげで1バイト節約できました!

これは非常に非効率的であるため、TIOでタイムアウトになりますが、完了した場合は正しい出力が生成されます。小さい番号で試してみることができます:オンラインで試してください!

説明:

            # Helper link:
            #
D           # The Digits of 'n'
 I          # The increments (deltas, differences) between digits
  µ         # Give that array as an argument to the rest of this link:
   E        # Are all elements equal?
    ȧ       #   AND
     >0     # Are all elements greater then 0?
       Ȧ    # And is there at least one element?
            # (in the differences, so that numbers < 10 are false)
            #
            # Main link:
            #
 77#        # Return the first 77 'n's for which
Ç           #   The helper link is truthy

1
あー それに私を打つ。+1
ケアードコインヘリングアーイング

$ヘルパーリンクの最後に必要はありません。
ミスターXcoder

これを行うより明確な方法はDIµ>0ȦȧE¶Ç77#
エリックアウトゴルファー

4

05AB1E、23バイト

•7=›ζ•FNS¥DËs0›PN11›&&–

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


•7=›ζ•7000に置き換えてTIOで終了するか、タイムアウトする前に「終了」ボタンを押すだけで、その時点までに数字が出力されます。


これを使用してみてください:žh
Okx

@Okx私はそれだけのサブではないですが、それがうまくいくとは思わない'0123456789'1357例えばまた、あなたが出力に必要な有効な数値です。
エリックアウトゴルファー

@EriktheOutgolfer私は交換する意味•7=›ζ•
Okx

@Okxは私が元々持っていたものですが、いくつかの奇妙なもの(?)理由がわからないので、私は一貫して動作するこれで終わりました。
魔法のタコUr

@MagicOctopusUrn開始時に0を削除してみませんか?
Okx

4

Mathematica、79バイト

Select[Range@123456789,Min[s=Union@Differences@IntegerDigits@#]>0&&Tr[1^s]==1&]

オンラインでお試しください!それは非常に遅いため、低い数値で

1秒ですべての数値を構築する別のアプローチがあります

Mathematica、123バイト

Union[FromDigits/@(F=Flatten)[Table[Partition[#,i,1],{i,2,9}]&/@Select[F[Table[Range[j,9,k],{j,9},{k,9}],1],Tr[1^#]>1&],2]]   


オンラインでお試しください!すぐにすべての数字


4

ハスク14 13バイト

ÖifȯεuẊ≠Ṗ…"19

改行で区切られた番号をSTDOUTに出力します。 オンラインでお試しください!

H.PWizからのインスピレーションのため、-1バイト。

説明

ÖifȯεuẊ≠Ṗ…"19
         …"19  The string "19" rangified: "123456789"
        Ṗ      Powerset: ["","1","2","12","3",...,"123456789"]
  fȯ           Filter by function: (input is sublist, say "2469")
      Ẋ≠        Consecutive codepoint differences: [2,2,3]
     u          Remove duplicates: [2,3]
    ε           Is it a one-element list? No, so "2469" is dropped.
Öi             Sort the result by integer value, implicitly print separated by newlines.


3

APL(Dyalog)37 28バイト

x/⍨{1=≢∪2-/⍎¨⍕⍵}¨x11+⍳1E9

オンラインでお試しください!(タイムアウトにより、より短い範囲で)

どうやって?

x←11+⍳123456789- 11, 12... 1e9x

¨ -それぞれ

    ⍎¨⍕⍵ -数字に分割

    2-/ -差分リストを取得

     -ユニークな要素を取得する

    1=≢ -長さ== 1?

x/⍨ -作成された範囲のマスクとしてこれを使用します

-そして列化



3

バッチ、210 200バイト

最適化が行われないため、非常に遅い-12345までは約25秒かかります。そのため、完全な出力を得るには、約3日間待つ必要があります。

@set z=@set/a
%z%c=12
:a
@echo %c%
:c
%z%c+=1&if %c%==123456790 exit/b
%z%n=c
%z%d=n%%10-n/10%%10
@if %d% leq 0 goto c
:d
%z%n=n/10
@if %n% leq 9 goto a
%z%e=n%%10-n/10%%10
@if %e%==%d% goto d
@goto c

3

Javaの8、169の 168 145バイト

v->{byte[]a;for(int i=9,d,l;++i<1e9;System.out.print(l<1?i+"\n":""))for(a=(i+"").getBytes(),d=0,l=a.length;--l>0&&d*(d^(d=a[l]-a[l-1]))<1&d>0;);}

@Jacobinski Cの回答のポート(少しゴルフをした後)。@Nevayの
おかげで-23バイト。

説明:

ここで試してみてください。(終わり近くで少し遅すぎるので、TIOに最終番号を出力しません。ただし、約20秒でローカルに最終番号を出力します。)

v->{                         // Method with empty unused parameter and no return-type
  byte[]a;                   //  Byte-array
  for(int i=9,               //  Index integer, starting at 9
          d,                 //  Difference-integer
          l;                 //  Length integer
      ++i<1e9;               //  Loop (1) from 10 to 1,000,000,000 (exclusive)
      System.out.print(      //    After every iteration: print:
        l<1?                 //     If `l` is 0:
         i+"\n"              //      The current integer + a new-line
        :                    //     Else:
         ""))                //      Nothing
    for(a=(i+"").getBytes(), //   Convert the current item as String to a byte-array
        d=0,                 //   Reset the previous integer to 0
        l=a.length;          //   Set `l` to the length of the byte-array
        --l>0                //   Inner loop (2) from `l-1` down to 0 (exclusive)
        &&d*(d^(d=a[l]-a[l-1]))<1
                             //    As long as the previous difference is either 0
                             //    or the current diff is not equal to the previous diff
        &d>0;                //    and the current diff is larger than 0
    );                       //   End of inner loop (2)
                             //  End of loop (1) (implicit / single-line body)
}                            // End of method

1
145バイト:v->{byte[]a;for(int i=9,p,l;++i<1e9;System.out.print(l<1?i+"\n":""))for(a=(i+"").getBytes(),p=0,l=a.length;--l>0&&p*(p^(p=a[l]-a[l-1]))<1&p>0;);}
Nevay

@Nevay breakなんとかしてそれをドロップしてforループチェックに追加できるはずだと思っていましたが、これは思いつきませんでした。;)ありがとう!
ケビンCruijssen

2

05AB1E、14バイト

TžhŸʒS¥D0›PsË&

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


私が持っていたことを除いて12žhŸʒS¥D0›PsË&、それは私が最初に持っていたものです、私はそれをローカルで実行させることができません。これを実際に実行できますか?
魔法のタコUr

私は前に番号を交換してみた場合@MagicOctopusUrn Ÿ、それが正常に動作
Okx

私はもう1つを、数字を置き換えずにローカルで実行するようにしましたが、これはまだできません。Idkの理由、私は本当に何がそんなに違うのか知りたいのです。
魔法のタコUr



2

JavaScript(Firefox 30-57)、105バイト

document.write(`<pre>`+(

_=>[for(x of s=`123456789`)for(y of s)for(z of s)if(x*z<10-y)s.replace(/./g,c=>c<y|(c-y)%z|c-y>x*z?``:c)]

)().join`\n`+`</pre>`);

2から10までの長さ(xは最後の文字のインデックスであるため、長さより1小さい)でループし、1から9までの数字を開始し、1から9までステップします。そのため、数字列から数字を除外して結果を生成します。


「コードスニペットの実行」はエラーにつながりますUncaught SyntaxError: Unexpected token for
。– schnaader

2
@schnaader Firefox 30以降で実行していますか?この回答では、Firefoxのみがサポートする非標準の配列内包構文を使用しています。
ビルジョラクセ

ああ、発言は見られなかった、ごめんなさい。Chromeで実行されていましたが、Firefoxで
正常に



1

JavaScript(ES6)、121バイト

ニールの答えほどではありませんが、投稿する価値はまだあると思いました。

'123456789'一致しないすべてのエントリが切り捨てられ、接頭辞が付いた場所のパワーセットを構築することで機能し0、結果を数値順にソートし、関連する77個のみを保持します。

_=>[...'123456789'].reduce((a,x)=>[...a,...a.map(y=>y[1]-y[0]+(y.slice(-1)-x)?'0':y+x)],['']).sort((a,b)=>a-b).slice(-77)

デモ


1

C(gcc)、106バイト

main(i,j,k,l){for(i=1;i<9;i++)for(j=8;j;j--)for(k=0;k<j/i;puts(""))for(l=0*k++;l<=i;)putchar(57-j+k*l++);}

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

改変されていない(プリティファイド)バージョン:

int main() {
  int length, start_with, max_step, step, nth;
  for (length = 2; length <= 9; length++) {
    for (start_with = 1; start_with < 9; start_with++) {
      max_step = (9 - start_with) / (length - 1);
      for (step = 1; step <= max_step; step++) {
        for (nth = 0; nth < length; nth++) {
          putchar('0' + start_with + step * nth);
        }
        puts("");
      }
    }
  }
  return 0;
}

1

JavaScript(ES6)、109 104バイト

可能なすべての数値を生成することにより動作します:8から1(変数i)の各増分をループし、8から1(変数)の各開始桁をjループし、jand 10-i(変数k)の間の各桁をループし、現在にt追加kして文字列を生成しますt。各ステップtで出力配列に追加されます。

(o=[],i=9)=>{while(--i){j=9;while(k=--j){t=""+k;while(k<10-i)o.push(t+=k+=i)}}return o.sort((a,b)=>a-b)}

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

f=

(o=[],i=9)=>{while(--i){j=9;while(k=--j){t=""+k;while(k<10-i)o.push(t+=k+=i)}}return o.sort((a,b)=>a-b)}

;
console.log(f().join("\n"))




0

JavaScript(ES6)、145バイト

ほとんど魔法のない単純なアプローチ。

Array(123456790).fill().map((x,i)=>(''+i).split('')).map((a,i,d) => {d=a[1]-a[0];d>0&a.every((n,j)=>j<1||n-a[j-1]==d)?console.log(a.join('')):0})

スニペットを実行すると、大量のメモリが消費されます...


0

PHP、85 84バイト

for(;++$d<9||++$a<9*$d=1;sort($r))for($x=$y=$a+1;10>$y+=$d;)$r[]=$x.=$y;print_r($r);

オンラインで試す

ソートのコストは17バイトです。このバージョンでは、異なる順序で結果が出力されます。

while(++$d<9||++$a<9*$d=1)for($x=$y=$a+1;10>$y+=$d;)echo"
",$x.=$y;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.