Haskell possui esse recurso elegante (de aparência), onde você pode fornecer três números e inferir uma sequência aritmética deles. Por exemplo, [1, 3..27]
é equivalente a [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]
.
Isso é legal e quase todas as seqüências aritméticas são bastante limitantes. Além disso, pfft . A multiplicação é onde está. Não seria mais legal fazer sequências geométricas como [1, 3..27]
retornar [1, 3, 9, 27]
?
Desafio
Escrever um programa / função que leva três números inteiros positivos um , b , e c e saídas , onde x é o número inteiro maior ≤ c que pode ser representado como onde n é um número inteiro positivo.[a, b, b × (b ÷ a), b × (b ÷ a)2, ..., x]
b × (b ÷ a)n
Ou seja, a saída deve 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
Especificações
- Aplicam- se as regras de E / S padrão .
- As brechas padrão são proibidas .
- b sempre será divisível por a .
- a < b ≤ c
- Esse desafio não é encontrar a abordagem mais curta em todos os idiomas, mas sim encontrar a abordagem mais curta em cada idioma .
- Seu código será pontuado em bytes , geralmente na codificação UTF-8, a menos que especificado de outra forma.
- Funções internas (o Mathematica pode ter uma: P) que calculam essa sequência são permitidas, mas é recomendável incluir uma solução que não dependa de uma embutida.
- Explicações, mesmo para idiomas "práticos", são incentivadas .
Casos de teste
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]
Em alguns formatos melhores:
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
Respostas:
Casca , 8 bytes
A entrada está na ordem b, c, a . Experimente online!
Explicação
O fluxo de controle neste programa é um pouco difícil de seguir. Primeiro, b é alimentado à direita
/
, produzindo uma função/b
que divide por b . Em seguida,~
divide o restante do programa em três partes:~(↑)(≤)(Ṡ¡o//b)
. Isso alimenta c para≤
e a paraṠ¡o//b
e combina os resultados com↑
. O resultado de≤c
é uma função que verifica se seu argumento é no máximo c e↑≤c
usa o prefixo mais longo dos elementos para os quais isso se aplica.Resta mostrar como é
(Ṡ¡o//b)a
avaliada a lista infinita desejada. A parte entre parênteses é dividida emṠ(¡)(o//b)
. Em seguida,Ṡ
alimenta a parao//b
, alimenta o resultado para¡
e, em seguida, fornece um para seu segundo argumento. A expressão(o//b)a
fornece uma função que pega um número e o divide por a / b , e¡
itera essa função em seu segundo argumento, que é a .Aqui está uma série de transformações que visualizam a explicação:
Solução alternativa usando variáveis explícitas na ordem a, b, c :
fonte
Python 2 , 42 bytes
Experimente online!
Abordagem recursiva,
4241 bytes-1 byte graças a ovs
Experimente online!
fonte
Próton , 35 bytes
Experimente online!
fonte
JavaScript (ES6),
4137 bytesGuardado 4 bytes graças a @Neil
Toma entrada como
(b,c)(a)
.Casos de teste
Mostrar snippet de código
Comentado
fonte
(b,c)=>g=a=>a>c?[]:[a,...g(b,b*=b/a)]
.Pari / GP , 38 bytes
Experimente online!
fonte
Wolfram Language (Mathematica) , 22 bytes
Experimente online!
fonte
Python 3,
93907473 bytesExperimente Online
Obrigado a Rod e user202729 por me ajudarem a reduzir alguns bytes!
fonte
def + return -> lambda
. Dicas de Python.import*
.while i<=c:i++
(em vez disso, lista compreensão + log) para salvar muitos bytes #Oitava ,
3835 bytesExperimente online!
Acontece que a abordagem MATL do @ LuisMendo também salva 3 bytes no Octave, apesar de repetir
log
três vezes.fonte
Perl 6 ,
2624 bytesExperimente online!
O operador de sequência do Perl 6
...
pode inferir séries geométricas nativamente.Atualização: ... Pode , mas nesta situação, sem inferir, é um pouco menor.
fonte
05AB1E , 12 bytes
Entrada na ordem
c,b,a
Experimente online!
Explicação
fonte
MATL , 17 bytes
Experimente online!
Apenas para fazer a bola rolar no MATL. Não consigo imaginar que não exista uma maneira menos detalhada de resolver isso.
fonte
Haskell, 35 bytes
Experimente online!
fonte
exp<$>[...]
)MATL , 12 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
a
ec
(tenho muitas tentativas fracassadasy/i
), mas, usando esse método, você mantém tudo organizado.Perl, 38 bytes
Incluir
+3
para-n
(ouse 5.10.0
para desbloquear os recursos do perl 5.10 é gratuito)Em seguida, execute como:
fonte
Vermelho , 50 bytes
Experimente online!
fonte
Japonês , 14 bytes
Tente
Explicação
fonte
Limpo , 63 bytes
Experimente online!
fonte
TI-BASIC, 31 bytes
Recebe a entrada do usuário e produz
Ans
. Resolvi para n em c = b n / a n-1 , obtendo n = 1 + ln (c / b) / ln (b / a). É o mesmo que n = 1 + log b / a (c / b). Para fins de golfe, inicio minha sequência em -1 e finalizo em n-1 em vez de 0 a n.fonte
APL (Dyalog Unicode) , 38 bytes
Experimente online!
Prefixo Dfn. Toma entrada em ordem
a b c
e usa⎕IO←0
( I ndex O rigin)Agradeço a @ErikTheOutgolfer por remover 6 bytes disso antes mesmo de eu o publicar.
Quão?
fonte
Stax , 14 bytes CP437
16 bytes quando descompactado,
Execute e depure online!
Recebe entrada na forma de
[b, a, c]
.Certamente @recursive tem melhores soluções.
Explicação
fonte
SILOS , 73 bytes
Experimente online!
Lemos os três números. Calcule a relação comum pelo segundo número / primeiro. Em seguida, percorremos a série até chegarmos ao limite superior.
fonte
C (gcc), 82 bytes
Experimente online!
Calcula e imprime
r_n = b^n/a^(n-1)
atér_n > c
.Deve ser compilado com
-lm
!fonte
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 )
Isso leva os argumentos ab à esquerda ec à direita,
Experimente online!
Provavelmente existe uma maneira mais curta, mas eu pensei que
÷\
era fofo.Explicado:
{...}
Função anônima ⍺ éa b
,⍵
éc
. Digamosa b c = 2 6 100
⌽⍺
Reverso⍺
:6 2
⍵⍴
⍵
Tempos de repetição :6 2 6 2 6 2 6 2 ...
÷\
Reduza por divisão nos prefixos:6 (6÷2) (6÷(2÷6)) (6÷(2÷(6÷2))).. = 6 3 18 9 54 ..
⍺,
Anexar⍺
:2 6 6 3 18 9 54 27 162 81 ...
⊣/⍵2⍴
Obtenha todos os outros elementos (mais algumas repetições à direita):⍵2⍴
Faça uma⍵
linha,2
matriz de coluna de2 6 6 3 18 9 54 ...
⊣/
Obter a primeira coluna⊆⊢
Divida a matriz em blocos onde⍵∘≥
⍵
é maior ou igual a todos os elementos⊃
Pegue o primeiro bloco desse tipofonte