fundo
Atualmente, os programadores parecem não conseguir manter seus buffers retos! Uma fonte comum de erro está tentando usar um índice de matriz muito grande para o buffer. Sua tarefa é implementar um buffer no qual grandes índices são reduzidos para um tamanho que o buffer possa manipular. Como eu decido exatamente o que é melhor para todos, você implementará esse buffer com minhas especificações precisas.
visão global
Você tem um buffer somente de inserção que cresce em tamanho à medida que os elementos são adicionados a ele. O buffer é indexado a zero, e também indexado modulo seu tamanho atual. A regra especial para esse desafio é esta:
- Para inserir um item no índice i meios para calcular j ,
j = i % buffer.length()
e inserir o novo produto após o j item na lista.
O único caso especial é se o buffer estiver vazio, pois o módulo aritmético zero não funciona. Portanto, se o buffer estiver vazio no momento, o novo item será o índice 0 .
Se o buffer tiver apenas um item, você estará sempre inserindo após o 0º item. Esta é apenas uma instância do caso geral.
Se o buffer contiver 6 itens: [4, 9, 14, 8, 5, 2]
e você for solicitado a inserir um novo item 10
no índice 15 , você o encontrará 15 % 6 == 3
e, em seguida, insira o novo 10
após o 8
índice at 3, que fornece um buffer resultante de [4, 9, 14, 8, 10, 5, 2]
Problema
Escreva uma função ou programa que obtenha uma lista ordenada de números inteiros positivos e índices inteiros positivos nos quais os inserir.
Comece com um buffer vazio e adicione os números inteiros especificados ao buffer nos índices correspondentes.
Saída da lista ordenada de números inteiros que estão no buffer depois que todas as inserções especificadas foram feitas.
Este é um desafio do código-golfe, pelo que o código mais curto vence.
Diretrizes de entrada
Você pode pegar as listas de entrada da maneira que achar melhor. Exemplos:
- Lista de pares:
[ [1,1], [2,4], [3,9], [4,16], [5,25]...]
- Lista de itens e lista de índices:
[1, 2, 3, 4, 5...], [1, 4, 9, 16, 25]
- Achatado:
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25 ...]
- etc.
Você pode assumir que a entrada sempre contém pelo menos um item e o índice correspondente.
Casos de teste
Quadrados de cima:
[(1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64)] -> [1, 2, 8, 7, 6, 5, 4, 3]
Eu os gerei aleatoriamente:
[(11, 9), (13, 14)] -> [11, 13]
[(1, 18), (11, 7), (3, 35), (16, 22)] -> [1, 11, 16, 3]
[(3, 16), (16, 37), (0, 28), (18, 24)] -> [3, 18, 0, 16]
[(7, 26), (8, 20), (11, 39), (1, 23), (17, 27)] -> [7, 8, 11, 1, 17]
[(15, 35), (17, 7), (16, 15), (1, 13), (2, 6), (11, 34)] -> [15, 17, 1, 2, 16, 11]
[(2, 13), (1, 20), (16, 25), (8, 21), (5, 2), (16, 37), (3, 0)] -> [2, 3, 8, 1, 16, 5, 16]
[(6, 20), (15, 15), (12, 26), (10, 27), (17, 13), (7, 18), (4, 16)] -> [6, 10, 17, 12, 7, 4, 15]
[(18, 9), (5, 34), (15, 4), (12, 29), (2, 5), (7, 0), (7, 10), (16, 38)] -> [18, 7, 15, 2, 16, 5, 7, 12]
[(0, 12), (12, 0), (4, 16), (15, 12), (6, 28), (8, 10), (11, 24), (0, 25)] -> [0, 11, 8, 6, 15, 0, 4, 12]
[(6, 12), (14, 13), (10, 33), (11, 35), (1, 3), (0, 28), (15, 27), (8, 10), (1, 2)] -> [6, 14, 10, 1, 11, 8, 15, 0, 1]
[(2, 29), (19, 30), (18, 17), (13, 3), (0, 21), (19, 19), (11, 13), (12, 31), (3, 25)] -> [2, 13, 3, 11, 0, 12, 19, 18, 19]
Implementação de referência Python3
def f(inputs):
# `inputs` is a list of pairs
buff = []
for item, index in inputs:
if len(buff) == 0:
buff.insert(0, item)
else:
insert_after = index % len(buff)
buff.insert(insert_after+1, item)
return buff
Respostas:
MATL ,
2422 bytesInput é uma matriz (com
;
separador de linhas) que contém os valores na primeira linha e os índices na segunda.A saída é uma matriz de colunas, exibida como números separados por novas linhas.
Experimente online! Ou verifique todos os casos de teste , com cada resultado exibido em uma única linha.
Explicação
fonte
Perl, 37 bytes
35 bytes de código + 2 bytes para
-lp
sinalizadores.Experimente online!
A implementação é bastante direta,
splice
insere na matriz@F
no índice1+<>%(@F||1)
(observe que@F||1
lida com o caso da matriz estar vazia).Apenas algumas palavras sobre os aparelhos (aparentemente) incomparáveis
}{
(porque eu tinha um comentário sobre isso, e acho bastante estranho para pessoas que não conhecem Perl), e é um truque bastante comum nos campos de golfe em Perl: a-p
bandeira envolve o código com (aproximadamente)while(<>){ CODE } continue { print }
, (ocontinue
é executado após cada iteração). Portanto, com esses inigualáveis}{
, altero meu código parawhile(<>) { CODE}{ } continue { print }
. Portanto, ele cria um bloco vazio logo após o meu código (mas isso não é um problema), e ocontinue
é executado apenas uma vez, após owhile
(ou seja, quando toda a entrada foi lida).fonte
}{
está me deixando louco ...}{
me lembra de essa ilusãoES6 (Javascript),
58,57,53, 50 bytesGolfe
Toma uma matriz de pares de índice-valor, como entrada.
EDITS
&&
para retornar valor, -1 byte|0
(como a emenda aparentemente pode lidar com NaN muito bem), -2 bytesb=[]
um segundo "argumento" para mapear () , -2 bytes (Thx @ETHproductions!)Teste
fonte
a=>a.map(e=>...,b=[])&&b
e=>
para(e,i)=>
e usando emi
vez deb.length
Haskell ,
7069 bytesExperimente online! Uso:
foldl(!)[] [(1,5),(2,4),(3,7)]
. Guardou um byte graças a @nimi!Explicação:
Solução sem calcular o módulo: (90 bytes)
Experimente online!
fonte
j<-1+i`mod`length b
salva um byte.Python 2 ,
64625856 bytesGraças a @xnor por jogar fora 2 bytes!
Experimente online!
fonte
(len(x)or 1)
vez de inicializar o comprimento?len(x or[0])
e-~len(x[1:])
gravata.Python 2 ,
6260 bytesRecebe a entrada como uma lista de pares, imprime o resultado. Edit: Outgolfed por Dennis
Experimente online!
Isso é bastante simples - faça um loop pela entrada, inserindo os itens no local correto e imprima o resultado. Decidir em qual índice inserir é feito
1+y%(len(b)or 1)
. Essa é a maneira padrão de fazer a indexação modular, com oor 1
objetivo de lidar com o caso de borda de uma lista vazia.fonte
JavaScript (ES6), 60 bytes
Snippet de teste
Mostrar snippet de código
fonte
V ,
384035 bytesEssa resposta altera a definição de lista e normalmente não é um idioma que você usaria para manipulação de lista, mas eu queria usar o
[count]/{regex}
que recentemente adicionei a V. A entrada é aceita[index] [num] [index] [num] ...
e retornada como[num] [num] [num]
.Experimente online!
Hexdump para 2 caracteres ocultos:
Explicação
O código
dG@"
formata todos os\d+ \d+
pares para que uma lista 1 2 3 4 5 6 termine comoe, em seguida,
dG@"
executa tudo isso como código V, como o seguinte:fonte
PHP,
7292 bytesaceita entrada achatada a partir dos argumentos da linha de comando. Corra com
-nr
.fonte
Fatal error: Uncaught DivisionByZeroError: Modulo by zero
, fixa que, em seguida, tentou1 1 1 2 1 3
e tem[1=>null]
como saída em vez de[1,3,2]
j+1
vez de inserir depoisj
, não?18 1 7 11 35 3 22 16
=> em[1,11,16]
vez de[1,11,16,3]
insert
palavra - chave. Obrigado; fixo.Java 7,
125124 bytesAceita uma lista simples de valores seguida por índices. Para o caso de teste dos quadrados, a entrada seria
new int[] {1, 2, 3, 4, 5, 6, 7, 8, 1, 4, 9, 16, 25, 36, 49, 64}
Experimente online!
fonte
Mathematica, 62 bytes
Função pura com o primeiro argumento
#
esperado para ser uma lista de pares. Começando com a lista vazia{}
, deixouFold
a lista de entrada#
com a seguinte função:fonte
Perl 6 , 51 bytes
Toma a entrada achatada.
fonte
Clojure, 87 bytes
fonte