Перестрибуючі числа


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
Я подав цю проблему в анаголі :)
Лін

2
Чому в цьому списку не кожне ціле число 0≤n <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
Ніл

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 рядок цифр'123456789' .

Це було написано під обмеженням двох секунд тривалості виконання. Більш повільна стратегія, яка фільтрує числа, а не створює їх, може бути коротшою.


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

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)замість цього відповідати діапазону викликів? Крім того, ви можете 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);}}
пограти в

@KevinCruijssen Я погодився б, хоча, швидше за все, можна продовжувати використовувати однобайтове порівняння, вибравши більш високе значення; i<1e9.
Джонатан Фрех

@KevinCruijssen Крім того, якщо я не l<1помиляюся , можна пограти в гольф !l, оскільки lніколи не досягає негативного значення.
Джонатан Фрех

@JonathanFrech Добре про те i<1e9. І !lколи lце завжди >=0здається розумним для CI здогадуються (я ніколи не програмував себе на C).
Кевін Круїйсен

@KevinCruijssen "i" збільшується в sprintf (), що дозволяє нам досягти, щоб ми могли ввести цикл, коли i == 123456788, і залишити його з 123456789. Я додаю ці багатоцільові для циклів і (l == 0 ) -> (l <1) оптимізація в, дякую :)
Якобінський

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

Вам не потрібно $в кінці вашого помічника.
Містер 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 це те, що у мене було спочатку, але це викликає деякі дивні речі (?). Не маю ідеї чому, тому я закінчив це, що працював послідовно.
Чарівна восьминога урна

@MagicOctopusUrn Чому ви не спробуйте зняти 0 на початку?
Оккс

4

Математика, 79 байт

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

Спробуйте в Інтернеті!з меншим числом, тому що це дуже повільно

ось ще один підхід, який будує всі числа в 1сек

Математика, 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. Спробуйте в Інтернеті!

-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 (Діалог) , 37 28 байт

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

Спробуйте в Інтернеті! (із меншим діапазоном, із-за тайм-ауту)

Як?

x←11+⍳123456789- 11, 12... 1e9вx

¨ - для кожного

    ⍎¨⍕⍵ - розбити на цифри

    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 відповідь (після того, як я його трохи пограв у гольф).
-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;);}
Невай

@Nevay Я знав, що слід це breakякось упустити і додати до перевірки for-loop, але цього я б сам не придумав. ;) Спасибі!
Kevin Cruijssen

2

05AB1E , 14 байт

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

Спробуйте в Інтернеті!


Ось що я мав спочатку, крім того, що я мав 12žhŸʒS¥D0›PsË&, я не можу змусити його працювати локально. Ви можете змусити це реально виконати?
Magic Octopus Urn

@MagicOctopusUrn Якщо я спробую замінити номери раніше Ÿ, це працює добре
Okx

Я змусив свого іншого працювати локально без заміни номерів, але цього досі не можу. Хоча я просто хочу знати, що таке інше.
Magic Octopus Urn

2

Пітон 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 байт, у яких не вистачає пам’яті, але їх можна перевірити з меншими цифрами
стрижень

95 байт ; використовуючи змінну для повторного `n`[1:].
Джонатан Фрех


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

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), циклів через кожну цифру між 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 bytes

A straight-forward approach with little magic.

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

Running the snippet will consume a lot of memory...


0

PHP, 85 84 bytes

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

try it online.

sorting cost 17 bytes. This version prints the results ordered differently:

while(++$d<9||++$a<9*$d=1)for($x=$y=$a+1;10>$y+=$d;)echo"
",$x.=$y;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.