La secuencia más-menos

26

La secuencia más-menos

La secuencia más-menos es una que comienza con dos semillas, a(0)y b(0). Cada iteración de esta secuencia es la suma y resta de los dos miembros anteriores de la secuencia. Es decir, a(N) = a(N-1) + b(N-1)y b(N) = a(N-1) - b(N-1).

Objetivo Producir la secuencia más-menos, en infinitud o los primeros Kpasos dados K. Puede hacer esto usando un programa de salida infinita, un generador o una función / programa que dé los primeros Kpasos. El orden de salida no importa, siempre que sea coherente. (Es decir, b(K) a(K)o a(K) b(K)con algún separador no numérico, no de nueva línea en el medio). La salida debe comenzar con la entrada.

Casos de prueba

Para entradas 10 2(de a(0) b(0), esta es una salida posible para el primer enfoque K (o una subsección del enfoque infinito):

10     2
12     8
20     4
24     16
40     8
48     32
80     16
96     64
160    32
192    128
320    64
384    256
640    128
768    512
1280   256
1536   1024
2560   512
3072   2048
5120   1024
6144   4096
10240  2048
12288  8192
20480  4096
24576  16384
40960  8192
49152  32768
81920  16384
98304  65536

Para entradas 2 20 10( a(0) b(0) k):

2     20
22   -18
4     40
44   -36
8     80
88   -72
16    160
176  -144
32    320
352  -288

Este es un , por lo que gana el programa más corto en bytes.

Conor O'Brien
fuente
Noto a (2n) = a (0) · 2ⁿ yb (2n) = n (0) · 2ⁿ, pero eso probablemente no sea útil aquí.
Neil
¿Puede el separador no numérico entre ay bser una nueva línea?
Suever
@Suever No, no puede.
Conor O'Brien el
@ CᴏɴᴏʀO'Bʀɪᴇɴ Gracias por la aclaración!
Suever
1
Devolver una secuencia está bien @guifa
Conor O'Brien

Respuestas:

13

Jalea , 5 bytes

ṄI;Sß

Este es un enfoque recursivo. Debido a la optimización de la cola de llamadas, el único límite es la capacidad de encajar ambos enteros en la memoria. La salida es una lista por línea.

Pruébalo en línea!

Cómo funciona

ṄI;Sß  Main link. Argument: [b[n], a[n]] (n = 0 for original input)

Ṅ      Print [b[n], a[n]] to STDOUT.
 I     Compute the increments of the list, i.e., [a[n] - [b[n]].
   S   Compute the sum of the list, i.e., b[n] + a[n].
  ;    Concatenate the results to the left and to the right.
    ß  Recursively call the main link.
Dennis
fuente
Guau. Eso es bastante impresionante.
Conor O'Brien el
¿Qué significa Main linkrealmente?
gato
44
@cat Es como la función principal de C. Cada línea define una función / enlace diferente, pero la última se llama automáticamente cuando se ejecuta el programa.
Dennis
> Los programas Jelly consisten en hasta 257 caracteres Unicode diferentes. ¿No hay 256 bits en un byte?
thepiercingarrow
@MarkWright y los avances de línea se pueden usar indistintamente. Puede usar ambos en modo UTF-8, pero solo hay \x7fque representarlos en la página de códigos de Jelly.
Dennis
5

Python 2, 31 bytes

def f(a,b):print a,b;f(a+b,a-b)

Imprime para siempre. Bueno, eventualmente excedes el límite de recurrencia, pero eso es una limitación del sistema.

xnor
fuente
¿Cuánto tiempo cree que esto puede continuar antes de que se genere un error de recursión?
R. Kap
@ R.Kap es ~ 1000. Puede establecer este límite a lo que quiera a través desys.setrecursionlimit
Mathias711
@ R.Kap Tarda unos 10 segundos en mi máquina.
xnor
¿10 segundos antes de generar un error de recursión? Guau. En Python 3, dejé que el mío continuara durante 30 minutos seguidos, y no se produjo ningún error. ¡Pude imprimir más de 2000 dígitos para uno de los números! Supongo que un whilebucle se comporta de manera diferente a lo que estás haciendo.
R. Kap
Intenté usar esto con un lambda pero tomó más bytes ( f=lambda a,b:print(a,b)or f(a+b,a-b))
MilkyWay90
5

MATL , 10 bytes

`tDtswPdhT

Esta versión generará un número infinito de elementos en la secuencia más-menos.

Pruébalo en línea! (deténgalo después de ejecutarlo debido al bucle infinito)

Explicación

    % Implicitly grab input as a two-element array [a,b]
`   % do...while loop
tD  % Duplicate and display the top of the stack
ts  % Duplicate [a,b] and add them together
w   % Swap the top two elements on the stack
P   % Swap the order of b and a in preparation for diff
d   % Compute the difference between b and a
h   % Horizontally concatenate [a+b, a-b]
T   % Explicit TRUE to make it an infinite loop
    % Implicit end of the do...while loop
Suever
fuente
¿Esto convierte automáticamente todos los números muy grandes en notación científica?
R. Kap
@ R.Kap Parece que sí. Eso no parece estar explícitamente prohibido en la declaración original del problema.
Suever
Wow, eso es genial. En Python, si tiene números muy grandes, todavía imprime todos los dígitos, uno a la vez, por lo que se vuelve un poco tedioso mirar todo eso. Simplemente pensé que la mayoría de los otros lenguajes también lo hicieron, pero parece que Python es el único en este caso.
R. Kap
Bueno, entonces en MATLAB (que MATL usa debajo del capó), puede cambiar el formato de salida para que sea lo que quiera. El valor predeterminado de MATL es mostrar hasta 15 números antes de cambiar a notación científica.
Suever
OOPS mi malo, lo siento, eliminado;)
thepiercingarrow
3

Haskell, 19 bytes

a#b=a:b:(a+b)#(a-b)

Produce una secuencia infinita de números. Ejemplo de uso:

Prelude> take 20 $ 2#20

[2,20,22,-18,4,40,44,-36,8,80,88,-72,16,160,176,-144,32,320,352,-288]
nimi
fuente
3

Pyth, 10 9 bytes

Gracias a @isaacg por 1 byte.

#=Q,s
Q-F

Imprime una secuencia infinita de pares.

$ pyth plusminus.p <<< "[10,2]" | head -n 15
[10, 2]
[12, 8]
[20, 4]
[24, 16]
[40, 8]
[48, 32]
[80, 16]
[96, 64]
[160, 32]
[192, 128]
[320, 64]
[384, 256]
[640, 128]
[768, 512]
[1280, 256]
PurkkaKoodari
fuente
1
La primera y la última Qs se pueden eliminar: Pyth las rellenará implícitamente.
isaacg
@isaacg ¿Entonces eso se implementó? Guay. Intenté eliminar el primero, pero eso no funcionó.
PurkkaKoodari
Eso es extraño, eliminar el primero funcionó en mi máquina.
isaacg
3

C, 81 bytes

a,b;main(c){for(scanf("%d%d%d",&a,&b,&c);c--;a+=b,b=a-b-b)printf("%d %d\n",a,b);}
MIllIbyte
fuente
3

05AB1E , 7 bytes

Utiliza el método first-k . Ingrese lo siguiente para:

k
[a, b]

Código:

FD=OsƂ

Explicación:

F        # For N in range(0, k).
 D=      # Duplicate top of the stack and print without popping.
   O     # Sum up the array.
    sÆ   # Swap and perform a reduced subtraction.
      ‚  # Pair the top two elements. a, b --> [a, b]

Utiliza la codificación CP-1252 . Pruébalo en línea!

Adnan
fuente
1
El código recuerda vagamente el nombre del idioma ...
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Jajaja, ambos ilegibles
Adnan
3

k, 12

{(+;-).\:x}\

.

k){(+;-).\:x}\[10;10 2]
10  2
12  8
20  4
24  16
40  8
48  32
80  16
96  64
160 32
192 128
320 64

También podría llamarse en forma de

k)10{(+;-).\:x}\10 2
tmartin
fuente
11 bytes
StreetSter
3

APL, 37 caracteres

{⍺←3⊃3↑⍵⋄⎕←z←2↑⍵⋄⍺=1:⋄(⍺-1)∇(+/,-/)z}

Puede ser utilizado como

    {⍺←3⊃3↑⍵⋄⎕←z←2↑⍵⋄⍺=1:⋄(⍺-1)∇(+/,-/)z} 10 2
10 2
12 8
20 4
24 16
40 8
48 32
80 16
[...]

o

      {⍺←3⊃3↑⍵⋄⎕←z←2↑⍵⋄⍺=1:⋄(⍺-1)∇(+/,-/)z} 10 2 6
10 2
12 8
20 4
24 16
40 8
48 32
lstefano
fuente
3

MathGolf , 8 bytes

ô`αp‼+-∟

Pruébalo en línea!

Toma la entrada en orden inverso, pero eso es simplemente porque así es como se empujan a la pila. De lo contrario, sería 1 byte más. 2-3 bytes provienen de la salida. Sin la necesidad de imprimir realmente un par por línea, el programa podría ser æ`‼+-∟(llena la pila con los elementos de la secuencia indefinidamente) o É‼+-∟(imprime todos los elementos de la secuencia excepto el primero para depurar, siempre que la -dbandera esté activa) .

Explicación

ô      ∟   do-while-true
 `         duplicate the top two items
  αp       wrap last two elements in array and print
    ‼      apply next two operators to the top stack elements
     +     pop a, b : push(a+b)
      -    pop a, b : push(a-b)
maxb
fuente
Hola Max. No estoy seguro desde cuándo, pero actualmente la versión de MathGolf en TIO ya no acepta entradas de cadena en absoluto. No importa qué tipo de construcción use, incluso sin ningún código para el programa, si se proporciona una entrada de cadena como para ejemplo ABC, recibo un error en línea stdin = StdIn(line)en el código de Python ..
Kevin Cruijssen
1
@KevinCruijssen ¡Hola! La entrada de cadena se debe dar como 'ABC'o "ABC". Internamente, ast.literal_evalse utiliza para analizar la entrada. Todavía hay algunas peculiaridades que deben ser resueltas, pero debería poder hacer esto .
maxb
Ah de acuerdo, eso tiene sentido. Por cierto, ¿hay una función integrada para dividir una cadena / número en partes de cierto tamaño o alguna cantidad de partes de igual tamaño? Es decir, ABCDEFa [AB, CD, EF]?
Kevin Cruijssen
Nvm, aparentemente no lo hay, pero he podido encontrar una forma de hacerlo: 2ô_2<\1>](codificado para la longitud de entrada 6 y dividido en partes de tamaño 2, ya que eso era lo que necesitaba, pero probablemente debería ser modificable para trabajar con tamaños de entrada genéricos y tamaños de parte).
Kevin Cruijssen
1
/n
2

Python 3.5, 55 43 bytes:

def q(a,b):
 while 1:print(a,b);a,b=a+b,a-b

Imprime la secuencia correcta aparentemente para siempre. ¡He podido dejar que esto continúe durante unos 30 minutos sin que se produzca ningún error, y el programa imprimió 2301 dígitos para el primer número y 1150 dígitos para el segundo! Basado en esto, supongo que, si se le proporciona suficiente hardware para ejecutar, esto puede continuar por MUCHO más tiempo e imprimir MUCHO más dígitos, y también teóricamente no tiene límite de recursión, ¡cortesía del whileciclo!

R. Kap
fuente
Creo que se supone que debes imprimir los valores actuales al comienzo del ciclo, de modo que la primera salida sea la misma que la entrada. Además, como se trata de código de golf, debe optimizar los paréntesis y las variables intermedias. Finalmente, como estilo, creo que deberías considerar nombrar las variables ay bhacer coincidir la pregunta.
Neil
@Neil Gracias por los consejos. :)
R. Kap
Estoy confundido; tienes una whiley una llamada recursiva ahora ...
Neil
@Neil Sí, no me di cuenta de eso. Ahora está arreglado, y solo un ciclo while, teóricamente sin límites de ningún tipo.
R. Kap
2

Reng v.3.2, 9 bytes (auto-respuesta, no competitiva)

ii¤ææö±2.

Toma dos entradas ( a b) y salidas b a. Pruébalo aquí!

itoma la entrada dos veces, ¤duplica la pila, æimprime un número y un espacio (y lo hace dos veces, hay dos), öimprime una nueva línea, ±hace lo que podría esperar y 2.omite los siguientes dos caracteres, envolviendo la entrada obteniendo caracteres.

Conor O'Brien
fuente
2
Hmm, ¿te importaría explicar lo que cada uno de esos jeroglíficos le hace a un novato como yo? :)
Kevin Cruijssen
@KevinCruijssen He explicado el misterio. :)
Conor O'Brien
2

Python 2.7, 56 , 42 bytes:

a,b=input()
while 1:print a,b;a,b=a+b,a-b

Bucle simple que se imprime para siempre (ish).

Serdalis
fuente
Puede usar un solo espacio para el nivel de sangría para guardar bytes. Además, no tiene que hacer ambos métodos, solo uno u otro, por lo que puede eliminar el parámetro predeterminado.
Conor O'Brien
Oh, maldita sea, no noté que el bloc de notas estaba haciendo mi pestaña en 4 espacios, y seguro que lo restringiré a uno, gracias.
Serdalis
Si convierte esto en un programa cambiando la primera línea a a,b=input(), puede eliminar la sangría.
xnor
@xnor ¡Gracias, solo ahorra 1 byte pero ya no es feo!
Serdalis
2

Lote, 54 bytes

@echo %1 %2
@set/aa=%1+%2
@set/ab=%1-%2
@%0 %a% %b%

Tenga en cuenta que CMD.EXE está limitado a enteros con signo de 32 bits, por lo que se desbordará rápidamente e imprimirá mensajes basura y de error.

Neil
fuente
1
¡Siempre me encanta ver una respuesta por lotes por aquí! : D
Conor O'Brien el
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Lo escribí especialmente para ti.
Neil
2

Julia, 25 bytes

a<|b=[a b]|>show<a+b<|a-b

Máximo abuso de sintaxis. Julia es rara . Pruébalo en línea!

Versión alternativa, 29 bytes.

Tenga en cuenta que la salida eventualmente se desbordará a menos que llame <|a un BigInt . Desafortunadamente, showprefijará cada matriz con BigInten este caso. A costa de cuatro bytes más, podemos generar resultados separados por espacios en blanco para todos los tipos numéricos.

a<|b="$a $b
"|>print<a+b<|a-b

Pruébalo en línea!

Cómo funciona

Definimos el operador binario <|para fines externos. No está definido en las versiones recientes de Julia, pero el analizador aún lo reconoce como operador. Si bien \(no está definido explícitamente para enteros) es un byte más corto, su alta prioridad requeriría reemplazarse a+b<|a-bcon (a+b)\(a-b)(+3 bytes) o \(a+b,a-b)(+2 bytes).

Cuando a<|bse ejecuta, comienza llamando showa print [ab] a STDOUT. Luego, a+b<|a-brecurrentemente recurre <|a la suma o la diferencia.

Como la recursividad es (se supone que es) infinita, la comparación <nunca se realiza; Su único propósito es encadenar las dos partes del código. Esto ahorra dos bytes sobre la alternativa más sencilla ([a b]|>show;a+b<|a-b).

Dennis
fuente
2

Perl 6 , 23 bytes (infinito)

Editar: gracias a JoKing, la versión de secuencia ahora es la más corta (también eliminada .saypor aclaración de OP:

{@_,{.sum,[-] |$_}...*}

TIO: InfiniteSeq

Antigua respuesta funcional

->\a,\b {(a,b).say;f(a+b,a -b)}

TIO: InfiniteFunc

Tenga en cuenta que Perl 6 no tiene límite de recursión per se, se basa únicamente en la memoria disponible, por lo que alcanzará los millones antes de bombardear.

usuario0721090601
fuente
23 bytes para infinito
Jo King
@ Bromas: ¡Qué bien! Me siento bastante tonto por no pensar en .sum. Creo que los requisitos obligan a la salida en la función (he pedido aclaraciones, pero la mayoría de los demás parecen tener eso, eso da 28 con tio.run/##K0gtyjH7n1upoJamYPu/… )
user0721090601
1

Factor, 62 bytes

:: f ( a b -- x ) a b "%s %s" printf a b + a b - f ; recursive

recursive, o bien la pila de llamadas se agota demasiado rápido.

gato
fuente
1

Rubí, 25 bytes

Basado en la solución Python de xnor . Quizás haga un generador en otra respuesta, pero esto imprimirá a, luego b, lo nuevo a, luego lo nuevo b, hasta el infinito.

f=->a,b{p a,b;f[a+b,a-b]}
Sherlock9
fuente
1

Python 3, 42 bytes

Quería escribir un generador para esta función, y así lo hice.

def f(a,b):
 while 1:yield a,b;a,b=a+b,a-b

En Python 3, la secuencia se genera de esta manera:

>>> gen = f(2, 20)
>>> next(gen)
(2, 20)
>>> next(gen)
(22, -18)
>>> next(gen)
(4, 40)
>>> next(gen)
(44, -36)
>>> next(gen)
(8, 80)
Sherlock9
fuente
1

Lisp común, 57

(lambda(a b)(loop(print`(,a,b))(psetf a(+ a b)b(- a b))))

Usos psetf, que afectan los valores de las variables en paralelo, y la loopsintaxis simple .

volcado de memoria
fuente
1

bash + GNU coreutils, 75 bytes

a=$1
b=$2
for i in `seq $3`;{ echo -e "$a\t$b";c=$a;a=$((c+b));b=$((c-b));}

Invocación:

./codegolf.sh 2 10 5
rexkogitans
fuente
1

CP / M 8080, 47 bytes

z80 mnemónicos pero nada que no tenga el 8080, comentó la fuente una vez que decidí contar la salida en lugar de la entrada, pero conservaron los nombres de funciones concisos, ensamblados a mano, así que perdone los 'xx' donde sé la cantidad de bytes pero no funcionó las direcciones de salida o compensaciones:

# setup
ld c, 2     0e 02

# loop
.s

# update H (temporarily in B)
ld a, h     7c
add l       85
daa         27
ld b, a     46

# update L
ld a, h     7c
sub l       95
daa         27
ld l, a     6f

# copy B back to H, output H
ld h, b     60
call +o     cd xx xx

# output L
ld b, l     45
call +o     cd xx xx

# repeat
jr -s       18 xx

# output a two-digit BCD value followed by a space
.o

# output high digit
ld a, b     78
rra         1f
rra         1f
rra         1f
rra         1f
call +ob    cd xx xx

# output low digit
ld a, b     78
call +ob    cd xx xx

# output a space
ld e, #$20  1e 20
call 5      cd 00 05

# return
ret         c9

# output a single BCD digit
.ob
and #$f     e6 0f
add #$30    c6 30
ld e, a     5f
call 5      cd 00 05
ret         c9
Tommy
fuente
1

Clojure, 44 bytes

#(iterate(fn[[a b]][(+ a b)(- a b)])[%1 %2])

Función que produce una secuencia perezosa infinita.

MattPutnam
fuente
1

Perl 5, 40 bytes

requiere -E(gratis)

sub a{say"@_";($c,$d)=@_;a($c+$d,$c-$d)}

o (misma longitud)

$_=<>;{say;/ /;$_=$`+$'.$".($`-$');redo}

(He tachado este último porque debería tener errores de redondeo para algunas iteraciones).

Punta de sombrero.

Pero sospecho que debe haber una solución Perl 5 más corta.

msh210
fuente
1
Si hay una solución más corta, Ton Hospel la encontrará. : P
Conor O'Brien el
Tomó un tiempo, pero encontré un camino más corto:
Xcali
1

RETORNO , 21 bytes

[¤.' ,$.'
,¤¤+2ª-F]=F

Try it here.

Operador recursivo-lambda. Uso:

[¤.' ,$.'
,¤¤+2ª-F]=F10 2F

Explicación

[                 ]=F  declare function F for recursion
 ¤.' ,$.'␊,            output top 2 stack items along with trailing newline
           ¤¤+2ª-      get plus and minus of top 2 stack items
                 F     recurse!
Mama Fun Roll
fuente
1

> <> , 26 bytes

:?!;1-r:n48*o:@@:nao:@+}-$

Llamada con a, b, nen la pila, donde nes el número de vueltas o un valor negativo para la salida infinito. Salidas ay bseparadas por un espacio.

Como explicación, así es como evoluciona la pila durante el tiempo de ejecución:

abn
nba
nbaa
naab
naabb
nabab
nab+
+nab
+n-
+-n

Puede probarlo en el intérprete en línea con una cantidad positiva de turnos, pero deberá usar el intérprete oficial de Python para probar el modo infinito.

$ python fish.py -c ':?!;1-r:n48*o:@@:nao:@+}-$' -t 0.01 -v 10 2 -1
10 2
12 8
20 4
24 16
40 8
48 32
80 16
96 64
160 32
192 128
320 64
384 256
640 128
768 512
1280 256
1536 1024
2560 512
3072 2048
5120 1024
6144 4096
10240 2048
12288 8192
20480 4096
24576 16384
40960 8192
49152 32768
81920 16384
98304 65536
163840 32768
196608 131072
327680 65536
393216 262144
655360 131072
786432 524288
1310720 262144
[...]
Aaron
fuente
1

Fuzzy Octo Guacamole , 17 16 bytes

(no competidor, utiliza características posteriores al desafío)

^^(:C.Zs.aZ.s.-)

Esto fue difícil de hacer, debido a errores del lado del cliente. Pero lo tengo!

Tutorial:

^^                # Get input twice, pushes it to the stack.
  (               # Start a infinite loop.
   :              # Prints the stack, and since it has [a,b] is just the output.
    C             # Copy the active stack to the inactive stack.
     .            # Shift the active stack.
      Z           # Reverse the stack.
       s          # Move the top item on the active stack to the top of the inactive.
        .         # Switch stacks again.
         a        # Add the top 2 items, giving the first new item.
          Z       # Reverse the stack, so we keep the 'a' safe and prepare for the 'b'.
           .      # Switch stacks.
            s     # Move the top item on the active stack to the top of the inactive stack.
             .    # Switch stacks.
              -   # Minus the top 2 items, giving 'b'.
               )  # End infinite loop.
Rɪᴋᴇʀ
fuente
No conozco muy bien FOG, pero ¿no puedes moverlo :al comienzo del ciclo y eliminar la necesidad de imprimir dos veces?
Conor O'Brien
oooooh @ CᴏɴᴏʀO'Bʀɪᴇɴ gracias.
Rɪᴋᴇʀ
No olvide actualizar la explicación;)
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ, ¿qué quieres decir? : P
Rɪᴋᴇʀ
1

En serio, 12 bytes

,,1WX■@│+)-1

Emite un flujo infinito, el formato es b(n) a(n), un par de salidas por línea.

No hay enlace en línea porque TryItOnline no funciona muy bien con bucles infinitos.

Explicación:

,,1WX■@│+)-1
,,1           push a(0), push b(0), push 1
   W          while loop:
    X           discard the 1 (only used to make sure the while loop always runs)
     ■          print all stack elements, separated by spaces, without popping
      @│        swap, duplicate entire stack
        +)      push a(n) + b(n) (a(n+1)) and move it to the bottom of the stack
          -     push a(n) - b(n) (b(n+1))
           1    push 1 to make sure the loop continues
Mego
fuente
1

J, 16 12 bytes

0&(]+/,-/)~<

Produce solo los primeros k valores para la secuencia en función de las semillas dadas.

Guardado 4 bytes usando el truco (o azúcar sintáctico) que muestra @randomra en este comentario .

Uso

   f =: 0&(]+/,-/)~<
   2 20 f 10
  2   20
 22  _18
  4   40
 44  _36
  8   80
 88  _72
 16  160
176 _144
 32  320
352 _288
millas
fuente
1

C #, 50 bytes

f=(a,b)=>{Console.WriteLine(a+" "+b);f(a+b,a-b);};

Fuente completa, incluido el caso de prueba:

using System;
using System.Numerics;

namespace PlusMinusSequence
{
    class Program
    {
        static void Main(string[] args)
        {
            Action<BigInteger,BigInteger>f=null;
            f=(a,b)=>{Console.WriteLine(a+" "+b);f(a+b,a-b);};
            BigInteger x=10, y=2;
            f(x,y);
        }
    }
}

El tipo de datos BigInteger se usa para que los números no se desborden y se conviertan en 0. Sin embargo, dado que es una solución recursiva, espere un desbordamiento de la pila.

adrianmp
fuente