Desafio
Dada uma lista de números inteiros positivos, descubra se existe uma permutação em que, até um bit de cada um dos números inteiros, um número binário composto por todos os 1
s possa ser criado.
O número de bits no número binário resultante é igual ao MSB mais alto da lista de números inteiros.
Saída
Seu código deve gerar ou retornar um valor de truthy / falsey indicando se existe uma permutação.
Exemplos
Verdade:
Com a lista [4, 5, 2]
e sua representação binária [100, 101, 10]
, podemos usar o terceiro, o primeiro e o segundo bits, respectivamente, para criar 111
:
4 -> 100 -> 100 -> 1
5 -> 101 -> 101 -> 1
2 -> 010 -> 010 -> 1
Result 111
Com a lista [3, 3, 3]
, todos os números têm o primeiro e o segundo bits definidos como 1
, para que possamos escolher com um número de sobra:
3 -> 11 -> 11 -> 1
3 -> 11 -> 11 -> 1
3 -> 11 -> 11 ->
Result 11
Falsey:
Com a lista [4, 6, 2]
, nenhum dos números tem o primeiro bit definido como 1
, portanto, o número binário não pode ser criado:
4 -> 100
6 -> 110
2 -> 010
Com a lista [1, 7, 1]
, apenas um dos números tem o segundo e o terceiro bits definidos como 1
e o número não pode ser criado:
1 -> 001
7 -> 111
1 -> 001
Obviamente, se o número máximo de bits definidos exceder o número de números inteiros, o número do resultado nunca poderá ser criado.
Casos de teste
Verdade:
[1]
[1, 2]
[3, 3]
[3, 3, 3]
[4, 5, 2]
[1, 1, 1, 1]
[15, 15, 15, 15]
[52, 114, 61, 19, 73, 54, 83, 29]
[231, 92, 39, 210, 187, 101, 78, 39]
Falsey:
[2]
[2, 2]
[4, 6, 2]
[1, 7, 1]
[15, 15, 15]
[1, 15, 3, 1]
[13, 83, 86, 29, 8, 87, 26, 21]
[154, 19, 141, 28, 27, 6, 18, 137]
Regras
As brechas padrão são proibidas. Como se trata de código-golfe , a entrada mais curta ganha!
Respostas:
Gelatina , 11 bytes
Experimente online!
Como funciona
fonte
J , 30 bytes
Todo o crédito é do meu colega Marshall .
Função de prefixo tácito sem nome.
Experimente online!
(
@
é composição da função)#:
antibase-2|:
transpor(
…)^:2
Aplique a seguinte função duas vezes:1-
Negar booleano>./
o máximo@
do$
comprimentos do eixo{.
take (preenchimento com zeros) de|:
o argumento transposto+./ .*
"mágica determinante louca" *[:
não ligue (no-op - serve para compor a parte anterior com o resto)* Nas palavras de Marshall.
fonte
JavaScript (ES6),
104...9383 bytesRetorna
0
ou1
.Casos de teste
Mostrar snippet de código
Método
Dada a matriz de entrada A = [a 0 , a 1 , ..., a N-1 ] , procuramos uma permutação [a p [0] , a p [1] , ..., a p [N- 1] ] de A e um número inteiro x ≤ N, de modo que:
Formatado e comentado
fonte
Casca , 14 bytes
Experimente online!
Explicação
fonte
05AB1E ,
232220 bytes-1 byte graças a Mr.Xcoder
Verdadeiro: 1, Falso: 0
Experimente online!
Explicações:
fonte
Wolfram Language (Mathematica) , 65 bytes
Experimente online!
Explicação
Começamos convertendo todas as entradas em listas binárias.
Em seguida, preenchemos todas essas listas com zeros à esquerda para tornar a matriz retangular. O resultado é armazenado
n
para mais tarde.Bem, força bruta, vamos obter todas as permutações possíveis da entrada.
Isso obtém o rastreio para cada permutação, ou seja, a soma dos elementos diagonais na permutação. Em outras palavras, adicionamos o MSB a partir do primeiro número, o próximo a MSB a partir do segundo número e assim por diante. Se a permutação for válida, todos eles serão 1 e haverá 1 s no número de entrada maior.
Nós obtemos o rastreamento máximo, porque o rastreamento nunca pode ser maior que o de uma permutação válida.
O lado direito é apenas uma versão de golfe
Length @ First @ n
, ou seja, obtém a largura da matriz retangular e, portanto, a largura do maior número de entrada. Queremos garantir que o traço de alguma permutação seja igual a isso.fonte
PHP,
255243160 bytes-12 bytes,
eliminou a classificação -83 bytes (!) Graças a Titus
Experimente online!
Imprime 1 para verdade, nada para falsey.
Versão original não destruída:
fonte
function f($a,$v=NULL,$b=[]){($v=$v??(1<<log(max($a),2)+1)-1)||die("1");if($p=array_pop($a))while($p-=$i)($b[$i=1<<log($p,2)]|$v<$i)||f($a,$v-$i,[$i=>1]+$b);}
true
:die("1")
→die(!0)
.Lua 5.2, 85 bytes
Isso define x como uma função que aceita um número variável de entradas (espera-se que sejam números inteiros de 32 bits) e imprime em stdout "true" ou "false".
Uso:
fonte
[1,15,3,1]
parece retornar emtrue
vez de,false
por exemplo. Aqui está o seu código, o compilador online do TIO. Os outros dois casos de teste que falham são[1,7,1]
e[15,15,15]
. Todos os outros casos de teste produzem os resultados corretos.PHP, 121 bytes
Experimente online .
demolir
fonte
J , 49 bytes
Preciso contar também o 'g =.'? Estou pronto para adicioná-lo.
Um verbo explícito longo desta vez. Eu tentei um tácito para o mesmo algoritmo, mas acabou sendo ainda mais longo e mais feio do que isso. Longe da solução de Adám.
Explicação: (y é o argumento correto da função)
Experimente online!
fonte
Python 3 ,
126120 bytesEconomizou 6 bytes devido ao Sr. Xcoder
Experimente online!
fonte
[0]+[...]
É inútil, não é?any(g(x[:i]+x[i+1:],n-1)for i in range(len(x))if x[i]&2**n)
deve ser suficiente.Geléia , 17 bytes
Um link monádico que obtém uma lista de números e retorna
1
(verdade) ou0
(falsey).Experimente online!
Isso expirará no TIO pelo mais longo de cada um dos casos de teste.
Quão?
fonte
R ,
247 bytes221 bytesExperimente online!
Versão ungolfed
Percebi que a verificação sem filas era desnecessária com os
drop=F
argumentos. Também removeu algum espaço em branco traquina.fonte
PHP, 152 bytes
Não imprime nada para falso, 1 para verdadeiro.
Ungolfed:
fonte
Geléia , 17 bytes
Suíte de teste.
fonte
C, 79 bytes
fonte
try it online
link seria útil.[1, 7, 1]
deve retornar false, e[52, 114, 61, 19, 73, 54, 83, 29]
deve retornar true