Numeri saltellanti


14

COMPITO

stampa numeri interi n, dove 12 <= n <= 123456789e tutte le coppie di cifre consecutive in n hanno la stessa differenza positiva tra loro (ad es. 2468 ma non 2469).

NESSUN INGRESSO.

Produzione:

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

Regole

  1. Si applicano scappatoie standard.
  2. nessun input

vince il codice più breve.

Riconoscimenti anarchia golf


8
Questo problema proviene dall'anarchia del golf . Dovresti dargli credito (anche se eri tu quello che lo ha inviato)
xnor

5
Devono essere stampati in ordine?
H.Piz,

11
Ho presentato questo problema su anagol :)
Lynn,

2
Perché non tutti gli interi 0≤n <100 in questo elenco?
DonielF,

3
@DonielF Perché il numero intero deve essere maggiore o uguale a 12 e le differenze in avanti devono essere positive.
Dennis,

Risposte:


11

Gelatina , 12 11 byte

9œcḊẎIE$ÐfY

Provalo online!

Come funziona

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

Provalo online!

La mia soluzione dal golf dell'anarchia. L'idea è di iterare su tutte le possibili triple di lunghezza, valore iniziale e step, che fornisce output ordinati. La tripla è codificato come valore rda 72a 647, ei componenti vengono estratti come k/72, k/8%9e k%8. L'avvio kabbastanza alto evita che vengano emessi numeri a una cifra.

xsot ha salvato due byte da questo sostituendo il rangecon una stringa di cifre codificata '123456789'.

Questo è stato scritto sotto il vincolo di un limite di runtime di due secondi. Una strategia più lenta che filtra i numeri anziché generarli potrebbe essere più breve.


1
Curiosità: questo problema è in realtà "progettato per" il limite di runtime del golf dell'anarchia, motivo per cui non l'ho presentato a PPCG. Volevo squalificare gli invii in loop da 1a 123456789, invece forzando le risposte a trovare un modo intelligente per generare i numeri giusti nell'ordine giusto (ordinato).
Lynn,

6

C, 166 152 byte

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 salvati grazie a @KevinCruijssen!

8 byte salvati grazie a @JonathanFrech!

Provalo online

La versione completamente formattata del codice sopra può essere vista sotto.

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

A meno che non mi manchi qualcosa, non dovrebbe while(i<123456789)essere while(i<=123456789)invece in base al campo di sfida? Inoltre, puoi giocare a golf di 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 il

@KevinCruijssen Sono d'accordo, anche se molto probabilmente si può continuare a utilizzare il confronto a un byte scegliendo un valore più alto; i<1e9.
Jonathan Frech,

@KevinCruijssen Inoltre, se non sbaglio, si l<1può giocare a golf !l, poiché lnon raggiunge mai un valore negativo.
Jonathan Frech,

@JonathanFrech Un buon punto su i<1e9. E !lquando suona lsempre >=0ragionevole per ipotesi CI (non ho mai programmato in C me stesso).
Kevin Cruijssen,

@KevinCruijssen "i" è incrementato in sprintf (), permettendoci di raggiungerci permettendoci di entrare nel ciclo quando i == 123456788 e lasciarlo con 123456789. Aggiungerò questi multiuso per i loop e (l == 0 ) -> (l <1) ottimizzazioni, grazie :)
Jacobinski,

5

Gelatina , 14 , 13 byte

DIµEȧ>0Ȧ
Ç77#

Provalo online!

Un byte salvato grazie a @MrXcoder!

Questo è estremamente inefficiente, quindi scadrà su TIO, ma se mai finisce, produrrà l'output corretto. Puoi provarlo con numeri più piccoli qui: provalo online!

Spiegazione:

            # 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. Battimi. +1
caird coinheringaahing

Non è necessario il $simbolo alla fine del collegamento di supporto.
Mr. Xcoder,

Un modo più chiaro per farlo èDIµ>0ȦȧE¶Ç77#
Erik the Outgolfer,

4

05AB1E , 23 byte

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

Provalo online!


Sostituisci •7=›ζ•con 7000 per terminare su TIO, o premi semplicemente il pulsante "termina" prima che scada, con conseguente stampa dei numeri fino a quel punto.


Prova a usare questo:žh
Okx il

@Okx Non penso che funzionerebbe, non è solo una sottostringa di '0123456789', 1357ad esempio è anche un numero valido che devi produrre.
Erik the Outgolfer,

@EriktheOutgolfer intendevo sostituire•7=›ζ•
Okx il

@Okx è quello che avevo originariamente, ma provoca alcune cose strane (?). Non ho idea del perché, così ho finito con questo, che ha funzionato in modo coerente.
Magic Octopus Urn,

@MagicOctopusUrn Perché non provi a rimuovere lo 0 all'inizio?
Okx,

4

Mathematica, 79 byte

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

Provalo online! con un numero inferiore perché è molto lento

ecco un altro approccio che costruisce tutti i numeri in 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]]   


Provalo online! tutti i numeri in un secondo


4

Buccia , 14 13 byte

ÖifȯεuẊ≠Ṗ…"19

Stampa i numeri separati da nuova riga su STDOUT. Provalo online!

-1 byte a causa dell'ispirazione di H.PWiz.

Spiegazione

Ö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

Provalo online! (con intervallo più breve, a causa del timeout)

Come?

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

¨ - per ciascuno

    ⍎¨⍕⍵ - rompere in cifre

    2-/ - ottieni l'elenco delle differenze

     - Ottieni elementi unici

    1=≢ - lunghezza == 1?

x/⍨ - usa questa come maschera sull'intervallo creato

- e columnify



3

Lotto, 210 200 byte

Nessuna ottimizzazione, quindi molto lenta, impiega circa 25 secondi fino a 12345, quindi per l'output completo dovresti aspettare circa 3 giorni.

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

Port of @Jacobinski C risponde (dopo averlo giocato un po 'a golf).
-23 byte grazie a @Nevay .

Spiegazione:

Provalo qui. (È un po 'troppo lento verso la fine, quindi non stampa il numero finale su TIO. Tuttavia, stampa il numero finale localmente in circa 20 secondi.)

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,

@Nevay sapevo che avrebbe dovuto abbandonarlo in breakqualche modo e aggiungerlo al controllo for-loop, ma questo non mi sarei mai inventato. ;) Grazie!
Kevin Cruijssen,

2

05AB1E , 14 byte

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

Provalo online!


Questo è quello che avevo originariamente, tranne che non avevo 12žhŸʒS¥D0›PsË&, non riesco a farlo funzionare localmente. Riesci a ottenere questo per eseguire effettivamente?
Magic Octopus Urn,

@MagicOctopusUrn Se provo a sostituire i numeri prima Ÿ, funziona benissimo
Okx

Ho avuto l'altro mio da eseguire localmente senza sostituire i numeri, ma questo non riesco ancora. Idk perché, voglio davvero sapere cosa c'è di così diverso.
Magic Octopus Urn,


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

Dura circa 3 minuti a livello locale.

Provalo online!(modificato per stampare tutti i numeri tranne l'ultimo)


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

Passa per lunghezze da 2 a 10 (x è l'indice dell'ultimo carattere e quindi 1 in meno della lunghezza), iniziando le cifre da 1 a 9 e passando da 1 a 9, quindi i filtri sulla cifra finale sono inferiori a 10 e se quindi genera il risultato filtrando le cifre dalla stringa di cifre.


"Esegui snippet di codice" genera un errore:Uncaught SyntaxError: Unexpected token for
schnaader,

2
@schnaader Lo stai eseguendo in Firefox 30+? Questa risposta utilizza la sintassi di comprensione dell'array non standard supportata solo da Firefox.
Birjolaxew,

Ah, non ho visto l'osservazione, scusa per quello. Funzionava con Chrome, funzionava bene con Firefox
schnaader il



1

JavaScript (ES6), 121 byte

Non è così breve come la risposta di Neil , ma ho pensato che valesse la pena pubblicare.

Funziona creando un gruppo di potenze in '123456789'cui tutte le voci non corrispondenti vengono troncate e precedute da 0, ordinando i risultati in ordine numerico e mantenendo solo i 77 pertinenti.

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

dimostrazione


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

Provalo online!

La versione 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 byte

Funziona generando tutti i numeri possibili: scorre attraverso ogni incremento da 8 a 1 (variabile i), scorre attraverso ogni cifra iniziale da 8 a 1 (variabile j), scorre attraverso ogni cifra tra je 10-i(variabile k) e genera una stringa taggiungendo kalla corrente t. Ad ogni passaggio tviene aggiunto l'array di 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)}

Provalo 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

Un approccio diretto con poca magia.

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

L'esecuzione dello snippet consumerà molta memoria ...


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

provalo online .

l'ordinamento costa 17 byte. Questa versione stampa i risultati ordinati in modo diverso:

while(++$d<9||++$a<9*$d=1)for($x=$y=$a+1;10>$y+=$d;)echo"
",$x.=$y;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.