Haskell tiene esta característica ordenada (de aspecto) donde puede darle tres números y puede inferir una secuencia aritmética a partir de ellos. Por ejemplo, [1, 3..27]
es equivalente a [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]
.
Eso es genial y todas las secuencias aritméticas son limitadas. Además, pfft . La multiplicación está donde está. ¿No sería más genial si hiciera secuencias geométricas como [1, 3..27]
regresar [1, 3, 9, 27]
?
Desafío
Escriba un programa / función que tome tres enteros positivos a , byc y produzca salidas donde x es el mayor entero ≤ c que se puede representar como donde n es un entero positivo.[a, b, b × (b ÷ a), b × (b ÷ a)2, ..., x]
b × (b ÷ a)n
Es decir, la salida debe ser r , de modo que:
r0 = a
r1 = b
rn = b × (b ÷ a)n-1
rlast = greatest integer ≤ c that can be represented as b × (b ÷ a)n
where n is a positive integer
Especificaciones
- Normas estándar de E / S se aplican .
- Las lagunas estándar están prohibidas .
- b siempre será divisible por a .
- a < b ≤ c
- Este desafío no se trata de encontrar el enfoque más corto en todos los idiomas, sino de encontrar el enfoque más corto en cada idioma .
- Su código se puntuará en bytes , generalmente en la codificación UTF-8, a menos que se especifique lo contrario.
- Las funciones integradas (Mathematica podría tener una: P) que calculan esta secuencia están permitidas, pero se recomienda incluir una solución que no se base en una función integrada.
- Se alientan las explicaciones, incluso para los idiomas "prácticos" .
Casos de prueba
a b c r
1 2 11 [1, 2, 4, 8]
2 6 100 [2, 6, 18, 54]
3 12 57 [3, 12, 48]
4 20 253 [4, 20, 100]
5 25 625 [5, 25, 125, 625]
6 42 42 [6, 42]
En algunos formatos mejores:
1 2 11
2 6 100
3 12 57
4 20 253
5 25 625
6 42 42
1, 2, 11
2, 6, 100
3, 12, 57
4, 20, 253
5, 25, 625
6, 42, 42
Respuestas:
Casco , 8 bytes
La entrada está en el orden b, c, a . Pruébalo en línea!
Explicación
El flujo de control en este programa es un poco difícil de seguir. Primero, b se alimenta a la derecha
/
, produciendo una función/b
que se divide por b . A continuación,~
se divide el programa restante en tres partes:~(↑)(≤)(Ṡ¡o//b)
. Esto alimenta c to≤
y a toṠ¡o//b
, y combina los resultados con↑
. El resultado de≤c
es una función que comprueba si su argumento es como máximo c , y↑≤c
toma el prefijo más largo de elementos para los que esto es válido.Queda por mostrar cómo se
(Ṡ¡o//b)a
evalúa la lista infinita deseada. La parte entre paréntesis se divide enṠ(¡)(o//b)
. LuegoṠ
alimenta un too//b
, alimenta el resultado¡
ay luego da un a su segundo argumento. La expresión(o//b)a
da una función que toma un número y lo divide por a / b , e¡
itera esta función en su segundo argumento, que es a .Aquí hay una serie de transformaciones que visualizan la explicación:
Solución alternativa utilizando variables explícitas en orden a, b, c :
fuente
Python 2 , 42 bytes
Pruébalo en línea!
Enfoque recursivo,
4241 bytes-1 byte gracias a ovs
Pruébalo en línea!
fuente
Protón , 35 bytes
Pruébalo en línea!
fuente
JavaScript (ES6),
4137 bytesGuardado 4 bytes gracias a @Neil
Toma entrada como
(b,c)(a)
.Casos de prueba
Mostrar fragmento de código
Comentado
fuente
(b,c)=>g=a=>a>c?[]:[a,...g(b,b*=b/a)]
.Pari / GP , 38 bytes
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 22 bytes
Pruébalo en línea!
fuente
Python 3,
93907473 bytesPruébalo en línea
¡Gracias a Rod y user202729 por ayudarme a reducir algunos bytes!
fuente
def + return -> lambda
. Consejos de Python.import*
.while i<=c:i++
(en lugar de lista de comprensión + registro) para guardar muchos bytesOctava ,
3835 bytesPruébalo en línea!
Resulta que el enfoque MATL de @ LuisMendo también ahorra 3 bytes en Octave, a pesar de repetir
log
tres veces.fuente
Perl 6 ,
2624 bytesPruébalo en línea!
El operador de secuencia de Perl 6
...
puede inferir series geométricas de forma nativa.Actualización: ... Puede , pero en esta situación no inferirlo es un poco más corto.
fuente
05AB1E , 12 bytes
Entrada en el orden
c,b,a
Pruébalo en línea!
Explicación
fuente
MATL , 17 bytes
Pruébalo en línea!
Solo para que la pelota ruede en MATL. No puedo imaginar que no haya una forma menos detallada de resolver esto.
fuente
Haskell, 35 bytes
Pruébalo en línea!
fuente
exp<$>[...]
)MATL , 12 bytes
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
a
yc
(tengo muchos intentos fallidos desde el principioy/i
), pero al usar este método, mantienes todo junto.Perl, 38 bytes
Incluir
+3
para-n
(eluse 5.10.0
para desbloquear las características de Perl 5.10 es gratis)Luego corre como:
fuente
Rojo , 50 bytes
Pruébalo en línea!
fuente
Japt , 14 bytes
Intentalo
Explicación
fuente
Limpio , 63 bytes
Pruébalo en línea!
fuente
TI-BASIC, 31 bytes
Toma la entrada del usuario y las salidas
Ans
. Resolví n en c = b n / a n-1 , obteniendo n = 1 + ln (c / b) / ln (b / a). Eso es lo mismo que n = 1 + log b / a (c / b). A los fines del golf, comienzo mi secuencia en -1 y la finalizo en n-1 en lugar de 0 en n.fuente
APL (Dyalog Unicode) , 38 bytes
Pruébalo en línea!
Prefijo Dfn. Toma de entrada con el fin
a b c
, y los usos⎕IO←0
( I ndex O rigin)Gracias a @ErikTheOutgolfer por eliminar 6 bytes de esto incluso antes de publicarlo.
¿Cómo?
fuente
Stax , 14 bytes CP437
16 bytes cuando está desempaquetado,
¡Ejecute y depure en línea!
Toma entrada en forma de
[b, a, c]
.Estoy bastante seguro de que @recursive tiene mejores soluciones.
Explicación
fuente
SILOS , 73 bytes
Pruébalo en línea!
Leemos los tres números. Calcule la razón común por el segundo número / primero. Luego corremos a través de la serie hasta que somos mayores que el límite superior.
fuente
C (gcc), 82 bytes
Pruébalo en línea!
Calcula e imprime
r_n = b^n/a^(n-1)
hastar_n > c
.Debe ser compilado con
-lm
!fuente
n;f(a,b,c){for(float r=n=0;r=pow(b/a,n++)*a,r<=c&&printf("%f ",r););}
APL (Dyalog) , 23 bytes ( SBCS )
Esto toma argumentos ab a la izquierda yc a la derecha,
Pruébalo en línea!
Probablemente hay un camino más corto, pero pensé que
÷\
era lindo.Explicado:
{...}
La función anónima ⍺ esa b
,⍵
esc
. Digamosa b c = 2 6 100
⌽⍺
Reverso⍺
:6 2
⍵⍴
Repetir⍵
tiempos:6 2 6 2 6 2 6 2 ...
÷\
Reducir por división en prefijos:6 (6÷2) (6÷(2÷6)) (6÷(2÷(6÷2))).. = 6 3 18 9 54 ..
⍺,
Anteponer⍺
:2 6 6 3 18 9 54 27 162 81 ...
⊣/⍵2⍴
Obtenga todos los demás elementos (más algunas repeticiones finales):⍵2⍴
Haga una⍵
fila,2
matriz de columna de2 6 6 3 18 9 54 ...
⊣/
Obtén la primera columna⊆⊢
Dividir la matriz en bloques donde⍵∘≥
⍵
es mayor o igual que todos los elementos⊃
Toma el primer bloquefuente