Dado dois inteiros positivos p e q , sua tarefa é voltar a matriz A criado por aplicar o seguinte algoritmo:
- Iniciar com A = [P, Q] e d = 2
- Para cada par (x, y) de números contíguos em A cuja soma é divisível por d , insira (x + y) / d entre x e y .
- Se pelo menos um par correspondente foi encontrado, aumente d e prossiga com a etapa 2. Caso contrário, parada e retorno A .
Exemplo
Abaixo está o detalhe do processo para p = 1 e q = 21 .
1 21 | Iteration #1: we start with d = 2 and A = [1, 21]
\/ | 1 + 21 is divisible by 2 -> we insert 11
22/2=11 |
|
1 11 21 | Iteration #2: d = 3, A = [1, 11, 21]
\/ | 1 + 11 is divisible by 3 -> we insert 4
12/3=4 |
|
1 4 11 21 | Iteration #3: d = 4, A = [1, 4, 11, 21]
\/ | 11 + 21 is divisible by 4 -> we insert 8
32/4=8 |
|
1 4 11 8 21 | Iteration #4: d = 5, A = [1, 4, 11, 8, 21]
\/ \/ | 1 + 4 is divisible by 5 -> we insert 1
5/5=1 15/5=3 | 4 + 11 is divisible by 5 -> we insert 3
|
1 1 4 3 11 8 21 | Iteration #5: d = 6, A = [1, 1, 4, 3, 11, 8, 21]
| no sum of two contiguous numbers is divisible by 6
| -> we stop here
Daí a saída esperada: [1, 1, 4, 3, 11, 8, 21]
Esclarecimentos e regras
- Entrada e saída podem ser manipuladas em qualquer formato razoável. O inteiros p e q são garantidos para ser maior que 0. Se isso ajuda, você pode assumir q ≥ p .
- A segunda etapa do algoritmo não deve ser aplicada recursivamente aos elementos que foram inseridos na mesma iteração. Por exemplo, A = [1, 1] e d = 2 devem levar a [1, 1, 1] (não uma lista infinita de 1's).
- Isso é código-golfe , então a resposta mais curta em bytes vence!
Casos de teste
p | q | Output
----+-----+-------------------------------------------------------------------------------
1 | 1 | [1,1,1]
1 | 2 | [1,2]
1 | 3 | [1,1,2,3]
2 | 6 | [2,1,2,1,4,1,2,6]
3 | 13 | [3,1,8,1,3,1,7,1,2,1,5,1,3,2,13]
9 | 9 | [9,6,9,6,9]
60 | 68 | [60,13,1,4,31,2,3,5,2,19,64,7,13,1,2,5,2,27,44,3,4,8,2,1,12,1,5,3,28,2,4,16,1,
| | 2,12,1,2,1,10,1,6,68]
144 | 336 | [144,68,3,4,8,1,12,1,4,2,28,13,128,44,17,92,240,58,108,5,17,1,2,5,3,28,3,1,11,
| | 60,3,6,2,42,2,4,26,192,54,132,7,1,15,1,3,1,18,1,4,2,30,3,1,12,1,9,78,46,336]
Se você deseja testar seu código em um caso de teste um pouco maior, veja a saída esperada para:
- p = 12096 (2 6 * 3 3 * 7)
- q = 24192 (2 7 * 3 3 * 7)
code-golf
array-manipulation
Arnauld
fonte
fonte
ü
funciona ... isso me permitiu melhorar uma das minhas respostas anteriores :-)[1,2,3,4] ü = [[1,2],[2,3],[3,4]]
, também se você adicionar "-d" nos argumentos ao executar o 05AB1E, ele produzirá a saída "debug" que eu anexei acima. (Adicionado o link de depuração acima também). A razão pela qual o pairwise é elegante é que, para os comandos que vetorizam automaticamente, ele apenas aplica o comando pairwise (a execuçãoü)
em uma lista mostra isso muito bem).-d
... eu descobri isso tarde demais, depois de "depurar" com,q
"imprimir e parar". Foi doloroso.=
porque ele não aparece e apenas imprime o último item enviado para a pilha.U
poderá substituirX
porŠ
.Mathematica,
72645958 bytesExperimente online!
Como funciona
Tomamos a entrada como uma lista
{p,q}
. A etapa de iteração é reformulada como:(a+b)/d
entre cada dois elementosa
eb
:(x+{##2,}&@@x)
calcula a sequência dea+b
's, com uma+Null
no final. Dividimos pord
eRiffle
insere cada um(a+b)/d
entrea
eb
. Incrementod
.Integer
elementos da lista resultante. (Isso também se livra doNull
introduzido por{##2,}
.)Isso é repetido até que o resultado não seja alterado (o que só pode acontecer porque removemos todos os novos elementos, porque nenhum deles era inteiro).
-8 bytes graças a @MartinEnder de usar em
//.
vez deFixedPoint
(e de receber entrada como uma lista).-6 a mais porque
ListConvolve
na verdade não é tão bomfonte
//.
trunfosFixedPoint
, e eu tinha acabado de tirar a entrada como um par de números inteiros em vez de dois inteiros separados:(d=2;#//.x_:>x~Riffle~ListConvolve[{1,1}/d++,x]~Cases~_Integer)&
//.
comFixedPoint
, porque eu realmente gosto muitoFixedPoint
.Integer
.Ruby , 80 bytes
Experimente online!
Função recursiva que recebe
f
entrada como matriz[p, q]
.fonte
Haskell,
8581 bytesExperimente online!
A entrada é tomada como uma lista, por exemplo
[1,2]
.Edit: -4 bytes graças a @Laikoni.
fonte
l%d|l==l#d=l|e<-d+1=l#d%e
.Python 2 ,
112110108105103 bytes-2 bytes graças a Jonathan Frech
-5 bytes graças a Erik, o Outgolfer
Experimente online!
fonte
y+=[...]*(...);y+=b,
equivalente ay+=[...]*(...)+[b]
?Python 2 , 98 bytes
Invocar como
f([p,q])
. Experimente online!Jonathan Allan salvou 12 bytes. Obrigado ~!
Explicação
f
é uma função recursiva:f(A, B, d)
avalia paraf(next_A, A, d+1)
, a menos queA == B
, nesse caso, ele retornaA
. (Isso é tratado porA*(A==B)or …
: se A ≠ B,A*(A==B)
é a lista vazia, que é falso-y, a…
parte é avaliada; se A = B entãoA*(A==B)
éA
, o que não está vazio e, portanto, é verdade, e é retornado.)next_A
é calculado como:Isso é melhor explicado pelo exemplo. Quando por exemplo
d = 5
eA = [1, 4, 11, 8, 21]
:fonte
zip
no lugar da enumeração e usando[A[0]]
como osum
valor inicial do.[A[0]]
comA[:1]
:)A*(A==B)
.Python 2 , 111 bytes
Experimente online!
-8 graças a Rod .
-2 graças a Lynn .
fonte
i
ea[x:x]
é menor do quea.insert
o
: pzip
e salve dois bytes !for
loop inteiro porwhile A[o+1:]:o+=1;s=A[o-1]+A[o];b=s%d<1;A[o:o]=[s/d]*b;m|=b;o+=b
Casca , 22 bytes
Pega uma lista de 2 elementos, retorna uma lista de números inteiros e flutuantes. Experimente online!
Explicação
fonte
Perl 5 , 92 + 1 (
-a
) = 93 bytesExperimente online!
fonte
Retina , 111 bytes
Experimente online!
Toma a entrada como números separados por espaço. Ingenuamente segue o algoritmo dado, com a única técnica notável sendo o uso de um símbolo de marcador
a
, para observar quando algum dos números foi mantido. Isso é usado para trabalhar com os recursos de loop um tanto limitados do Retina, que permitem apenas fazer loop até que um conjunto de estágios não faça nenhuma alteração geral na entrada desses estágios.Explicação:
Isso usará o mesmo exemplo da pergunta.
Como alteramos a matriz de entrada de números em uma matriz unírica separada por ponto e vírgula, teríamos:
Coloque
d
nosso código no começo, fornecendo-nos:Isso é um pouco mais complicado.
{
inicia um grupo de estágios que serão executados até atingirem um ponto fixo. Em seguida,+
indica que esse estágio em si deve ser executado até um ponto fixo. Esse estágio adiciona cada par de números adjacentes, mas os insere sem o ponto e vírgula adicional. Agora teríamos:O outro estágio complicado, esse acumula nosso divisor no primeiro grupo de capturas e substitui qualquer número em nossa lista sem um ponto e vírgula à direita com esse número dividido por
d
. Também adicionamos um lídera
a esses números, para indicar que algo foi mantido, juntamente com o;
para indicar que ele deve fazer parte permanente da matriz. Agora teríamos:Isso exclui números que não eram divisíveis
d
nem na matriz antes desta rodada. Isso não altera o nosso exemplo.Isso corresponde com avidez desde o início da string até a última letra
a
da entrada. Isso significa que pode haver no máximo uma partida. Se fizermos alterações, adicionamos uma ad
, caso contrário, deixamos a mesma para que possamos sair do loop.O
)
fechamento do loop é iniciado por{
(não questione!); Caso contrário, esse estágio apenas remove os marcadores que colocamos anteriormente. Como este é o fim do loop, repetiríamos as etapas acima muitas vezes, no entanto, continuarei como se tivesse esquecido o loop, pois isso torna o exemplo mais contínuo.Esta etapa remove de nossa saída:
Esta etapa substitui os números unários por números decimais:
A etapa final elimina os pontos e vírgulas:
Obviamente, pular o loop nos faz ter um resultado incorreto aqui, mas espero que não seja muito confuso.
fonte
JavaScript (ES6),
898782 bytesObrigado @Arnauld por -2 bytes e por ajudar a economizar mais 5 bytes.
Toma entrada como uma matriz:
f([p,q])
.Casos de teste
fonte
v
(v+=b[++i]
) em vez de usars
para salvar 1 byte. Você pode salvar outro byte em|r
vez de&&r
(acho que é seguro, mas não verifiquei duas vezes).|r
realmente passou todos os casos de teste.push()
.push
apenas uma vez em vez de duas; depois de revisitar essa ideia, cheguei a isso por 86 bytes. Talvez isso possa ser melhorado?push(v,...)
e usarv+=
novamente para 84 bytes .Röda , 90 bytes
Experimente online!
fonte
Java 8, 180 bytes
Explicação:
Experimente aqui.
fonte
C #, 280 bytes
Primeira tentativa de código de golfe, que é todo o programa. Teste-o
Tentativa 2, 159 bytes
Retirando o andaime, uma vez que a tarefa é fornecer uma função que pode receber um par de números (uma matriz funciona) e retorna uma matriz. Dado que um Func <int [], int []> F pode ser usado para satisfazer os requisitos, basta definir F :
Teste o programa completo aqui
Isso pode ser menor se uma lista genérica for considerada uma saída válida (solte .ToArray () para salvar 10 bytes).
Se a entrada também puder ser modificada, passar uma Lista <int> em vez de uma matriz remove a necessidade de inicializar a saída (sai em 126 bytes).
Levando isso um passo adiante, realmente não precisa haver um valor de retorno nesse caso. O uso de uma ação remove os 9 bytes usados pela instrução de retorno.
fonte
Geléia , 19 bytes
Experimente online!
fonte