Stampa la sequenza


24

21, 21, 23, 20, 5, 25, 31, 24,?

Ispirato da questo Puzzle , dato un numero intero , stampa la seguente sequenza fino a raggiungere un numero non intero (viziato, nel caso in cui desideri risolvere il puzzle da solo)n>0

un'0=n
un'4K+1=un'4K(4K+1)
un'4K+2=un'4K+1+(4K+2)
un'4K+3=un'4K+2-(4K+3)
un'4K+4=un'4K+3/(4K+4)
o più intuitivamente: * 1, +2, -3, / 4, * 5, +6, -7, / 8, ...

Casi test:

1: 1, 1, 3, 0, 0, 0, 6, -1
2: 2, 2, 4, 1
3: 3, 3, 5, 2
4: 4, 4, 6, 3
5: 5, 5 , 7, 4, 1, 5, 11, 4
6: 6, 6, 8, 5
9: 9, 9, 11, 8, 2, 10, 16, 9
21: 21, 21, 23, 20, 5, 25, 31, 24, 3, 27, 37, 26

Input e Output possono essere acquisiti in qualsiasi formato ragionevole, le scappatoie standard sono vietate come al solito.

Nello spirito del , vince la risposta più breve in byte!

Sandbox: https://codegolf.meta.stackexchange.com/a/18142/59642


Possiamo invece restituire un elenco infinito della sequenza? Inoltre, l'output per 1 è corretto? Ho avuto qualcosa di diverso dopo il 6
cole

3
@cole Dato che la sequenza termina, non credo che puoi generare un elenco infinito.
Wheat Wizard

1
Possiamo produrre 1 indicizzato, ovvero saltare il primo elemento?
Jo King,

1
No, è necessario stampare l'intera sequenza.
infinitezero

1
Sì, puoi @KevinCruijssen
infinitezero il

Risposte:


6

05AB1E (legacy) , 18 17 byte

[N"/*+-"Nè.VÐïÊ#=

Provalo online o verifica tutti i casi di test .

Spiegazione:

[                # Start an infinite loop:
 N               #  Push the 0-based loop-index
  "/*+-"         #  Push string "/*+-"
        Nè       #  Index into this string with the loop-index
          .V     #  And use a 05AB1E-eval to calculate the next number
 Ð               #  Triplicate this number
  ï              #  Cast it to an integer
   Ê             #  And if it's NOT equal to the number we triplicated:
    #            #   Stop the infinite loop
  =              #  Print the number without popping

Sto usando la versione legacy di 05AB1E qui, e anche prima calcolo il numero successivo prima di stamparlo, perché il ciclo è basato su 0 e farà un /0primo nella iterazione. Ciò ha salvato un byte rispetto al precedente N>e "*+-/". Funziona solo perché nella versione precedente un numero diviso per 0 rimane lo stesso; mentre nella nuova versione diventerebbe 0; e nella matematica attuale darebbe una divisione per zero errore.


11

Scratch 3.0 39 blocchi / 323 byte

Oh eval, mi manchi

Provalo online, gratta e vinci!

In alternativa, come sintassi SB:

when gf clicked
delete[all v]of[o v
ask()and wait
set[. v]to(answer
set[n v]to(1
repeat until<(n)contains[.
if<((n)mod(4))=(0
set[. v]to((. )*(n
else
if<((n)mod(4))=(1
change[. v]by(n
else
if<((n)mod(4))=(2
change[. v]by((0)-(n
else
set[. v]to((. )/(n
end
end
end
add(n)to[o v
change[n v]by(1
end
delete(length of(o))of[o v

Ragazzi, divertitevi con le vostre fantasiose evaldichiarazioni! Bene, non io! No ... Scratch non ha valutazioni, quindi ho dovuto fare le cose nel modo più duro ... se le dichiarazioni.

Almeno non è gotos ...


2
Guardati, divertiti con le dichiarazioni if ​​e la divisione float! Bene, non io! No ... Whitespace non ha eval, if-statement o float-division, quindi ho dovuto fare le cose nel modo più duro ... gotoe un ciclo di sottrazione per verificare se possiamo dividere, in un linguaggio basato su stack . ; p (In tutta serietà, bella risposta, +1 da parte mia! Non ho potuto resistere alla citazione di te nella mia risposta su Whitespace appena terminata .)
Kevin Cruijssen,

8

Spazio bianco , 251 227 202 byte

[S S S N
_Push_0][S N
S _Duplicate_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][N
S S N
_Create_Label_LOOP][S N
S _Duplicate_top][T N
S T _Print_as_integer][S S S T  S T S N
_Push_10_newline][T N
S S _Print_as_character][S N
T   _Swap_top_two][S S S T  N
_Push_1][T  S S S _Add][S T S S T   N
_Copy_2nd_item][S T S S T   N
_Copy_2nd_item][S N
S _Duplicate_top][S S S T   S S N
_Push_4][T  S T T   _Modulo][S N
S _Duplicate_top][N
T   S S N
_If_0_Jump_to_Label_DIVIDE][S S S T N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate_top][N
T   S T N
_If_0_Jump_to_Label_MULTIPLY][S S S T   N
_Push_1][T  S S T   _Subtract][N
T   S S S N
_If_0_Jump_to_Label_ADD][S N
T   _Swap_top_two][S T  S S T   N
_Copy_2nd_item][T   S S T   _Subtract][N
S N
N
_Jump_to_LOOP][N
S S S N
_Create_Label_DIVIDE][S N
N
_Discard_top][T S T S _Divide][S T  S S T   S N
_Copy_3nd_item][S T S S T   S N
_Copy_3nd_item][T   S T T   _Modulo][N
T   S N
_If_0_Jump_to_Label_LOOP][N
N
N
_Exit_Program][N
S S T   N
_Create_Label_MULTIPLY][S N
N
_Discard_top][T S S N
_Multiply][N
S N
N
_Jump_to_Label_LOOP][N
S S S S N
_Create_Label_ADD][T    S S S _Add][N
S N
N
_Jump_to_Label_LOOP]

Lettere S(spazio), T(scheda) e N(nuova riga) aggiunti solo come evidenziazione.
[..._some_action]aggiunto solo come spiegazione.

Provalo online (solo con spazi non elaborati, schede e nuove righe).

-24 byte dopo un commento suggerito da @JoKingn%i > 0 . Sebbene solo if(x < 0)e if(x == 0)siano disponibili in Whitespace, il semplice controllo if(x*-1 < 0)è sostanzialmente lo stesso di if(x > 0).
Ulteriori -25 byte grazie a @JoKing .

Spiegazione:

Citazione dalla risposta di Scratch :

Almeno non è gotos ...

Qualcuno ha detto goto? Lo spazio bianco non ha nient'altro che gotocreare sia loop che if-statement. xD Inoltre è un linguaggio basato su stack, quindi devo scambiare / scartare / copiare abbastanza spesso. E per finire, Whitespace non ha nemmeno punti fluttuanti e solo una divisione intera, quindi ho usato n % i * -1 < 0per uscire dal programma se l'intero non può dividere il numero corrente.

Pseudo-codice:

Integer n = STDIN as input
Integer i = 0
Label LOOP:
  Print n as number
  i = i + 1
  Integer t = i % 4
  If(t == 0):
    Jump to Label DIVIDE
  t = t - 1
  If(t == 0):
    Jump to Label MULTIPLY
  t = t - 1
  If(t == 0):
    Jump to Label ADD
  n = n - i
  Jump to Label LOOP
Label DIVIDE:
  n = n / i
  Integer m = n % i
  If(m == 0):
    Jump to Label LOOP
  Exit program
Label MULTIPLY:
  n = n * i
  Jump to Label LOOP
Label ADD:
  n = n + i
  Jump to Label LOOP

Sei un genio assoluto. Ho il mio voto!
Jono, 2906

@JoKing Whitespace ha solo if(n == 0)o if(n < 0)disponibile. Purtroppo no if(n > 0)o if(n != 0). Ma sono sicuro che alcuni aspetti possono essere semplificati. Questa soluzione attuale è stata una prova ed errore di debug, ma forse dovrei solo fare un passo indietro e ripensare un approccio più breve. Quando avrò di nuovo tempo. E riparato lo pseudo-codice, avevi davvero ragione, ho cambiato i/ nin molti posti ..
Kevin Cruijssen,

1
Non sono sicuro di quanto sia fattibile, ma forse potresti farlo m = n%i; n = n/i; if (m == 0) jump to LOOP; exit program?
Jo King,

1
Potresti anche spostare il swap top two, copy second itemciclo complessivo anziché copiarlo in ogni sezione?
Jo King,

1
@JoKing Grazie, entrambi quei suggerimenti hanno salvato byte. Il primo suggerimento è -7 e il secondo -18. :)
Kevin Cruijssen il



5

Perl 6 , 44 byte

{$_,{($_,<* + - />[$++%4]~++$).EVAL}...^*%1}

Provalo online!

Blocco di codice anonimo che accetta un numero e restituisce una sequenza. Se potessimo saltare il primo elemento (che è sempre uguale al secondo elemento), potremmo salvare 3 byte rimuovendo il$_,



5

Piet , 297 190 144 codici (432 byte)

Nuovo codice Piet

Ho provato un nuovo approccio usando un pointercomando come switch (k mod 4) per unificare il codice di output, ottenendo un'immagine di codice 10x19 più densa. Poi ho giocato a golf di 1 riga e 2 colonne a 8x18.

Ecco una traccia, per vedere come funziona:

inserisci qui la descrizione dell'immagine

La prima riga inserisce uno 0 nello stack come indice iniziale (poiché possiamo solo pushnumeri naturali, ne spingiamo 2 e poi sottraggiamo), quindi legge l'input come numero.

La colonna più a sinistra ha il codice condiviso di duplicare il numero e inserirne uno nell'output, quindi spostare l'indice in cima allo stack, incrementarlo e duplicarlo tre volte. Entriamo quindi nel blocco a forma di r rosso pastello attraverso il codice ciano scuro per un pointercomando che ci fornisce percorsi diversi per il resto del nostro indice mod 4.

Mod 1, usciamo dalla cima per moltiplicare. Prima rimescoliamo una copia del nostro indice per dopo, quindi eseguiamo la moltiplicazione. Dopo aver attraversato il bianco per un noop, entriamo nella colonna sopra per correggere la parità cc (deve essere capovolto un numero pari di volte per mantenere stabile il loop), seguito da un pointer (1)inserimento nella barra magenta: agisce come un prendi i nostri quattro percorsi e rimandaci nel circuito.

Mod 2, usciamo all'indietro per riassumere. La forma del blocco di codice pastello significa che usciamo da una riga sopra da dove siamo entrati e usiamo i 3 che spingiamo nello stack uscendo attraverso il codice rosso verso pointer (3)noi stessi verso l'alto. Queste colonne hanno lo spazio bianco prima dell'aritmetica e un ordine leggermente diverso di spingere e cambiare cc, perché altrimenti avremmo sovrapposizione di colori con codici a valori interi nella colonna vicina.

Mod 3 ci invia verso il basso per la sottrazione. Stesso affare della moltiplicazione, tranne per il fatto che attraversiamo il percorso di divisione durante la salita (poiché la cc ha una parità diversa quando si accede alla barra verde pastello, le due esecuzioni escono da quella barra a estremità diverse). Nel fare ciò, prendiamo un duplicatecomando indesiderato , quindi torniamo popindietro con il codice verde scuro prima di entrare nella barra di correzione e raccolta cc.

Mod 4, andiamo dritti a dividere. Qui, dobbiamo prima ri-mescolare lo stack più severamente per ottenere due coppie di n e a per eseguire operazioni, perché dobbiamo testare se è intero. Facciamo ciò che faccio modsulla prima coppia, quindi notsul risultato, quindi usiamo quello per un pointer- se non è divisibile, continuiamo ad andare dritto, che ci invia con due pointercomandi nell'angolo opposto nel blocco inevitabile e quindi termina il programma. Altrimenti, giriamo a destra e riceviamo un dividecomando dall'entrare nella barra magenta.

Vecchia versione

Codice Piet

Codice molto semplice: spinge un 1 e l'input sullo stack, quindi scorre attraverso le quattro operazioni: Mescolando l'indice in cima allo stack, incrementandolo di 1, duplicandolo, rimescolando una copia verso il basso, eseguendo l'operazione aritmetica, duplicando il numero e inserendone uno nell'output.

Per la divisione, che è l'unica in cui la sequenza può terminare, crea uno stack più complicato per verificare prima se n mod index == 0, altrimenti entra nel codice inevitabile e termina. Altrimenti, usa la sua seconda copia di ie n per eseguire la divisione.


Sarebbe possibile mettere insieme la seconda e la terza fila? Vale a dire, ruotare la cella rosa su (0,1) -> (1,2), spostare le 3 celle al centro in basso e ridurre la colonna di destra su una 1x2?
Veskah

Non facilmente. Ho bisogno di 2 celle per eseguire la svolta a destra, sia per una push (1) pointero per una cella nera in cima a una colorata.
AlienAtSystem


4

Rubino , 56 54 52 byte

f=->n,z=1{n%1>0?[]:[n,n*=z,n-~z,n-=1]+f[n/=z+3,z+4]}

Provalo online!

Dopo qualche tentativo (fallito) con eval, ho scoperto che la soluzione più felice è costruire l'array con 4 elementi contemporaneamente, almeno in ruby.

Grazie ad Arnauld per -2 byte.


53 byte riportando la mia ultima risposta, che è stata ispirata dalla tua.
Arnauld,

3
52 byte usando un miglioramento suggerito da Shaggy che si è rivelato altrettanto lungo in JS ma salva un byte in Ruby.
Arnauld,

4

R , 90 byte , 87 byte 85 byte 80 byte 74 73 byte

Una semplice attuazione delle regole:

a=scan();while(T<13)a=c(a,d<-a[T]*T,d+T+1,e<-d-1,e/((T<-T+4)-1));a[!a%%1]

Provalo online!

con quanto T<13segue da un'analisi più approfondita del puzzle. In effetti ci sono solo tre tipi di sequenze: quelle di lunghezza 4, quando a⁰ non è congruente con 1 modulo 8; quelli di lunghezza 12 quando a⁰ è congruente a 21 modulo 32; e quelli della lunghezza 8 per i restanti casi.

Un codice alternativo che evita i loop finisce per essere più lungo con 87 byte:

`~`=rep;b=(scan()-1)*c(32~4,8,40~3,1,9~3)/32+c(1,1,3,0~3,6,-c(8,1,9,-71,17)/8);b[!b%%1]

Provalo online!


1
È possibile rimuovere il {}per -2 byte.
Robin Ryder,

1
74 byte evitando length.
Robin Ryder,

3

Haskell , 104 86 85 byte

n#i=n:(cycle[(/),(*),(+),(-)]!!floor i)n i#(i+1)
takeWhile((==).ceiling<*>floor).(#1)

Provalo online!

La h=può essere omesso in quanto è usata solo per il test.

Ah, codice golf, dove vale la pena aumentare un quadratico della complessità temporale per la riduzione di un carattere.

104 byte

f=flip
g x=scanl(f($))x.zipWith(f($))[1..].cycle$f<$>[(*),(+),(-),(/)]
takeWhile((==).ceiling<*>floor).g

Provalo online!

Mi piace meglio questa risposta, ma purtroppo è più lunga.


3

Japt , 25 24 byte

Un altro adattamento della soluzione Ruby di GB .

%1ª[UU*=°VU´ÒVU]cßU/=V±3

Provalo

Il trucco principale qui è nel sovraccarico del cmetodo per le matrici. Passa un altro array come argomento e lo concatena all'array originale. Passa un numero come argomento, come accade nell'ultima chiamata ricorsiva, e appiattisce l'array originale di molti livelli, 1in questo caso dopo l'arrotondamento. Tuttavia, poiché l'array ha solo un livello di profondità, l'appiattimento non ha alcun effetto.

%1ª[UU*=°VU´ÒVU]cßU/=V±3     :Implicit input of integer U
%1                           :U modulo 1
  ª                          :Logical OR with
   [                         :Construct and array containing
    U                        :  U
     U*=                     :  U multiplied by
        °V                   :    V (initially 0) prefix incremented
          U´                 :  The new value of U, postfix decremented
            ÒV               :    Subtract the bitwise negation of V
              U              :  The now-decrmented U
               ]             :End array
                c            :Concatenate, or flatten by
                 ß           :  Recursive call to the programme with argument
                  U/=        :    U divided by
                     V±3     :      V incremented by 3

2

Java 8, 84 byte

n->{for(int i=1;n%1==0;n=new float[]{n/i,n*i,n+i,n-i}[i++%4])System.out.println(n);}

Provalo online.

La creazione di un array con tutti e quattro i valori è ispirata dalla risposta Ruby di @GB , anche se ora noto che l'uso di un'istruzione if ternaria è la stessa quantità di byte:

n->{for(int i=0;n%1==0;n=++i%4<1?n/i:i%4<2?n*i:i%4<3?n+i:n-i)System.out.println(n);}

Provalo online.





2

Rutger , 310 byte

n=e=$Input;
a=0;
w=While[{m=Modulo[$e];Not[m[1]];}];
w=w[{f=For[4];f=f[@x];f=f[{Print[$e];q=Equal[$x];i=If[{q[1];}];i=i[{k=Times[$e];}];Do[$i];i=If[{q[2];}];i=i[{k=Add[$e];}];Do[$i];i=If[{q[3];}];i=i[{k=Subtract[$e];}];Do[$i];i=If[{q[4];}];i=i[{k=Divide[$e];}];Do[$i];e=k[a=Increment[$a]];}];Do[$f];}];
Do[$w];

Provalo online!

Era ora che usassi di nuovo Rutger. Sfortunatamente, potrebbe non essere la lingua migliore per l'attività, in quanto non ha alcuna forma eval, costringendomi a usare quattro istruzioni if

Come funziona

Come funziona Rutger

Una breve premessa su come funziona la lingua: tutto è o un compito o una funzione, e ogni funzione accetta esattamente un argomento. Per le operazioni che richiedono più di un argomento (ad es. Moltiplicazione), la prima chiamata restituisce una funzione parziale che, quando richiamata con il secondo argomento, restituisce il risultato atteso. Per esempio:

left = Times[5];
Print[left[6]];

stamperà 30: provalo online! . Mentre di solito è più lungo della solita alternativa, a volte può salvare byte, se una funzione viene chiamata ripetutamente con un argomento costante e un argomento che cambia, ad esempio quando si stampano le tabelle dei tempi.

Questa regola con un argomento si applica a tutto ciò che non è una costante o una variabile, inclusi loop e condizionali. Tuttavia, loop e condizionali ( For, Each, While, DoWhile, Ife IfElse) sono fattibile , il che significa che al fine di effettivamente eseguito, il Dofunzione deve essere chiamato (vedi l'ultima riga nella risposta). Ancora una volta, questo può salvare byte quando si esegue ripetutamente lo stesso loop o consentire l'esecuzione di codice arbitrario tra la definizione e l'esecuzione di loop.

Infine, ci sono tre modi per fare riferimento alle variabili, tutte utilizzate in questo programma. Il primo è il riferimento diretto , in cui il nome della variabile è preceduto da un $simbolo. Questo accede direttamente al valore della variabile e lo restituisce. Il secondo è il riferimento funzionale , che non ha un carattere prefisso. Ciò consente al codice di distinguere tra funzioni (potenzialmente parziali) assegnate alle variabili e variabili effettive contenenti un valore specifico. Infine, il riferimento indiretto , preceduto da un @simbolo, crea una variabile (se non esiste già) e restituisce l'oggetto variabile all'interno di un determinato ambito. Questo consente di creare una variabile di ciclo (ad esempio iin for i in range(...)).

Come funziona la soluzione attuale

Ecco il codice ungolfed:

n = elem = $Input;
var = 0;
while = While[{
	mod = Modulo[$elem];
	Not[mod[1]];
}];
while = while[{
for = For[4];
for = for[@index];
for = for[{
	Print[$elem];
	equal = Equal[$index];

	if = If[{ equal[1]; }];
	if = if[{ func = Times[$elem]; }];
	Do[$if];

	if = If[{ equal[2];}];
	if = if[{ func = Add[$elem];}];
	Do[$if];

	if = If[{ equal[3];}];
	if = if[{ func = Subtract[$elem];}];
	Do[$if];

	if=If[{ equal[4];}];
	if=if[{ func = Divide[$elem];}];
	Do[$if];

	elem = func[var = Increment[$var]];
	}];
	Do[$for];
}];
Do[$while];

Provalo online!

Come si può vedere, inizia assegnando le tre variabili n, ee a, che rappresentano rispettivamente l'ingresso, l'elemento cambia nella sequenza, e il numero di modifica per ogni nuovo elemento. Quindi creiamo un ciclo while:

w=While[{m=Modulo[$e];Not[m[1]];}];

{}me % m1001n0,n0

Successivamente arriviamo all'assoluta mostruosità costituita dal corpo del ciclo while:

w=w[{f=For[4];f=f[@x];f=f[{Print[$e];q=Equal[$x];i=If[{q[1];}];i=i[{k=Times[$e];}];Do[$i];i=If[{q[2];}];i=i[{k=Add[$e];}];Do[$i];i=If[{q[3];}];i=i[{k=Subtract[$e];}];Do[$i];i=If[{q[4];}];i=i[{k=Divide[$e];}];Do[$i];e=k[a=Increment[$a]];}];Do[$f];}];

4x

Print[$e];
q=Equal[$x];
i=If[{q[1];}];i=i[{k=Times[$e]    ;}];Do[$i];
i=If[{q[2];}];i=i[{k=Add[$e]      ;}];Do[$i];
i=If[{q[3];}];i=i[{k=Subtract[$e] ;}];Do[$i];
i=If[{q[4];}];i=i[{k=Divide[$e]   ;}];Do[$i];
e=k[a=Increment[$a]];

La prima istruzione stampa ogni iterazione della sequenza prima di modificarla. Quindi creiamo una funzione parziale per verificare l'uguaglianza con la variabile loop xe riscontriamo quattro istruzioni if. Ogni affermazione verifica sex è uguale a 1, 2, 3 o 4, rispettivamente, e poi assegna ka ciascuna funzione *, +, -e /, quindi fa in una funzione parziale ecome argomento. Infine, assegniamo el' kesecuzione con ail secondo argomento e l'incremento a.





2

TI83 / 84 BASIC, 69 byte

1→A
DelVar L1Prompt N
Repeat fPart(N
N→L1(A
NA-1→O
augment(L1,{NA,Ans+A+2,Ans→L1
O/(A+3→N
A+4→A
End
Disp L1

Abbiamo impostato un contatore in A e cancellato L1 in modo da poterlo utilizzare per tenere traccia della sequenza. Ripetiamo quindi fino a quando il passaggio di divisione provoca una frazione. All'interno del loop memorizziamo innanzitutto N nell'elenco. La memorizzazione in un elemento oltre la fine di un elenco o in un elenco vuoto crea quell'elemento, quindi questo archivio aggiunge sia il risultato della divisione quando non provoca una frazione, sia inizializza l'elenco durante il primo passaggio. Usiamo quindi augment per aggiungere i successivi 3 termini della sequenza. La matematica risolve alcuni byte più piccoli calcolando il termine A4k + 3 nella variabile O e quindi basando A4k + 2 e A4k + 4 su O. Quindi eseguiamo la divisione separatamente per ripristinare N per il controllo ripetuto e aggiungere 4 ad A.

Ho messo un Disp L1 alla fine ma non sono sicuro di quanto sia l'ideale in quanto non esiste un buon modo per adattarsi a tutti i termini sullo schermo. Realisticamente l'utente eseguirà L1 dopo l'esecuzione manuale del programma per scorrere i risultati.


1

Carbone , 29 byte

NθW¬﹪θ¹«Iθ⸿≔§⟦∕θⅉ×θⅉ⁺θⅉ⁻θⅉ⟧ⅉθ

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

Nθ

Immettere il valore iniziale.

W¬﹪θ¹«

Ripetere fino a quando il valore non è più un numero intero.

Iθ⸿

Stampa il valore su una propria riga.

≔§⟦∕θⅉ×θⅉ⁺θⅉ⁻θⅉ⟧ⅉθ

Calcola le quattro operazioni aritmetiche disponibili e seleziona quella corretta in base al numero della linea di uscita corrente.


1

Python 3 , 78 76 byte

f=lambda n:n[-1]%1and n[:-1]or f(n+[eval(f"n[-1]{'/*+-'[len(n)%4]}len(n)")])

Provalo online!

Prende l'input come un elenco di 1 elemento e aggiunge ricorsivamente l'elemento successivo della sequenza fino a quando non è un numero intero.

Nel caso in cui non sia consentito prendere input come elenco, ecco una versione con patch molto rapida che accetta input come int.

Immettere come numero intero, 102 byte

f=lambda n:type(n)==int and f([n])or n[-1]%1and n[:-1]or f(n+[eval(f"n[-1]{'/*+-'[len(n)%4]}len(n)")])

Provalo online!

+2 byte grazie a me dimenticando di nominare la funzione ricorsiva ...
-4 byte grazie a Jitse


1
Bel approccio! Poiché la tua funzione è ricorsiva, non può rimanere anonima. Dovresti includere f=nel tuo codice principale. Tuttavia, è anche possibile salvare 4 byte da allora n[-1]e len(n)non è necessario che siano tra parentesi graffe. Provalo online!
Jitse il

Non sono sicuro di prendere un elenco piuttosto che un numero intero (consiglierei di chiedere all'OP), ma n[:-(n[-1]%1>0)]or f...salverei un byte
Jonathan Allan,

1

Ramoscello , 164 byte

Ok, questo è stato davvero orribilmente orribile da scrivere.

limitazioni:

  • No returns! O emetti o non emetti
  • Nessun whileloop. È necessario utilizzare la ricorsione o niente
  • Nessun modo semplice per produrre! Devi ripetere l'output ogni volta
  • Non puoi dare un valore alle variabili senza usare il set tag
  • Nessun modo semplice per uscire da un ciclo. Non c'è break, continue, gotoo simili. Questo rende impossibile usare un loop.
  • Esiste solo 1 ciclo: for ... in ....e passa in rassegna tutti gli elementi di un array, senza alcun modo per arrestarsi.

Tutti quelli hanno reso enorme il codice!
Ehi, l'ho persino reso più lungo della risposta Java!
È fino a quando la risposta JavaScript di @ Arnauld ! ... Con tutte e 3 le alternative combinate.

Ecco il codice:

{%macro a(b,n=1)%}{{n<2?b}}{%set b=b*n%},{{b}}{%set b=b+n+1%},{{b}}{%set b=b-(n+2)%},{{b}}{%set b=b/(n+3)%}{%if(b//1)==b%},{{b~_self.a(b,n+4)}}{%endif%}{%endmacro%}

Puoi provarlo su https://twigfiddle.com/zw5zls


Come usare:

Importa semplicemente il file e chiama la prima macro.

{% import 'file.twig' as a %}

{{ a.a(21) }} {# 21,21,23,20,5,25,31,24,3,27,37,26 #}

Per avere un array utilizzabile, puoi farlo a.a(21)|split(',').


Ungolfed:

{% macro calc(number, index = 1) %}
    {% if index < 2 %}
        {{ number }}
    {% endif %}

    {% set number = number * index %},{{ number }}
    {% set number = number + index + 1 %},{{ number }}
    {% set number = number - (index + 2) %},{{ number }}
    {% set number = number / (index + 3) %}

    {#
        verifies if it is an integer.
        this is done with an integer division with 1 and compare with itself
        if both values are the same, the number is an integer
        otherwise, it is a floating-point number
    #}
    {% if (number // 1) == number %}
        ,{{ number ~ _self.calc(number, index + 4) }}
    {% endif %}
{% endmacro %}

Dovrebbe essere facile da leggere.
Questa risposta non golfata NON darà l'output corretto, poiché genererà spazi bianchi casuali.
Esiste semplicemente per essere umanamente leggibile.

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.