กระโดดหมายเลข


14

งาน

พิมพ์จำนวนเต็ม n, ที่ไหน12 <= n <= 123456789และทุกคู่หลักติดต่อกันใน n มีความแตกต่างในเชิงบวกระหว่างพวกเขา (เช่น 2468 แต่ไม่ 2469)

ไม่มีอินพุต

เอาท์พุท:

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
ฉันส่งปัญหานี้ใน anagol :)
ลินน์

2
ทำไมไม่ทุกจำนวน 0 0n <100 ในรายการนี้
DonielF

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
Neil

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จาก72ไป647และองค์ประกอบที่จะถูกแยกเป็นk/72, และk/8%9 k%8การเริ่มต้นkสูงพอที่จะหลีกเลี่ยงตัวเลขหลักเดียวจากการส่งออก

xsot บันทึกไบต์ที่สองนี้ออกโดยการแทนที่rangeด้วยสตริง hardcoded '123456789'ของตัวเลข

สิ่งนี้ถูกเขียนภายใต้ข้อ จำกัด ของขีด จำกัด รันไทม์สองวินาที กลยุทธ์ที่ช้ากว่าซึ่งกรองตัวเลขแทนที่จะสร้างสิ่งเหล่านี้อาจสั้นกว่า


1
สนุกจริง: ปัญหานี้จริง ๆ แล้ว“ ออกแบบมาเพื่อ” ขีด จำกัด รันไทม์ของกอล์ฟอนาธิปไตยซึ่งเป็นสาเหตุที่ฉันไม่ได้ส่งให้ PPCG ฉันต้องการตัดสิทธิ์การส่งที่วนลูปจาก1ไปที่123456789, แทนที่จะบังคับให้คำตอบหาวิธีที่ชาญฉลาดในการสร้างตัวเลขที่ถูกต้องในลำดับที่ถูกต้อง (เรียงลำดับ)
Lynn

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

บันทึกไปแล้ว 6 ไบต์ด้วย @KevinCruijssen!

บันทึก 8 ไบต์ด้วย @JonathanFrech!

ลองออนไลน์

รุ่นที่จัดรูปแบบครบถ้วนของโค้ดด้านบนสามารถดูได้จากด้านล่าง

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

@KevinCruijssen ฉันจะเห็นด้วยแม้ว่าคนส่วนใหญ่จะสามารถใช้การเปรียบเทียบแบบหนึ่งไบต์โดยเลือกค่าที่สูงกว่า i<1e9.
Jonathan Frech

@KevinCruijssen นอกจากนี้หากฉันไม่เข้าใจผิดl<1สามารถเล่นกอล์ฟได้!lเพราะlไม่ถึงค่าลบ
Jonathan Frech

จุด @JonathanFrech i<1e9ดีเกี่ยวกับ และ!lเมื่อlใดที่>=0ฟังดูสมเหตุสมผลแล้วสำหรับ CI เดา (ฉันไม่เคยตั้งโปรแกรมด้วยตัวเอง C)
Kevin Cruijssen

@KevinCruijssen "i" เพิ่มขึ้นเป็น sprintf () ช่วยให้เราเข้าถึงวงเมื่อ i == 123456788 และทิ้งไว้กับ 123456789 ฉันจะเพิ่มอเนกประสงค์สำหรับลูปและ (l == 0 ) -> (l <1) การปรับให้เหมาะสมขอบคุณ :)
Jacobinski

5

เจลลี่ , 14 , 13 ไบต์

DIµEȧ>0Ȧ
Ç77#

ลองออนไลน์!

บันทึกหนึ่งไบต์ด้วย @MrXcoder!

นี่เป็นสิ่งที่ไม่มีประสิทธิภาพมากดังนั้นมันจะหมดเวลากับ 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
caird coinheringaahing

คุณไม่จำเป็นต้องใช้$ในตอนท้ายของลิงค์ช่วยเหลือของคุณ
Mr. Xcoder

วิธีที่ชัดเจนในการทำเช่นนี้คือDIµ>0ȦȧE¶Ç77#
Erik the Outgolfer

4

05AB1E , 23 ไบต์

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

ลองออนไลน์!


แทนที่•7=›ζ•ด้วย 7000 เพื่อให้เสร็จใน TIO หรือเพียงกดปุ่ม "ยุติ" ก่อนที่จะหมดเวลาส่งผลให้ตัวเลขที่พิมพ์จนถึงจุดนั้น


ลองใช้สิ่งนี้:žh
Okx

@Okx ผมไม่คิดว่าจะทำงานมันไม่ใช่แค่ย่อยของ'0123456789', 1357ตัวอย่างยังเป็นตัวเลขที่ถูกต้องคุณจะต้องเอาท์พุท
Erik the Outgolfer

@EriktheOutgolfer ฉันหมายถึงการแทนที่•7=›ζ•
Okx

@Okx นั่นคือสิ่งที่ฉันมี แต่เดิมมันทำให้บางสิ่งแปลก ๆ (?) ไม่รู้เลยว่าทำไมฉันจึงลงเอยด้วยสิ่งนี้ซึ่งทำงานอย่างสม่ำเสมอ
Magic Octopus Urn

@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

Husk , 14 13 ไบต์

ÖifȯεuẊ≠Ṗ…"19

พิมพ์ตัวเลขที่คั่นด้วยบรรทัดใหม่ไปที่ STDOUT ลองออนไลน์!

-1 ไบต์เนื่องจากแรงบันดาลใจจาก H.PWiz

คำอธิบาย

Ö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... 1e9เข้าx

¨ - แต่ละ

    ⍎¨⍕⍵ - แบ่งเป็นตัวเลข

    2-/ - รับรายการความแตกต่าง

     - รับองค์ประกอบที่เป็นเอกลักษณ์

    1=≢ - ความยาว == 1?

x/⍨ - ใช้สิ่งนี้เป็นหน้ากากในช่วงที่สร้างขึ้น

- และทำให้เป็นคอลัมน์



3

แบตช์210 200 ไบต์

ไม่มีการปรับให้เหมาะสมช้ามาก - ใช้เวลาประมาณ 25 วินาทีจนถึง 12345 ดังนั้นสำหรับการส่งออกที่สมบูรณ์คุณต้องรอประมาณ 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 คำตอบ (หลังจากฉันเล่นกอล์ฟไปนิดหน่อย)
-23 ไบต์ขอบคุณที่@Nevay

คำอธิบาย:

ลองที่นี่ (มันใกล้จะสิ้นสุดช้าเกินไปดังนั้นอย่าพิมพ์หมายเลขสุดท้ายบน 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;);}
2560

@Nevay ฉันรู้ว่ามันควรจะสามารถวางที่breakใดและเพิ่มลงในการตรวจสอบสำหรับวง แต่นี่ฉันจะไม่ได้เกิดขึ้นกับตัวเอง ;) ขอบคุณ!
Kevin Cruijssen

2

05AB1E , 14 ไบต์

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

ลองออนไลน์!


นั่นคือสิ่งที่ฉันมีในตอนแรกยกเว้นว่าฉันมี12žhŸʒS¥D0›PsË&ฉันไม่สามารถให้มันทำงานในพื้นที่ได้ คุณจะได้รับสิ่งนี้เพื่อดำเนินการจริงหรือไม่?
Magic Octopus Urn

@MagicOctopusUrn หากฉันลองเปลี่ยนตัวเลขก่อนหน้าŸนี้มันใช้งานได้ดี
Okx

ฉันทำให้คนอื่นวิ่งในท้องถิ่นโดยไม่ต้องเปลี่ยนตัวเลข แต่ก็ยังทำไม่ได้ Idk ทำไมฉันแค่อยากรู้ว่าอะไรแตกต่างกัน
Magic Octopus Urn

2

Python 2 , 103 97 95 ไบต์

-2 ไบต์ขอบคุณ @JonathanFrech

n=11
while n<1e9:
 n+=1;Q=`n`[1:]
 if`n`<Q>1==len({int(a)-int(b)for a,b in zip(`n`,Q)}):print n

ลองออนไลน์!


108 ไบต์หรือ106 ไบต์ที่หน่วยความจำไม่เพียงพอ แต่สามารถทดสอบด้วยตัวเลขที่ต่ำกว่า
Rod

95 ไบต์ ; `n`[1:]ใช้ตัวแปรสำหรับซ้ำแล้วซ้ำอีก
Jonathan Frech


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 จากนั้นจึงกรองที่ตำแหน่งสิ้นสุดน้อยกว่า 10 และถ้า ดังนั้นสร้างผลลัพธ์โดยการกรองตัวเลขจากสตริงหลัก


"เรียกใช้ข้อมูลโค้ด" ทำให้เกิดข้อผิดพลาด:Uncaught SyntaxError: Unexpected token for
schnaader

2
@schnaader คุณใช้งานใน Firefox 30+ หรือไม่ คำตอบนี้ใช้ไวยากรณ์ความเข้าใจของอาร์เรย์ที่ไม่ได้มาตรฐานซึ่งรองรับเฉพาะ Firefox เท่านั้น
Birjolaxew

อ๊ะไม่เห็นคำพูดขอโทษสำหรับสิ่งนั้น ทำงานใน Chrome ทำงานได้ดีใน Firefox
schnaader

1

Pyth , 21 ไบต์

ท่าเรือวิธีการที่ชาญฉลาดของเดนนิส

jjLkf!t{.+Tsm.cS9dtS9

ลองที่นี่!

Pyth , 23 ไบต์

j.f&!tl{K.+jZT*F>R0K77T

การล่ามออนไลน์หมดเวลา แต่จะใช้ได้หากมีเวลาและหน่วยความจำเพียงพอ

ลองมันออนไลน์ที่มีจำนวนลดลง



1

JavaScript (ES6), 121 ไบต์

ไม่สั้นเกือบเท่าคำตอบของนีลแต่ฉันคิดว่ามันก็คุ้มค่าที่จะโพสต์

ทำงานโดยการสร้าง powerset '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++);}

ลองออนไลน์!

รุ่น ungolfed (prettified):

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) วนรอบแต่ละหลักระหว่างjและ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.