Nomor melompat


14

TUGAS

bilangan bulat cetak n, di mana 12 <= n <= 123456789, dan semua pasangan digit berturut-turut dalam n memiliki perbedaan positif yang sama di antara mereka (misalnya 2468 tetapi tidak 2469).

TANPA INPUT.

Keluaran:

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

Aturan

  1. Celah standar berlaku.
  2. tidak ada input

kode menang paling pendek.

Kredit golf anarki


8
Masalah ini berasal dari golf anarki . Anda harus memberikannya kredit (bahkan jika Anda adalah orang yang mengirimkannya)
xnor

5
Apakah mereka harus dicetak secara berurutan?
H.PWiz

11
Saya mengirimkan masalah ini pada anagol :)
Lynn

2
Mengapa tidak setiap bilangan bulat 0≤n <100 pada daftar ini?
DonielF

3
@DonielF Karena integer harus lebih besar dari atau sama dengan 12, dan karena perbedaan ke depan harus positif.
Dennis

Jawaban:


11

Jelly , 12 11 byte

9œcḊẎIE$ÐfY

Cobalah online!

Bagaimana itu bekerja

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
Neil

7

Python 2 , 81 byte

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

Cobalah online!

Solusi saya dari golf anarki. Idenya adalah untuk mengulangi semua tiga kali lipat panjang yang mungkin, nilai awal, dan langkah, yang memberikan hasil yang diurutkan. Triple dikodekan sebagai nilai rdari 72ke 647, dan komponen diekstrak sebagai k/72, k/8%9, dan k%8. Memulai kdengan cukup tinggi menghindari angka satu digit dari hasil.

xsot menyelamatkan dua byte dari ini dengan mengganti rangedengan serangkaian digit hardcoded '123456789'.

Ini ditulis di bawah batasan batas runtime dua detik. Strategi yang lebih lambat yang menyaring angka daripada menghasilkan ini mungkin lebih pendek.


1
Fakta menyenangkan: masalah ini sebenarnya "dirancang untuk" batas runtime golf anarki, itulah sebabnya saya tidak mengirimkannya ke PPCG. Saya ingin mendiskualifikasi pengulangan kiriman dari 1ke 123456789, alih-alih memaksakan jawaban untuk menghasilkan beberapa cara cerdas untuk menghasilkan angka yang benar dalam urutan yang tepat (diurutkan).
Lynn

6

C, 166 152 Bytes

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

6 byte disimpan berkat @KevinCruijssen!

8 byte disimpan berkat @JonathanFrech!

Cobalah online

Versi kode di atas yang sepenuhnya diformat dapat dilihat di bawah.

#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);
        }
    }
}

Kecuali aku kehilangan sesuatu, tidak harus while(i<123456789)menjadi while(i<=123456789)sebaliknya sesuai dengan rentang tantangan? Juga, Anda dapat golf dengan 6 byte: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);}}
Kevin Cruijssen

@KevinCruijssen saya akan setuju, meskipun orang kemungkinan besar tetap menggunakan perbandingan satu byte dengan memilih nilai yang lebih tinggi; i<1e9.
Jonathan Frech

@KevinCruijssen Juga, jika saya tidak salah, l<1bisa bermain golf !l, karena ltidak pernah mencapai nilai negatif.
Jonathan Frech

@ JonathanFrech Poin bagus tentang i<1e9. Dan !lketika lselalu >=0terdengar masuk akal untuk menebak CI (saya tidak pernah diprogram dalam C sendiri).
Kevin Cruijssen

@KevinCruijssen "i" bertambah dalam sprintf (), memungkinkan kita untuk mencapai memungkinkan kita untuk memasuki loop ketika saya == 123456788, dan biarkan dengan 123456789. Saya akan menambahkan multi-tujuan untuk loop dan (l == 0 ) -> (l <1) optimisasi, terima kasih :)
Jacobinski

5

Jelly , 14 , 13 byte

DIµEȧ>0Ȧ
Ç77#

Cobalah online!

Satu byte disimpan berkat @MrXcoder!

Ini sangat tidak efisien, jadi akan habis di TIO, tetapi jika selesai, itu akan menghasilkan output yang benar. Anda dapat mencobanya dengan angka yang lebih kecil di sini: Coba online!

Penjelasan:

            # 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
Ugh. Kalahkan aku untuk itu. +1
caird coinheringaahing

Anda tidak memerlukan $tautan pembantu di akhir.
Tn. Xcoder

Cara yang lebih jelas untuk melakukan ini adalahDIµ>0ȦȧE¶Ç77#
Erik the Outgolfer

4

05AB1E , 23 byte

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

Cobalah online!


Ganti •7=›ζ•dengan 7000 untuk menyelesaikannya di TIO, atau cukup tekan tombol "terminate" sebelum habis, menghasilkan angka yang dicetak hingga saat itu.


Coba gunakan ini:žh
Okx

@ OKK Saya tidak berpikir itu akan berhasil, itu bukan hanya substring '0123456789', 1357misalnya juga nomor yang valid yang Anda butuhkan untuk menghasilkan.
Erik the Outgolfer

@EriktheOutgolfer yang saya maksudkan diganti•7=›ζ•
Okx

@ OKx itulah yang saya miliki awalnya, tetapi menyebabkan beberapa hal aneh (?). Tidak tahu mengapa, jadi saya berakhir dengan ini, yang bekerja secara konsisten.
Magic Octopus Mm

@MagicOctopusUrn Mengapa Anda tidak mencoba menghapus 0 di awal?
Okx

4

Mathematica, 79 byte

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

Cobalah online! dengan angka yang lebih rendah karena sangat lambat

di sini adalah pendekatan lain yang membangun semua angka dalam 1sec

Mathematica, 123 byte

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


Cobalah online! semua angka dalam satu detik


4

Sekam , 14 13 byte

ÖifȯεuẊ≠Ṗ…"19

Mencetak angka yang dipisahkan baris baru ke STDOUT. Cobalah online!

-1 byte karena inspirasi dari H.PWiz.

Penjelasan

Ö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 byte

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

Cobalah online! (dengan rentang yang lebih pendek, karena batas waktu)

Bagaimana?

x←11+⍳123456789- 11, 12... 1e9ke dalamx

¨ - untuk setiap

    ⍎¨⍕⍵ - membobol angka

    2-/ - dapatkan daftar perbedaan

     - dapatkan elemen unik

    1=≢ - length == 1?

x/⍨ - gunakan ini sebagai topeng pada rentang yang dibuat

- dan membuat kolom



3

Batch, 210 200 byte

Tidak ada optimasi, jadi sangat lambat - membutuhkan waktu sekitar 25 detik hingga 12345, jadi untuk output lengkap Anda harus menunggu sekitar 3 hari.

@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 byte

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

Pelabuhan @ Jacobinski C menjawab (setelah saya sedikit ).
-23 byte berkat @Nevay .

Penjelasan:

Coba di sini. (Ini agak terlalu lambat menjelang akhir, jadi tidak mencetak angka terakhir pada TIO. Namun mencetak angka akhir secara lokal dalam waktu sekitar 20 detik.)

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 byte: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

@Nay, saya tahu seharusnya bisa menjatuhkan itu breakdan menambahkannya ke cek for-loop, tapi ini saya tidak akan muncul dengan diri saya sendiri. ;) Terima kasih!
Kevin Cruijssen

2

05AB1E , 14 byte

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

Cobalah online!


Itulah yang awalnya saya miliki, kecuali saya miliki 12žhŸʒS¥D0›PsË&, saya tidak bisa menjalankannya secara lokal. Bisakah Anda membuat ini benar-benar dieksekusi?
Magic Gurita Guci

@ MagicOctopusUrn Jika saya mencoba mengganti angka-angka sebelumnya Ÿ, berfungsi dengan baik
Okx

Saya punya yang lain untuk dijalankan secara lokal tanpa mengganti angka, tapi ini saya masih tidak bisa. Idk kenapa, aku hanya benar-benar ingin tahu apa yang begitu berbeda.
Magic Octopus Guci


2

Python 2 , 76 75 byte

n=9
while n<2e8:
 n+=1
 if`n`in`range(n%10,0,~n%100%11-11)`[-2::-3]:print n

Memakan waktu sekitar 3 menit secara lokal.

Cobalah online! (dimodifikasi untuk mencetak semua angka kecuali yang terakhir)


2

JavaScript (Firefox 30-57), 105 byte

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>`);

Panjang loop dari 2 hingga 10 (x adalah indeks karakter terakhir dan oleh karena itu 1 kurang dari panjang), mulai digit dari 1 hingga 9 dan langkah 1 hingga 9, kemudian filter pada digit akhir menjadi kurang dari 10 dan jika jadi hasilkan dengan memfilter digit dari string digit.


"Jalankan cuplikan kode" mengarah ke kesalahan:Uncaught SyntaxError: Unexpected token for
schnaader

2
@ schnaader Apakah Anda menjalankannya di Firefox 30+? Jawaban ini menggunakan sintaks pemahaman array non-standar yang hanya didukung oleh Firefox.
Birjolaxew

Ah, tidak melihat komentar itu, maaf untuk itu. Berjalan di Chrome, berjalan dengan baik di Firefox
schnaader



1

JavaScript (ES6), 121 byte

Tidak sependek jawaban Neil , tapi kupikir itu masih layak untuk dikirim.

Bekerja dengan membangun seperangkat Poweret di '123456789'mana semua entri yang tidak cocok dipotong dan diawali dengan 0, mengurutkan hasil dalam urutan numerik dan hanya menyimpan 77 entri yang relevan.

_=>[...'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)

Demo


1

C (gcc) , 106 byte

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++);}

Cobalah online!

Versi ungolfed (cantik):

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 byte

Bekerja dengan menghasilkan semua angka yang mungkin: loop melalui setiap kenaikan dari 8 ke 1 (variabel i), loop melalui setiap digit awal dari 8 ke 1 (variabel j), loop melalui setiap digit antara jdan 10-i(variabel k) dan menghasilkan string tdengan menambahkan kke arus t. Pada setiap langkah tditambahkan ke array output.

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

Cobalah online!

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 byte

Pendekatan lurus ke depan dengan sedikit sihir.

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

Menjalankan cuplikan akan menghabiskan banyak memori ...


0

PHP, 85 84 byte

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

coba online .

biaya penyortiran 17 byte. Versi ini mencetak hasil yang dipesan secara berbeda:

while(++$d<9||++$a<9*$d=1)for($x=$y=$a+1;10>$y+=$d;)echo"
",$x.=$y;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.