Desafio:
Dada uma lista de listas não vazias de números inteiros, retorne uma lista de tuplas da seguinte forma: Primeira lista de tuplas começando com cada elemento da primeira lista, seguida pelo primeiro elemento de cada lista subseqüente, portanto a i-ésima tupla [ith element of first list, first element of second list, ... , first element of last list]
. Por exemplo:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => [[1, 4, 7], [2, 4, 7], [3, 4, 7], ...
Em seguida, faça tuplas do formulário [last element of first list, ith element of second list, first element of third list, ..., first element of last list]
, portanto, em nosso exemplo, isso seria:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => ..., [3, 4, 7], [3, 5, 7], [3, 6, 7], ...
Continue com cada lista restante até chegar a [last element of first list, ..., last element of second to last list, ith element of last list]
:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => ..., [3, 6, 7], [3, 6, 8], [3, 6, 9]]
A saída completa é a seguinte:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] =>
[[1, 4, 7], [2, 4, 7], [3, 4, 7], [3, 5, 7], [3, 6, 7], [3, 6, 8], [3, 6, 9]]
Alguns boilerplate para uma boa medida:
- Se você deseja que a entrada seja listas de strings ou listas de números inteiros positivos, tudo bem. A questão é sobre manipulação de listas, não sobre o que está nas listas.
- A entrada e a saída podem estar em qualquer formato aceitável .
- É permitido um programa ou função completo.
- As brechas padrão não são permitidas por padrão.
- Esta questão é código de golfe, portanto, a menor contagem de bytes vence.
Exemplos:
[] => [[]] (or an error, thanks to ngn for correcting the output in this case)
[[1]] => [[1]]
[[1, 2], [3, 4], [5]] => [[1, 3, 5], [2, 3, 5], [2, 4, 5]]
[[1], [2], [5, 6], [3], [4]] => [[1, 2, 5, 3, 4], [1, 2, 6, 3, 4]]
[[1, 2, 3], [4, 5]] => [[1, 4], [2, 4], [3, 4], [3, 5]]
[[1, 2, 3], []] => unspecified behavior (can be an error)
[[3, 13, 6], [9, 2, 4], [5, 10, 8], [12, 1, 11], [7, 14]] =>
[[3, 9, 5, 12, 7], [13, 9, 5, 12, 7], [6, 9, 5, 12, 7], [6, 2, 5, 12, 7],
[6, 4, 5, 12, 7], [6, 4, 10, 12, 7], [6, 4, 8, 12, 7], [6, 4, 8, 1, 7],
[6, 4, 8, 11, 7], [6, 4, 8, 11, 14]]
[[16, 8, 4, 14, 6, 7, 10, 15], [11, 1, 12, 2, 19, 18, 9, 3], [13, 5, 17]] =>
[[16, 11, 13], [8, 11, 13], [4, 11, 13], [14, 11, 13], [6, 11, 13],
[7, 11, 13], [10, 11, 13], [15, 11, 13], [15, 1, 13], [15, 12, 13], [15, 2, 13],
[15, 19, 13], [15, 18, 13], [15, 9, 13], [15, 3, 13], [15, 3, 5], [15, 3, 17]]
Se alguém tiver um título melhor, me avise.
fonte
[] => []
realmente deveria ser,[] => [[]]
mas não consigo encontrar as palavras para explicar o porquê.[[]]
porque existe uma única tupla vazia com uma entrada de cada uma das sublistas (zero). Provavelmente é muito chato exigir que os programas produzam corretamente isso, então direi que não é necessário.[]
, estritamente falando, é uma lista vazia de listas não vazias, mas a saída é ambígua entre[]
e[[]]
se é uma entrada permitida. ( "Primeira lista tuplas começando com cada elemento da primeira lista ..." - não há primeira lista, de modo que estamos a fazer ->[]
)[]
deveria ser[[]]
. Por exemplo, o número de tuplas de saída é osum(inner list lengths) - length of outer list + 1
que, no caso vazio, fornece1
, qual é o comprimento,[[]]
mas não o comprimento[]
. Porém, isso é um problema pedante ...Respostas:
JavaScript (ES6), 59 bytes
Espera uma lista de listas de números inteiros positivos .
Experimente online!
Como?
Em cada iteração:
fonte
a.some
truque é incrível!awe.some
não seria um desperdício de bytes ... :)Python 2 , 62 bytes
Experimente online!
Usando a idéia pop de Chas Brown inspirada na submissão de Arnauld ao JS .
Python 2 , 68 bytes
Experimente online!
Muda os primeiros elementos das listas para manter os valores desejados. O
[[0,0]]+
é um truque feio para imprimir os primeiros valores iniciais.fonte
Gelatina , 15 bytes
Experimente online! (o rodapé exibe a lista retornada real em vez de uma representação Jelly)
Como?
Índices no produto cartesiano das listas nos pontos necessários ...
ẈṚ’ṣ1T$¦ƬUṚị"€
(14 bytes) falha para entradas com o comprimento (não final) de uma lista; mas talvezṣ1T$
possa ser substituído por outra coisa?fonte
K (ngn / k) ,
40211918 bytesExperimente online!
usa idéias da resposta de H.PWiz
{
}
função com argumentox
#:'
comprimento de cada|
marcha ré!
todas as tuplas de índice para uma matriz com essas dimensões como colunas em uma matriz (lista de listas)|
marcha ré+
transpor|\
maxima em execução?
únicox@'/:
use cada tupla à direita como índices nas listas correspondentes dex
fonte
Carvão , 33 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Converta os números inteiros em seqüências de caracteres antes de imprimir implicitamente, usando o formato de saída padrão para listas, que é cada item em sua própria linha, e listas aninhadas em espaço duplo.
Pegue a soma dos comprimentos das listas e subtraia o comprimento da lista de listas. Em seguida, faça um loop de 0 a esse valor, inclusive.
Mapeie a lista de listas e o índice em cada lista.
Fixar o índice em 0 e o último índice na lista. (Os colchetes estão implícitos.)
Após a primeira lista, subtraia os comprimentos decrescentes de todas as listas anteriores do índice mais externo. (Isso não funciona para a primeira lista porque o comprimento das listas está vazio e a soma não é um número.)
fonte
Python 2 , 72 bytes
Experimente online!
Esta é uma porta Python do excelente algoritmo Javascript de Arnauld .
fonte
APL (Dyalog Classic) ,
323027 bytesExperimente online!
programa completo, a entrada é do teclado (
⎕
)para
[]
saídas de entrada[[]]
(seus equivalentes APL são0⍴⊂⍬
e,⊂⍬
)assume exclusividade de números na entrada
fonte
,⊂,1
JavaScript (ES6),
5854 bytesApós mais de 14 tentativas de descartar meu código (removendo todas as instâncias de while loops,,
push
econcat
), cheguei a uma iteração algoritmicamente semelhante à resposta de @ Arnauld , sem surpresa, dada a sua sucessão!Aceita uma lista de listas de números inteiros positivos. Experimente online!
58 bytes
Por mais 1 byte, substituir
s = y.shift()
pory.shift(s = 1)
deve lidar com todos os números inteiros (presumivelmente, como eu não o testei pessoalmente).58 bytes
Versão bônus, com leve reorganização:
Explicação
As primeiras versões do código tentavam modificar um clone (de uma matriz) dos primeiros elementos de cada matriz, mas a etapa extra de inicializar essa matriz era cara ... até eu perceber que o mapeamento dos primeiros elementos de cada matriz era aproximadamente a operação "única" necessária se eu alterar as matrizes originais.
Usa um sinalizador booleano para verificar se alguma matriz foi deslocada (ou seja, reduzida) ainda. Golpeou ainda mais a verificação condicional observando que JS coage matrizes com um valor numérico como seu único elemento nesse número, enquanto coagindo matrizes com vários valores como NaN.
fonte
APL (Dyalog) , 15 bytes ( SBCS )
Obrigado ngn por apontar um byte desnecessário
Experimente online!
{∪⌈\,⍉⍳≢¨⍵}
gera listas para indexar na entrada. por exemplo(1 2 3) (4 5 6) (7 8 9) -> (0 0 0) (1 0 0) (2 0 0) (2 1 0) (2 2 0) (2 2 1) (2 2 2)
≢¨⍵
: o comprimento de cada lista na entrada,⍉⍳
cria todas as combinações de números até a entrada. por exemplo2 3 -> (0 0) (1 0) (0 1) (1 1) (0 2) (1 2)
⌈\
: digitalize com o máximo. por exemplo, o exemplo acima seria agora(0 0) (1 0) (1 1) (1 1) (1 2) (1 2)
∪
: remover duplicatas⊃¨¨⊂
faz a indexação, atento à profundidade de qualquer argumentofonte
⊆
parece desnecessário .Python 2 , 91 bytes
Experimente online!
fonte