Atlamalı sayılar


14

GÖREV

n 12 <= n <= 123456789nolu baskı tamsayıları ve n'deki tüm ardışık basamak çiftleri aralarında aynı pozitif farka sahiptir (örneğin 2468, ancak 2469 değil).

GİRİŞ YOK.

Çıktı:

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

kurallar

  1. Standart boşluklar geçerlidir.
  2. giriş yok

en kısa kod kazanır.

Kredi anarşi golf


8
Bu sorun anarşi golfünden . Kredi vermelisiniz (gönderen kişi siz olsanız bile)
xnor

5
Sırayla basılmaları gerekiyor mu?
H.PWiz

11
Bu sorunu anagolde gönderdim :)
Lynn

2
Neden her listedeki 0 inten <100 tamsayıları yok?
DonielF

3
@DonielF Çünkü tamsayı 12'den büyük veya ona eşit olmalı ve ileri farklar pozitif olmalıdır.
Dennis

Yanıtlar:


11

Jöle , 12 11 bayt

9œcḊẎIE$ÐfY

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Çevrimiçi deneyin!

Anarşi golfünden çözümüm . Fikir, sıralı çıktılar veren tüm uzunluk, başlangıç ​​değeri ve adım üçlülerini yinelemektir. Üçlü bir değer olarak kodlanan rgelen 72için 647ve bileşenleri ekstre edilmektedir k/72, k/8%9ve k%8. kYeterince yüksek başlatmak , tek basamaklı sayıların çıkmasını önler.

xsot , yerine sabit kodlu bir sayı dizesi koyarak iki bayt kaydetti .range'123456789'

Bu, iki saniyelik bir çalışma zamanı sınırlaması altında yazılmıştır. Bunları üretmek yerine sayıları filtreleyen daha yavaş bir strateji daha kısa olabilir.


1
Eğlenceli gerçek: bu sorun aslında anarşi golf çalışma zamanı limiti için "tasarlanmış", bu yüzden PPCG'ye göndermedim. Ben gelen döngü diskalifiye gönderimleri istediğini 1etmek 123456789yerine sağa doğru sayılar oluşturmak için bazı akıllı yolu ile gelip cevapları zorlayarak düzen (sıralı).
Lynn

6

C, 166152 Bayt

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 sayesinde 6 byte tasarruf!

@JonathanFrech sayesinde 8 byte tasarruf!

Çevrimiçi deneyin

Yukarıdaki kodun tam biçimlendirilmiş sürümü aşağıda görülebilir.

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

Ben bir şey eksik sürece, olmamalıdır while(i<123456789)olmak while(i<=123456789)meydan aralığına göre yerine? Ayrıca, 6 bayt ile golf: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 Katılıyorum, ancak daha yüksek bir değer seçerek büyük olasılıkla bir bayt karşılaştırmayı kullanmaya devam edebilir; i<1e9.
Jonathan Frech

@KevinCruijssen Ayrıca, yanlış bir l<1şey yapmazsam !l, lasla olumsuz bir değere ulaşmadığı için golf yapılabilir .
Jonathan Frech

@JonathanFrech hakkında iyi bir nokta i<1e9. Ve !lne zaman ldaima >=0(ı C kendimi programlanmış hiç) CI tahmin için makul geliyor.
Kevin Cruijssen

@KevinCruijssen "i", sprintf () 'de artırılır, i == 123456788 olduğunda döngüye girmemize ve 123456789 ile bırakmamıza izin verir. ) -> (l <1) optimizasyonlar, teşekkürler :)
Jacobinski

5

Jöle , 14 , 13 bayt

DIµEȧ>0Ȧ
Ç77#

Çevrimiçi deneyin!

@MrXcoder sayesinde bir bayt kurtarıldı!

Bu son derece verimsizdir, bu yüzden TIO'da zaman aşımına uğrar, ancak bitirirse doğru çıktıyı üretecektir. Burada daha küçük sayılarla deneyebilirsiniz: Çevrimiçi deneyin!

Açıklama:

            # 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. Beni döv. +1
caird coinheringaahing

$Yardımcı bağlantınızın sonunda gerekmez .
Bay Xcoder

Bunu yapmanın daha net bir yoluDIµ>0ȦȧE¶Ç77#
Outgolfer Erik

4

05AB1E , 23 bayt

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

Çevrimiçi deneyin!


•7=›ζ•TIO'da bitirmek için 7000 ile değiştirin veya zaman aşımına uğramadan önce "sonlandır" düğmesine basın, böylece o noktaya kadar yazdırılan sayılar elde edin.


Bunu kullanmayı deneyin:žh
Okx

@Okx Bunun işe yarayacağını düşünmüyorum, sadece bir alt dizesi değil '0123456789', 1357örneğin çıkmanız gereken geçerli bir sayı.
Outgolfer Erik

@EriktheOutgolfer Değiştirmek istedim•7=›ζ•
Okx

@Okx başlangıçta bu vardı, ama bazı garip şeyler (?) Neden olur. Neden olduğu hakkında hiçbir fikrim yok, bu yüzden sürekli çalıştım.
Sihirli Ahtapot Urn

@MagicOctopusUrn Neden başlangıçta 0'ı kaldırmayı denemiyorsunuz?
Okx

4

Mathematica, 79 bayt

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

Çevrimiçi deneyin! daha düşük bir sayı ile çok yavaş olduğu için

1sec içindeki tüm sayıları oluşturan başka bir yaklaşım

Mathematica, 123 bayt

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


Çevrimiçi deneyin! bir saniyedeki tüm sayılar


4

Kabuk , 14 13 bayt

ÖifȯεuẊ≠Ṗ…"19

Yeni satırla ayrılmış sayıları STDOUT'a yazdırır. Çevrimiçi deneyin!

H.PWiz'den esinlenerek -1 bayt.

açıklama

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

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

Çevrimiçi deneyin! (zaman aşımı nedeniyle daha kısa menzilli)

Nasıl?

x←11+⍳123456789- 11, 12... 1e9içinex

¨ - her biri için

    ⍎¨⍕⍵ - rakamlara girmek

    2-/ - farklar listesi al

     - benzersiz öğeler edinin

    1=≢ - uzunluk == 1?

x/⍨ - oluşturulan aralıkta maske olarak kullanın

- ve sütunlara ayır



3

Toplu, 210200 bayt

Hiçbir optimizasyon, bu yüzden çok yavaş - 12345'e kadar yaklaşık 25 saniye sürer, bu nedenle tam çıktı için yaklaşık 3 gün beklemeniz gerekir.

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

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

Limanı @Jacobinski C cevap (biraz golfed sonra). @Nevay
sayesinde -23 bayt.

Açıklama:

Burada deneyin. (Sonuna doğru biraz fazla yavaş, bu yüzden son sayıyı TIO'ya yazdırmıyor. Son sayıyı yaklaşık 20 saniye içinde yerel olarak yazdırıyor.)

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 bayt: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 Bunu bir şekilde düşürüp breakfor-loop kontrolüne ekleyebileceğini biliyordum , ama bu kendimle gelmezdim. ;) Teşekkürler!
Kevin Cruijssen

2

05AB1E , 14 bayt

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

Çevrimiçi deneyin!


Başlangıçta sahip olduğum şey buydu, ancak ben 12žhŸʒS¥D0›PsË&yerel olarak çalıştıramadım. Bunu gerçekten idam ettirebilir misin?
Sihirli Ahtapot Urn

@MagicOctopusUrn Daha önce sayıları değiştirmeyi Ÿ
denersem

Rakamları değiştirmeden diğerini yerel olarak çalıştırmak için aldım, ama bu hala yapamıyorum. Neden bu kadar farklı olduğunu bilmek istiyorum.
Sihirli Ahtapot Urn


2

Python 2 , 76 75 bayt

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

Yerel olarak yaklaşık 3 dakika sürer.

Çevrimiçi deneyin! (sonuncusu hariç tüm sayıları yazdırmak için değiştirildi)


2

JavaScript (Firefox 30-57), 105 bayt

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'den 10'a kadar uzunluklar üzerinde döngüler (x, son karakterin indeksidir ve bu nedenle uzunluktan 1 daha azdır), 1'den 9'a kadar olan basamaklardan başlayıp 1'den 9'a kadar olan basamaklar, daha sonra son basamaktaki filtreler 10'dan küçükse ve böylece rakamları rakam dizesinden filtreleyerek sonuç üretir.


"Kod snippet'ini çalıştır" bir hataya yol açar:Uncaught SyntaxError: Unexpected token for
schnaader

2
@schnaader Firefox 30+ ile mi çalıştırıyorsunuz? Bu cevap, yalnızca Firefox'un desteklediği standart olmayan dizi anlama sözdizimini kullanır .
Birjolaxew

Ah, sözleri görmedim, bunun için üzgünüm. Chrome'da çalışıyordu, Firefox'ta iyi çalışıyor
schnaader



1

JavaScript (ES6), 121 bayt

Neredeyse Neil'in cevabı kadar kısa değil , ama yine de göndermeye değer olduğunu düşündüm.

Eşleşmeyen '123456789'tüm girişlerin kesildiği ve ön eklendiği bir güç kümesi oluşturarak 0, sonuçları sayısal sırada sıralayarak ve yalnızca 77 ilgili girişi tutarak çalışır.

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

gösteri


1

C (gcc) , 106 bayt

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

Çevrimiçi deneyin!

Yassız (önceden hazırlanmış) versiyon:

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 bayt

Mümkün olan tüm sayıları üreterek çalışır: 8'den 1'e kadar her artışta döngüler (değişken i), 8'den 1'e kadar her başlangıç ​​basamağında jdöngüler (değişken ), jve 10-i(değişken k) arasındaki her basamakta döngüler ve akıma tekleyerek bir dize oluşturur . Her adımda çıkış dizisine eklenir.ktt

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

Çevrimiçi deneyin!

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 bayt

Biraz büyü ile sade bir yaklaşım.

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

Parçacığı çalıştırmak çok fazla bellek tüketir ...


0

PHP, 85 84 bayt

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

çevrimiçi deneyin .

sıralama maliyeti 17 byte. Bu sürüm, farklı şekilde sıralanan sonuçları yazdırır:

while(++$d<9||++$a<9*$d=1)for($x=$y=$a+1;10>$y+=$d;)echo"
",$x.=$y;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.