Il tuo compito è, dato x, output 2*x. Facile vero !? Ma c'è un problema: xverrà data come una frazione continua (forse infinita) e l'output deve essere una frazione continua. L'ingresso è garantito per essere un numero algebrico reale il cui grado è al massimo 2.
Input : la frazione continua di x. Questo è diviso in 3 parti: la parte intera, il prefisso e la parte ripetuta. La parte intera è costituita da un singolo numero intero. Il prefisso e la parte ripetuta sono matrici (possibilmente vuote) di numeri interi positivi che descrivono il prefisso e la parte ripetitiva della frazione continua. Ad esempio, l'input (3, [1], [2, 4])rappresenta la frazione continua [3; 1, 2, 4, 2, 4, ...].
Se la parte ripetuta è vuota, ciò indica un numero razionale. Ad esempio, (3, [1, 2], [])rappresenta [3; 1, 2] = 11/3. Devi accettare entrambe le forme di un numero razionale (cioè (3, [1, 1, 1], []), che [3; 1, 1, 1] = 11/3dovrebbe essere anche un input valido).
Output : emette la frazione continua del doppio dell'input, nello stesso formato dell'input. Se l'output è razionale, è possibile generare l'una o l'altra forma della frazione continua. Fintanto che la risposta equivale alla risposta corretta, va bene; non è necessaria alcuna "compressione", quindi la parte infinita potrebbe essere "srotolata" un po '(ad esempio, [1; 4, 2, 3, 2, 3...]può essere scritta (1, [4], [2, 3])o (1, [4, 2, 3], [2, 3])). Tutte le risposte devono essere esatte.
Casi di prova : la colonna del modulo esatto è indicata per comodità.
Input Exact Form Output
(0, [] []) 0 (0, [] []) or (-1, [1], [])
(-5, [1, 1], []) -4.5 (-9, [], []) or (-10, [1], [])
(3, [1, 2], []) 11/3 (7, [3], []) or (7, [2, 1], [])
(1, [], [2]) sqrt(2) (2, [], [1, 4])
(-1, [2], [2, 1]) -1/sqrt(3) (-2, [1, 5], [2, 6])
E, infine, un banco di prova leggermente più grande per garantire la precisione: (0, [1], [6, 1, 3, 1, 42, 1, 3, 1, 6, 2]) --> (1, [], [1, 2, 1, 8, 1, 20, 1, 8, 1, 2, 1, 2]).
Vince il codice più corto!
Suggerimento : è possibile eseguire l'aritmetica in modo piuttosto semplice sulle frazioni continue come descritto qui . Raddoppiare una frazione continua è solo un caso speciale di questo algoritmo (anche se la parte difficile potrebbe essere quella di trovare quando la frazione continua si ripete).
Sqrt[2].
[3; 1, 1, 1]sarebbe (3, [1, 1, 1], [])nel formato di input che stiamo usando - quindi la domanda dovrebbe probabilmente menzionarlo in quel formato (nel terzo paragrafo), solo per garantire chiarezza.
(-2, [1, 5, 2], [6, 2])un output accettabile per l'input (-1, [2], [2, 1])? Che ne dici (-2, [1, 5, 2, 6, 2, 6], [2, 6])?