Meu filho pequeno tem um brinquedo como este:
Este brinquedo consiste em 10 pequenos baldes empilháveis, que vamos numerar de 1 (o menor) a 10 (o maior). Às vezes, ele faz pequenas pilhas e o brinquedo acaba assim:
Podemos representar esquematicamente as pilhas assim:
1 6
4 9 2 7
5 10 3 8
---------- <-- Floor
1 2 3 4 <-- Pile #
Ou, de outra forma:
[[4,5],[9,10],[1,2,3],[6,7,8]]
Esse conjunto de pilhas de baldes é facilmente reembalável para reconstruir o conjunto original (a primeira imagem) apenas colocando consecutivamente pilhas de baldes menores dentro de pilhas de baldes maiores:
1 1 6
2 2 7
1 6 3 6 3 8
4 9 2 7 4 9 7 4 9
5 10 3 8 5 10 8 5 10
---------- > [Pile 3 to 1] > ---------- > [Pile 4 to 2] > ---------- > [Pile 1 to 2] > Done!
1 2 3 4 1 2 3 4 1 2 3 4
No entanto, às vezes meu filho tenta construir torres ou joga baldes fora, e as pilhas acabam sendo inconsistentes e o conjunto original não pode ser reconstruído apenas colocando uma pilha dentro da outra. Exemplos disso:
[[1,3,2],[4]] (the kid tried to build a tower by placing a bigger bucket
over a smaller one, we would need to reorder the buckets
first)
[[1,3,4],[2]] (the kid left aside an unordered bucket, we would need to remove
bucket #1 from pile #1 before restacking)
[[1,2,3],[5]] (the kid lost a bucket, we need to find it first)
Desafio
Dada uma lista de listas de números inteiros que representam um conjunto de pilhas do balde, retorne um valor verdadeiro se as listas representarem um conjunto de pilhas facilmente reorganizáveis ou falsey em qualquer outro caso.
- A entrada será fornecida como uma lista de listas de números inteiros, representando os buckets de cima para baixo para cada pilha.
- Não haverá pilhas iniciais vazias (você não receberá
[[1,2,3],[],[4,5]]
como entrada). - O número total de buckets pode estar dentro de um intervalo inteiro razoável.
- Meu filho tem apenas um conjunto de baldes para que não haja elementos duplicados.
- Você pode selecionar quaisquer dois valores consistentes (e coerentes) para verdade ou falsidade.
- Os buckets serão rotulados de # 1 a #N, sendo
N
o maior número inteiro nas listas de números inteiros. Meu filho ainda não conhece o conceito de zero. - Você pode receber a entrada em qualquer formato razoável, desde que represente um conjunto de pilhas de baldes. Apenas especifique-o na sua resposta se você alterar a maneira como recebe a entrada.
- Isso é código-golfe , portanto, pode ganhar o programa / função mais curto para cada idioma!
Exemplos
Input: [[4,5],[9,10],[1,2,3],[6,7,8]]
Output: Truthy
Input: [[6,7,8,9,10],[1],[2],[3,4,5],[11,12,13]]
Output: Truthy
Input: [[2,3,4],[1],[5,6,7]]
Output: Truthy
Input: [[1,2],[5,6],[7,8,9]]
Output: Falsey (buckets #3 and #4 are missing)
Input: [[2,3,4],[5,6,7]]
Output: Falsey (bucket #1 is missing)
Input: [[1,3,4],[5,7],[2,6]]
Output: Falsey (non-restackable piles)
Input: [[1,4,3],[2],[5,6]]
Output: Falsey (one of the piles is a tower)
fonte
Respostas:
Gelatina ,
65 bytesObrigado a @Lynn por economizar 1 byte.
Experimente online! (vem com rodapé da suíte de teste)
Explicação
fonte
ṢFµJ⁼
funciona, mas não pensei em todos os casos extremos.1
não está faltando. Não tenho certeza se isso é garantido pelo OP.J
podem retornar, garantindo uma saída falsa. estou esquecendo de algo?Python 2 ,
5352 bytesObrigado pelo byte xnor
Experimente online!
fonte
[]
. Muito complicado[0]
para que o intervalo possa começar0
.JavaScript (ES6),
5958 bytesExplicação
Casos de teste
Mostrar snippet de código
fonte
05AB1E , 4 bytes
Experimente online!
fonte
Haskell , 54 bytes
Experimente online!
fonte
Haskell , 37 bytes
Experimente online!
Verifica se a lista classificada concatenada é lexicograficamente menor que a lista infinita
[1,2,3,...]
. Como não há duplicatas, qualquer depósito ausente ou fora de ordem causaria um valor maior quek
o dok
'lugar, tornando a lista resultante maior.fonte
Pitão, 6 bytes
Experimente aqui.
Explicação:
fonte
UI
peça, por favorU <col>
érange(len(A))
,I <pfn> <any> <n-1:any>
éA(B, ...) == B
.U <col>
érange(len(A))
, mas eu não sabia que portar a solução Python seria mais curto ...PROLOG (SWI), 54 bytes
Agora está melhor. Ainda bastante detalhado, infelizmente.
Experimente online!
O
s/1
predicado recebe uma lista como argumento e é verdadeiro se a lista for uma lista de depósitos facilmente empilháveis.Melhoria no algoritmo: se eu classifico a lista antes de achatá-la, isso força todas as sublistas a serem classificadas para que o predicado seja verdadeiro. Um pouco "emprestado" da resposta de Pietu1998 Jelly . Graças a isso, posso despejar o
forall
que é mais da metade do programa (veja abaixo a resposta original).Como funciona?
O predicado é verdadeiro se todas as suas cláusulas forem verdadeiras:
Resposta anterior, PROLOG (SWI), 109 bytes
Experimente online!
fonte
Pitão ,
9 1611 bytes (Fixo)Usa um método completamente diferente da outra resposta. Uma abordagem mais curta de 7 bytes pode ser encontrada abaixo.
Suíte de teste.
Explicação
Como é que isso funciona?
Vamos dar alguns exemplos, que facilitam a compreensão. Vamos assumir que a entrada é
[[1,3,4],[5,7],[2,6]]
. O núcleo desse algoritmo é que cada delta na lista não nivelada deve ser 1 para que os buckets sejam empilháveis.Primeiro,
S
vira[[1, 3, 4], [2, 6], [5, 7]]
.Então,
s
achata-lo:[1, 3, 4, 2, 6, 5, 7]
.Coloque um
0
na frente:[0, 1, 3, 4, 2, 6, 5, 7]
.+
obtém os deltas da lista[1, 2, 1, -2, 4, -1, 2]
,.tM
diminui cada elemento[0, 1, 0, -3, 3, -2, 1]
,.Qualquer não
0
inteiro é verdade em Pyth, portanto, verificamos se existe algum elemento verdadeiro.E
(o que significa que a pilha não pode ser formada corretamente). Nós recebemosTrue
.!
nega o resultado, que seTrue
transformaFalse
.Se a entrada fosse, por exemplo
[[6,7,8,9,10],[1],[2],[3,4,5],[11,12,13]]
, o algoritmo funcionaria desta maneira:Classificadas pelo maior elemento:
[[1], [2], [3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13]]
e achatada, com um0
prefixado:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
.Deltas:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
. Todos get diminuído:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
.Não existe um elemento de verdade, então chegamos
False
. Por negação lógica, o resultado éTrue
.Pitão , 7 bytes
Suíte de teste.
Resposta do porto do Python e uma variação da solução do @ Erik .
fonte
tM
diminui cada elemento? Eu pensaria que diminuir cada elemento[1, 2, 1, -2, 4, -1, 2]
traria[0, 1, 0, -3, 3, -2, 1]
. Mas isso não ajudaria a resolver o problema, então devo estar entendendo mal o que significa diminuir cada elemento.tM
diminui cada elemento da lista em1
. Há um erro na minha explicação. Fixará.Braquilog , 5 bytes
Experimente online!
Unificações explicadas:
Explicação analítica:
Primeiro, ordenamos a lista de listas e, em seguida, concatenamos (ou seja, aplainamos 1 profundidade) (
oc
) para que os baldes sejam empilhados da direita para a esquerda, se possível. Em seguida, para verificar se os baldes foram empilhados corretamente (ou seja, não há baldes ou torres ausentes), verificamos se a lista resultante é uma faixa abrangente de 1 a seu comprimento. Agora, em vez de verificar a lista com o intervalo [1..n] de seu comprimento ({l⟦₁?}
), tentamos encontrar uma entrada para uma função que gera esse intervalo (~⟦₁
), se houver um. Se uma entrada for encontrada, o programa será encerrado sem problemas e, portanto, disparará umtrue.
status. Se nenhuma entrada for encontrada, o programa falhará, acionando umfalse.
status.fonte
Python 2 , 43 bytes
Experimente online!
Verifica se a lista classificada concatenada é lexicograficamente menor do que
[1,2,3,...N]
a grandeN
. Como não há duplicatas, qualquer depósito ausente ou fora de ordem causaria um valor maior quek
o dok
'lugar, tornando a lista resultante maior. O comprimento da string da entrada é suficiente como um limite superior, pois cada número ocupa mais de um caractere.fonte
MATL , 5 bytes
Experimente online!
(Entrada implícita, digamos
{[4,5],[9,10],[1,2,3],[6,7,8]}
)S
- classificar matrizes de entrada em ordem lexicográfica ({[1,2,3],[4,5],[6,7,8],[9,10]}
)g
- converter em uma única matriz (cell2mat
)t
- duplicar issof
- encontre índices de valores diferentes de zero. Como a entrada aqui é toda sem zeros, retorna a lista de índices de 1 para comprimento (matriz) ([1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10]
)=
- verifique se a matriz é igual ao intervalo de 1 a comprimento (matriz)fonte
Japonês ,
131211 bytesProvavelmente isso poderia ser mais curto.
Experimente ou execute todos os casos de teste
Explicação
fonte
ä-0 e¥J
ouän0 e¥1
ä
em matrizes ainda. Obrigado pela economia.Scala, 49 bytes
Ungolfed:
fonte
Japonês , 9 bytes
Experimente online!
fonte
g<space>
;)R , 58 bytes
Experimente online!
NB: FALSO é o resultado verdadeiro, VERDADEIRO é o falso
Explicação:
fonte
seq(a)
para 2 bytes ?. Além disso, é permitido usarTRUE
como valor falso e vice-versa (basta especificar na sua resposta), para que você possa fazerany(a-seq(a))
por outro byte.seq(a)
comportar de maneira diferente quandoa
tinha o comprimento 1 e perdi que, neste caso, obteremos os mesmos resultados: D Obrigado!C # (.NET Core) ,
157145132 bytes-13 bytes graças a TheLethalCoder
A contagem de bytes também inclui
Experimente online!
Ungolfed:
fonte
x.First()
->x[0]
?Enumerable.Range
->new int[]
eZip
com índice, se possível ..? RemovaWhere
e coloque a condiçãoAny
.new int[]
abordagem exigiria a adição de umSelect()
para obter o índice e, finalmente, aumentar a contagem de bytes.CJam , 11 bytes
Experimente online!
Oww
:(
... sim!{$:+_,,:)=}
fonte
Carvão , 19 bytes (não concorrente?)
Experimente online!
-10 bytes, graças apenas ao ASCII .
-3 bytes graças ao ASCII-only para uma implementação subsequente (consulte o histórico de revisões para uma versão possivelmente concorrente).
-
por verdade,por falsidade.
Entrada é uma lista única de uma lista de listas, por causa de como o carvão vegetal recebe entrada.
fonte
UP
.UPsorted
.▷
usado lá faz com que as coisas do escopo sejam a prioridade, de modo que; s por queUP
ainda existe, mas acho que você pode evitar o uso de nomes de funções python como varnames?v
, também O_O isso não é ainda um desafio ascii arte (não admira que é tão ungolfy: PJava 10, 213 bytes
Experimente online.
Parecia uma boa idéia quando comecei, mas esses componentes apenas o tornam mais longos. Definitivamente, você pode jogar golfe usando uma abordagem mais manual.
Inspirado na resposta 05AB1E de 4 bytes de @EriktheOutgolfer . 4 vs 213 bytes, rofl ..>.>
Explicação:
fonte