Crea una sequenza intera universale


22

Definizione

Chiamiamo una sequenza intera (infinita) universale se contiene ogni sequenza intera finita come sottosequenza contigua.

In altre parole, la sequenza di numeri interi (a 1 , a 2 , ...) è universale se e solo se, per ogni sequenza di numeri interi finiti (b 1 , ..., b n ) , esiste un offset k tale che (a k + 1 ,…, A k + n ) = (b 1 ,…, b n ) .

La sequenza di numeri primi positivi, ad esempio, non è universale, tra l'altro per i seguenti motivi.

  • Non contiene numeri interi negativi, 1 o numeri compositi.

  • Sebbene contenga 3 , non contiene la sottosequenza contigua (3, 3, 3) .

  • Sebbene contenga 2 e 5 , non contiene la sottosequenza contigua (2, 5) .

  • Sebbene contenga la sottosequenza contigua (7, 11, 13) , non contiene la sottosequenza contigua (13, 11, 7) .

Compito

Scegli una singola sequenza intera universale (un 1 , un 2 , ...) e implementala in un linguaggio di programmazione a tua scelta, rispettando le seguenti regole.

  • È possibile inviare un programma completo o una funzione.

  • Sono disponibili tre opzioni per l'I / O:

    1. Non accettare input e stampare o restituire l'intera sequenza.

    2. Prendi un indice n come input e stampa o ritorna a n .

    3. Prendi un indice n come input e stampa o ritorna (a 1 , ..., a n ) .

  • Per le opzioni I / O 2 e 3 , è possibile utilizzare l' indicizzazione basata su 0 se si preferisce.

  • L'invio deve essere deterministico: se eseguito più volte con lo stesso input, deve produrre lo stesso output.

Inoltre, a meno che non sia immediatamente ovvio, prova che la sequenza che hai scelto è universale. La tua prova potrebbe non dipendere da congetture non dimostrate.

Si applicano le regole standard del . Che vinca il codice più breve in byte!


La tua prova potrebbe non dipendere da congetture non dimostrate. Pensavo fosse implicito: p
Erik the Outgolfer,

e come salveresti un elenco di numeri in un numero?
RosLuP,

Risposte:


13

Buccia , 5 byte

Questo stampa un elenco infinito

ΣṖ…ݱ

Provalo online! o trova il primo indice della sequenza . (Richiede molta memoria per la maggior parte delle sequenze)

Spiegazione:

   ݱ   Infinite list [1,-1,2,-2,3,-3,4,-4,5,-5...]
  …     Rangify       [1,0,-1,0,1,2,1,0,-1,-2,...]
 Ṗ      Powerset
Σ       Concatenate

In Husk si comporta bene per liste infinite. Puoi vedere il suo comportamento qui


Potresti voler approfondire come Qfunziona. (Penso di averlo capito, ma non ne sono sicuro.)
Dennis,

@Dennis scopre che volevo , nonQ
H.Piz il

9

Python 2 , 49 46 43 byte

def f(n):d=len(`n`);return n/d**(n%d)%d-d/2

f(n)restituisce solo una n . Questo utilizza la cifra più piccola di nin base dper estrarre una delle cifre più alte.

Provalo online! Questa sceneggiatura (per gentile concessione di Dennis) prende qualsiasi sequenza finita e ti dà un punto in ncui inizia quella sequenza.

Spiegazione

n/d**(n%d)%d-d/2
     (n%d)         least significant digit of n
n/d**(   )%d       get n%d-th digit of n
            -d/2   offset to get negative values

Ad esempio, per nnell'intervallo 3141592650a 3141592659, d=10e l'ultima cifra di nseleziona una delle altre cifre. Quindi aggiungiamo -d/2per ottenere valori negativi.

n%d:       0  1  2  3  4  5  6  7  8  9
f(n)+d/2:  0  5  6  2  9  5  1  4  1  3
f(n):     -5  0  1 -3  4  0 -4 -1 -4 -2

Alternativa autonoma, anche 43 byte:

n=input();d=len(`n`);print n/d**(n%d)%d-d/2

Puoi usare len(`n`)invece di len(str(n)).
Dennis,

Grazie @Dennis. Posso aggiungere ulteriori spiegazioni se qualcuno ne ha bisogno.
japh

Ho scritto una funzione che, data una sequenza finita, trova un offset nella sequenza. Provalo online!
Dennis,

Questo è molto bello.
istocratico,

Bello. L'unica cosa è che si romperà da n=2**63-1quando la rappresentazione viene Laggiunta ( str(n)lo indirizzerebbe per tre byte se è necessario).
Jonathan Allan,

5

Brachylog 2, 11 byte

≜~×-₂ᵐ~ȧᵐ≜∋

Provalo online!

Ho anche provato un algoritmo usando partizioni additive in un elenco, ma non era più breve. Questo è un generatore che produce un flusso infinito di numeri interi come output; il collegamento TIO ha un'intestazione per stampare i primi diecimila.

Spiegazione

Il programma si avvia provando tutti i possibili numeri interi in sequenza ( prova tutte le possibilità rimanenti, per numeri interi di default). Sono 0, 1, -1, 2, -2, ecc. (Anche se gli interi negativi non raggiungono la fine del programma). Questo è l'unico passo "infinito" del programma; tutti gli altri sono limitati.

quindi genera tutte le possibili fattorizzazione dell'intero, trattando diversi ordini come diversi e usando solo i valori da 2 in su (quindi ce ne sono solo finitamente molti); si noti che nella fattorizzazione sono consentiti numeri compositi, non solo numeri primi. Ciò significa che tutte le possibili sequenze di numeri interi ≥ 2 verranno generate da questo passaggio in un determinato momento dell'esecuzione della funzione (poiché tale sequenza ha necessariamente un prodotto e quel prodotto verrà generato in qualche punto dall'iniziale ).

Dobbiamo quindi mappare l'insieme di tali sequenze sull'insieme di tutte le sequenze di numeri interi, che viene eseguito in due passaggi: sottraendo 2 ( -₂) da ciascun elemento ( ). L'ultimo passaggio è ovviamente non deterministico, quindi Brachylog lo tratta come un generatore, generando tutte le possibili liste i cui elementi sono più o meno l'elemento corrispondente della lista di input. Ciò significa che ora abbiamo un generatore per tutte le possibili sequenze di numeri interi e le genera in un ordine che significa che sono tutte generate (in particolare, l'ordine che ottieni se prendi il valore assoluto di ciascun elemento, aggiungi 2 a ciascuno elemento, quindi ordina per prodotto degli elementi risultanti). ), dandoci l'insieme di tutte le sequenze di numeri interi non negativi, quindi prendendo più o meno ( , ovvero "un valore il cui valore assoluto è") ogni elemento (

Sfortunatamente, la domanda vuole una singola sequenza, non una sequenza di sequenze, quindi abbiamo bisogno di altri due comandi. In primo luogo, chiede a Brachylog di generare esplicitamente la sequenza di sequenze rigorosamente (al contrario di produrre una struttura di dati che descriva il concetto di una sequenza generata tramite questo metodo e di non generare effettivamente le sequenze fino a quando necessario); ciò accade sia per rendere il programma più veloce in questo caso, sia per garantire che l'output sia prodotto nell'ordine richiesto. Infine, fa in modo che il generatore emetta gli elementi delle singole sequenze una alla volta (passando alla sequenza successiva una volta che ha emesso tutti gli elementi di quella precedente).

Il risultato finale: ogni possibile sequenza intera viene generata e prodotta, un elemento alla volta, e tutti concatenati insieme in un'unica sequenza universale.


ais523 ... sei tu !?
Fatalizza il

Se non sono loro, è una coincidenza infernale, considerando che i post dal loro account eliminato mostrano lo stesso numero di account.
totalmente umano il


4

Python 2 , 100 99 byte

  • Salvato un byte grazie a ovs ; iterando su un itertoolsciclo integrato a ciclo indefinito.
from itertools import*
for n in count():
 for P in permutations(range(-n,n)*n):
	for p in P:print p

Provalo online!

nStampa indefinitamente tutte le permutazioni dell'intervallo di numeri interi ripetuti [-n; n)per tutti gli interi non negativi n.
Puoi cercare il primo offset kper qualsiasi sottosequenza usando questa versione modificata .


while~0:. Heh heh ...
Chas Brown,

99 byte usandoitertools.count
ovs

@ovs Grazie; non sapeva di quel built-in.
Jonathan Frech,

2

Perl 6 , 91 byte

loop (my$i=1;;$i++){my@n=(-$i..$i);my@m=@n;loop (my$k=1;$k <$i;$k++){@m=@m X@n;};print @m;}

Provalo online!

Questo utilizza un metodo simile ad alcune delle altre risposte. Usa i prodotti cartesiani per stampare gli elementi (-1,0,1), quindi tutte le coppie ordinate degli elementi (-2,-1,0,1,2), quindi tutte le terzine ordinate degli elementi (-3,-2,-1,0,1,2,3), ecc.

Sono nuovo di Perl, quindi potrebbe esserci più golf che si potrebbe fare.

Versione più leggibile:

loop (my $i = 1; ; $i++) {
  my @n = (-$i..$i);
  my @m = @n;
  loop (my $k=1; $k <$i; $k++) {
    @m = @m X @n;
  }
  print @m;
}
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.