Pazienza, giovane "Padovan"


44

Tutti conoscono la sequenza di Fibonacci:
si prende un quadrato, si attacca un quadrato uguale ad esso, quindi si attacca ripetutamente un quadrato la cui lunghezza laterale è uguale alla lunghezza laterale più grande del rettangolo risultante.
Il risultato è una bellissima spirale di quadrati la cui sequenza di numeri è la sequenza di Fibonacci :

E se non volessimo usare i quadrati?

Se usiamo triangoli equilateri - anziché quadrati - in modo simile, otteniamo una spirale di triangoli altrettanto bella e una nuova sequenza: la sequenza padovana , nota anche come A000931 :

Compito:

Dato un intero positivo, N , uscita aN , il N ° termine nella sequenza Padovan OR primi N termini.

Supponiamo che i primi tre termini della sequenza siano tutti 1 . Così, la sequenza inizierà come segue:

1,1,1,2,2,3,...

Ingresso:

  • Qualsiasi numero intero positivo N0

  • L'input non valido non deve essere preso in considerazione

Produzione:

  • Il N ° nella sequenza Padovan OR primi N termini della successione Padovan.

  • Se vengono stampati i primi N termini, l'output può essere quello che è conveniente (elenco / array, stringa multilinea, ecc.)

  • Può essere 0 -indexed o 1 -indexed

Casi di test:
(indicizzato 0, N ° termine)

Input | Output
--------------
0     | 1
1     | 1
2     | 1
4     | 2
6     | 4
14    | 37
20    | 200
33    | 7739

(1 indicizzato, primi N termini)

Input | Output
--------------
1     | 1
3     | 1,1,1
4     | 1,1,1,2
7     | 1,1,1,2,2,3,4
10    | 1,1,1,2,2,3,4,5,7,9
12    | 1,1,1,2,2,3,4,5,7,9,12,16

Regole:


2
14(0-indicizzato) viene mostrato come in uscita 28mentre credo che dovrebbe produrre37
Jonathan Allan

@JonathanAllan sì, hai ragione. Ho sistemato gli ultimi due casi di test per ° term, ma non quello. Il post è stato modificato. N
Tau

@LuisMendo, credo di si. Modifica il post.
Tau

1
@sharur questa definizione per la sequenza di Fibonacci è la definizione visiva . Ogni quadrato successivo aggiunto ha una lunghezza di quel termine nella sequenza. La sequenza che descrivi è il ragionamento numerico alla base. Entrambe le sequenze funzionano altrettanto bene dell'altra.
Tau

1
Nota che la sequenza OEIS che hai collegato è leggermente diversa, poiché utilizza a_0=1, a_1=0, a_2=0. Finisce per essere spostato un po 'perché poia_5=a_6=a_7=1
Carmeister

Risposte:


59

Gelatina , 10 byte

9s3’Ẓæ*³FṀ

Provalo online!

1-indicizzati. Calcola l'elemento più grande di:

[001101010]n
dove la matrice binaria viene calcolata convenientemente come:
[isprime(0)isprime(1)isprime(2)isprime(3)isprime(4)isprime(5)isprime(6)isprime(7)isprime(8)]

(questa è una coincidenza totale.)

9s3         [[1,2,3],[4,5,6],[7,8,9]]    9 split 3
   ’        [[0,1,2],[3,4,5],[6,7,8]]    decrease
    Ẓ       [[0,0,1],[1,0,1],[0,1,0]]    isprime
     æ*³    [[0,0,1],[1,0,1],[0,1,0]]^n  matrix power by input
        FṀ                               flatten, maximum

33
questo è chiaramente una specie di voodoo
Pureferret

7
Questo dovrebbe essere pubblicato.
YSC

6
@YSC È già stato pubblicato in A000931 . Non avrei mai immaginato il trucco dei numeri primi :)
flawr

1
... fai che "a meno che qualcuno non possa giocare a golf a due byte da questo" :) (ora che ho un 9 byte )
Jonathan Allan

1
Sono così abituato a vedere risposte assurdamente piccole qui, che ho pensato che la virgola dopo "Jelly" fosse in realtà il codice per questo problema
Tasos Papastylianou

28

Oasi , 5 byte

ennesimo termine indicizzato 0

cd+1V

Provalo online!

Spiegazione

   1V   # a(0) = 1
        # a(1) = 1
        # a(2) = 1
        # a(n) =
c       #        a(n-2)
  +     #              +
 d      #               a(n-3)

26

Gelatina ,  10 9  8 byte

ŻṚm2Jc$S

Un collegamento monadico che accetta n(indicizzato 0) che produce P(n).

Provalo online!

Come?

implementa P(n)=i=0n2(i+1n-2io)

ŻṚm2Jc$S - Link: integer, n       e.g. 20
Ż        - zero range                  [0, 1, 2, 3, 4, ..., 19, 20]
 Ṛ       - reverse                     [20, 19, ..., 4, 3, 2, 1, 0]
  m2     - modulo-slice with 2         [20, 18, 16, 14, 12, 10,  8,  6,  4,  2,  0]  <- n-2i
      $  - last two links as a monad:
    J    -   range of length           [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]  <- i+1
     c   -   left-choose-right         [ 0,  0,  0,  0,  0,  0,  0, 28,126, 45,  1]
       S - sum                         200

Ed ecco un "twofer"
... un metodo totalmente diverso anche per 8 byte (questo è 1-indicizzato, ma molto più lento):

3ḊṗRẎ§ċ‘ - Link: n
3Ḋ       - 3 dequeued = [2,3]
   R     - range = [1,2,3,...,n]
  ṗ      -   Cartesian power         [[[2],[3]],[[2,2],[2,3],[3,2],[3,3]],[[2,2,2],...],...]
    Ẏ    - tighten                   [[2],[3],[2,2],[2,3],[3,2],[3,3],[2,2,2],...]
     §   - sums                      [ 2,  3,   4,    5,    5,    6,     6,...]
       ‘ - increment                 n+1
      ċ  - count occurrences         P(n)

18

Haskell , 26 byte

(l!!)
l=1:1:1:2:scanl(+)2l

Provalo online! Emette l'ennesimo termine indicizzato zero.

Ho pensato che la "ovvia" soluzione ricorsiva di seguito sarebbe stata imbattibile, ma poi ho trovato questo. È simile alla classica espressione da golfl=1:scanl(+)1l per la lista infinita di Fibonacci, ma qui la differenza tra elementi adiacenti è il termine 4 posizioni indietro. Possiamo scrivere più direttamente l=1:1:zipWith(+)l(0:l), ma è più lungo.

Se questa sfida consentisse un output infinito dell'elenco, potremmo tagliare la prima riga e avere 20 byte.

27 byte

f n|n<3=1|1>0=f(n-2)+f(n-3)

Provalo online!




6

Octave / MATLAB, 35 33 byte

@(n)[1 filter(1,'cbaa'-98,2:n<5)]

Emette i primi n termini.

Provalo online!

Come funziona

Funzione anonima che implementa un filtro ricorsivo .

'cbaa'-98è una forma più breve da produrre [1 0 -1 -1].

2:n<5è una forma più breve da produrre [1 1 1 0 0 ··· 0]( n −1 termini).

filter(1,[1 0 -1 -1],[1 1 1 0 0 ··· 0])passa l'ingresso [1 1 1 0 0 ··· 0]attraverso un filtro a tempo discreto definito da una funzione di trasferimento con coefficiente numeratore 1e coefficienti denominatore [1 0 -1 -1].


6

J , 22 byte

-2 byte grazie a ngn e Galen

modulo chiuso, 26 byte

0.5<.@+1.04535%~1.32472^<:

Provalo online!

iterativo, 22 byte

(],1#._2 _3{ ::1])^:[#

Provalo online!


1
Un'altra soluzione a 24 byte (noiosa): (1 # .2 3 $: @ - ~]) `1: @. (3 &>) Provalo online!
Galen Ivanov

23 byte grazie a ngn 1:-> #: provalo online!
Galen Ivanov

@GalenIvanov tyvm, è un grande trucco.
Giona

2
1:-> 1. "avversario" funziona con un nome a destra, apparentemente
ngn

@ngn TIL ... di nuovo!
Giona,

5

Retina , 47 42 byte

K`0¶1¶0
"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*
6,G`

Provalo online! Emette i primi ntermini su righe separate. Spiegazione:

K`0¶1¶0

Sostituire l'input con i termini per -2, -1e 0.

"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*

Genera i ntermini successivi usando la relazione di ricorrenza. *_qui è l'abbreviazione per $&*_cui converte il (primo) numero nella partita in unario, mentre $1*è l'abbreviazione per $1*_cui converte il numero medio in unario. Gli $.(restituisce la somma decimale dei suoi argomenti unari, cioè la somma dei primi numeri e medie.

6,G`

Scarta i primi sei caratteri, ovvero le prime tre righe.


5

Cubix , 20 byte

Questo è 0 indicizzato ed emette il N ° termine

;@UOI010+p?/sqq;W.\(

Provalo online!

Si avvolge su un cubo con lunghezza laterale 2

    ; @
    U O
I 0 1 0 + p ? /
s q q ; W . \ (
    . .
    . .

Guarda correre

  • I010 - Avvia lo stack
  • +p? - Aggiunge la parte superiore dello stack, estrae il contatore dalla parte inferiore dello stack e verifica
  • /;UO@ - Se il contatore è 0, rifletti sulla faccia superiore, rimuovi TOS, inversione a U, uscita e arresto
  • \(sqq;W - Se il contatore è positivo, rifletti, diminuisci il contatore, scambia TOS, spingi due volte dall'alto verso il basso, rimuovi TOS e sposta la corsia nel circuito principale.


4

Perl 6 , 24 byte

{(1,1,1,*+*+!*...*)[$_]}

Provalo online!

Una sequenza generata piuttosto standard, con ogni nuovo elemento generato dall'espressione * + * + !*. Ciò aggiunge il terzo elemento precedente, il secondo elemento precedente e la negazione logica dell'elemento precedente, che è sempre False, che è numericamente zero.


Perché questa community wiki?
Jo King,

@JoKing Mi batte. Se l'ho fatto in qualche modo, non era di proposito.
Sean

4

05AB1E , 8 byte

1Ð)λ£₂₃+

Provalo online!

Abbi pazienza, non gioco a golf da un po '. Mi chiedo se c'è un sostituto più breve per 1Ð)cui funziona in questo caso (ho provato 1D),3Å1n£

Come?

1Ð)λ£₂₃+ | Full program.
1Ð)      | Initialize the stack with [1, 1, 1].
   λ     | Begin the recursive generation of a list: Starting from some base case,
         | this command generates an infinite list with the pattern function given.
    £    | Flag for λ. Instead of outputting an infinite stream, only print the first n.
     ₂₃+ | Add a(n-2) and a(n-3).

Non credo che 1Ð)possa essere 2 byte tbh. Posso pensare a sei diverse alternative a 3 byte , ma non a 2 byte.
Kevin Cruijssen,

4

APL (Dyalog Unicode) , 20 18 17 byte SBCS

Questo codice è 1 indicizzato. È lo stesso numero di byte per ottenere nelementi della sequenza padovana, in quanto è necessario eliminare gli ultimi membri extra. È anche lo stesso numero di byte per ottenere l'indicizzazione 0.

Modifica: -2 byte grazie a ngn. -1 byte grazie a ngn

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

Provalo online!

Spiegazione

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

  ⍺(. . . .)⍣⎕⍵   This format simply takes the input ⎕ and applies the function
                   inside the brackets (...) to its operands (here marked ⍵ and ⍺).
  2(. . .+/)⍣⎕×⍳3  In this case, our ⍵, the left argument, is the array 1 1 1,
                   where we save our results as the function is repeatedly applied
                   and our ⍺, 2, is our right argument and is immediately applied to +/,
                   so that we have 2+/ which will return the pairwise sums of our array.
       2⌷          We take the second pairwise sum, f(n-2) + f(n-3)
    ⊢,⍨            And add it to the head of our array.
4⌷                 When we've finished adding Padovan numbers to the end of our list,
                   the n-th Padovan number (1-indexed) is the 4th member of that list,
                   and so, we implicitly return that.

4

K (ngn / k) , 24 20 byte

-4 byte grazie a ngn!

{$[x<3;1;+/o'x-2 3]}

Provalo online!

0 indicizzati, primi N termini


1
f[x-2]+f[x-3]-> +/o'x-2 3( oè "
recur

@ngn Grazie! L'ho provato (senza successo) in J; è elegante qui.
Galen Ivanov

@ngn In effetti ecco una possibilità come appare in J: (1 # .2 3 $: @ - ~]) `1: @. (3 &>)
Galen Ivanov

ah, giusto, la decodifica base-1 è un modo facile da sommare per il treno :)
ngn

2
1:-> #nella soluzione j
ngn

4

x86 codice macchina a 32 bit, 17 byte

53 33 db f7 e3 43 83 c1 04 03 d8 93 92 e2 fa 5b c3

Smontaggio:

00CE1250 53                   push        ebx  
00CE1251 33 DB                xor         ebx,ebx  
00CE1253 F7 E3                mul         eax,ebx  
00CE1255 43                   inc         ebx  
00CE1256 83 C1 04             add         ecx,4  
00CE1259 03 D8                add         ebx,eax  
00CE125B 93                   xchg        eax,ebx  
00CE125C 92                   xchg        eax,edx  
00CE125D E2 FA                loop        myloop (0CE1259h)  
00CE125F 5B                   pop         ebx  
00CE1260 C3                   ret

È indicizzato 0. L'inizializzazione si ottiene convenientemente calcolando eax * 0. Il risultato a 128 bit è 0 e va in edx: eax.

All'inizio di ogni iterazione, l'ordine dei registri è ebx, eax, edx. Ho dovuto scegliere il giusto ordine per sfruttare la codifica per ilxchg eax istruzione - 1 byte.

Ho dovuto aggiungere 4 al contatore di loop per consentire all'uscita di raggiungere eax, che contiene il valore di ritorno della funzione nella fastcallconvenzione.

Potrei usare qualche altra convenzione di chiamata, che non richiede salvataggio e ripristino ebx, ma fastcallè comunque divertente :)


2
Adoro vedere le risposte del codice macchina su PP&CG! +1
Tau


3

Lua 5.3,49 48 byte

function f(n)return n<4 and 1or f(n-2)+f(n-3)end

Provalo online!

Vanilla Lua non ha coercizione di booleani su stringhe (persino tonumber(true)ritorni nil), quindi devi usare un operatore pseudo-ternario. Questa versione è 1 indicizzata, come tutta Lua. La 1orparte deve essere cambiata 1 orin Lua 5.1, che ha un modo diverso di creare numeri.



3

JavaScript (ES6), 23 byte

a(0)=a(1)=a(2)=1 , come specificato nella sfida.

N

f=n=>n<3||f(n-2)+f(n-3)

Provalo online!


Non credo sia ragionevole affermare che il ritorno truesia lo stesso del ritorno 1se il resto dell'output è costituito da numeri.
Nit


Penso che manchi alcuni requisiti: dai un'occhiata alla mia modifica (versione in Java) qui .
Shaq

@Shaq La sfida specifica chiaramente che i primi tre termini della sequenza sono tutti 1 . Quindi, non è la sequenza definita in A000931 (ma la formula è la stessa).
Arnauld

@Arnauld sì, posso vederlo ora. Scusate!
Shaq


2

TI-BASIC (TI-84), 34 byte

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1

N

L'ingresso è in Ans.
L'output è attivo Anse viene stampato automaticamente.

Immaginai che fosse passato abbastanza tempo e che fossero state pubblicate più risposte, di cui ce n'erano molte che superavano quella risposta.

Esempio:

0
               0
prgmCDGFD
               1
9
               9
prgmCDGFD
               9
16
              16
prgmCDGFD
              65

Spiegazione:

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1      ;full program (example input: 6)

[[0,1,0][0,0,1][1,1,0]]                     ;generate the following matrix:
                                            ; [0 1 0]
                                            ; [0 0 1]
                                            ; [1 1 0]
                       ^(Ans+5              ;then raise it to the power of: input + 5
                                            ; [4  7 5]
                                            ; [5  9 7]
                                            ; [7 12 9]
                               Ans(1,1      ;get the top-left index and leave it in "Ans"
                                            ;implicitly print Ans

2

Pyth, 16 byte

L?<b3!b+y-b2y-b3

Questo definisce la funzione y . Provalo qui!

Ecco una soluzione più divertente, sebbene sia più lunga di 9 byte; i byte potrebbero essere rasati però.

+l{sa.pMf.Am&>d2%d2T./QY!

Questo utilizza la definizione data da David Callan nella pagina OEIS: "a (n) = numero di composizioni di n in parti che sono dispari e> = 3." Provalo qui! Prende direttamente input invece di definire una funzione.


y-b2y-b3potrebbe forse essere rifattorizzato con biforcato o L? Sebbene dichiarare un array di 2 elementi sia costoso. yL-Lb2,3è più lungo :(
Ven

@Ven sono stato in grado di sostituire +y-b2y-b3con smy-bdhB2la stessa quantità di byte; hB2risulta nella matrice[2, 3]
RK.

Ben fatto hB2. Peccato che sia lo stesso numero di byte.
Ven

Sì, anche se mi chiedo se c'è un modo per sbarazzarsi di dnella mappa.
RK.

2

Java, 41 byte

Impossibile utilizzare un lambda (errore di runtime). Porta di questa risposta Javascript

int f(int n){return n<3?1:f(n-2)+f(n-3);}

TIO


Penso che manchi alcuni requisiti: dai un'occhiata alla mia modifica qui .
Shaq

Si prega di ignorare il commento di Shaq: la risposta è corretta ed è la risposta Java più breve possibile (a partire da Java 12).
Olivier Grégoire,

Va bene allora. Non sono sicuro di cosa "ho perso" ma ok. Modifica: nvm ho letto la risposta JS.
Benjamin Urquhart,






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.