Se você expressar algum número inteiro positivo em binário sem zeros à esquerda e substituir every 1
por a (
e every 0
por a )
, todos os parênteses serão iguais?
Na maioria dos casos, eles não vão. Por exemplo, 9 está 1001
em binário, que se torna ())(
, onde apenas os dois primeiros parênteses correspondem.
Mas às vezes eles combinam. Por exemplo, 44 está 101100
em binário, que se torna ()(())
, onde todos os parênteses à esquerda têm um parêntese à direita correspondente.
Escreva um programa ou função que receba um número inteiro positivo de base dez e imprima ou retorne um valor verdadeiro se a versão entre parênteses binários do número tiver todos os parênteses correspondentes. Caso contrário, imprima ou retorne um valor falso .
O código mais curto em bytes vence.
Exemplos de verdade abaixo de 100:
2, 10, 12, 42, 44, 50, 52, 56
Exemplos de falsas abaixo de 100:
1, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 45, 46, 47, 48, 49, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
Respostas:
TeaScript , 9 bytes
16 18 20 22 24Economizou 2 bytes graças a @ETHproductions
Woah. Isso é curto. Usa a abordagem do @ xnor. Isso usará a função de substituição recursiva (
W
), que substituirá todos10
iguais()
por nada. Se a string estiver em branco, ela será equilibrada.O uso de uma versão do TeaScript feita após o lançamento deste desafio pode se transformar em 7 bytes:
Ungolfed
Explicação
fonte
~--c
é falso exatamente no mesmo cenário quec--
.Pitão, 10 bytes
Experimente esta suíte de testes no Pyth Compiler.
Como funciona
fonte
!u:G`Tk.BQ
. Indiscutivelmente mais fácil de entender.Python2, 87 bytes
Uma implementação terrível que abusa de erros de sintaxe.
fonte
JavaScript (ES6),
555451 bytesBytes salvos graças a @ Vɪʜᴀɴ e @xsot !
Explicação
fonte
f=
. Você também pode usar use em+c
vez dec|0
maiúsculas e minúsculas para um número inteiro. Você também pode usar o(+c?d++:d--)
que é ainda mais curtof=
? Porque muitas outras respostas JavaScript no site nomeiam suas funções.11
, retornostrue
quando ele deve retornarfalse
n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2
Python 2, 45 bytes
Uma função recursiva. Lê dígitos binários a
n
partir do final, mantendo uma contagemi
do nível de aninhamento atual das parênteses. Se estiver abaixo0
, rejeite. Quando chegamos ao início, verifica se a contagem é0
.Na verdade, começamos a contagem em
i=1
para facilitar a verificação se ela caiu0
. O único caso de sucesso do terminal én==0
ei==1
, verificado comn<i<2
. Forçamos essa verificação a ocorrer sen==0
, ou sei
cair0
, caso em que falha automaticamente.feersum economizou dois bytes reestruturando os casos não recursivos com desigualdades para causar um curto-circuito.
fonte
f=lambda n,i=1:n>0<i*f(n/2,i+(-1)**n) or n<i<2
, pelo menos, salva 1.CJam, 11 bytes
Isso é um pouco imundo: para números com parênteses, ele imprimirá um ou mais blocos. Para números que não possam ser trocados entre parênteses, ele trava sem imprimir nada no STDOUT. Se você tentar isso on-line no intérprete CJam , lembre-se de que ele não faz distinção entre STDOUT e STDERR.
Como cadeias não vazias / vazias são verdadeiras / falsas no CJam e a saída impressa é sempre uma cadeia, é possível que ela esteja em conformidade com as regras. Com o custo adicional de mais 3 bytes, para um total de 14 bytes , podemos realmente deixar uma sequência de verdade ou falsidade na pilha que será impressa:
Isso ainda trava para números não passíveis de parentalidade, o que é permitido por padrão .
Execuções de teste
Como funciona
CJam, 15 bytes
Experimente este violino no intérprete CJam ou verifique todos os casos de teste de uma só vez .
Como funciona
fonte
Python, 51 bytes
Uma função anônima. Avalia para uma expressão que se parece com
Cada substituição remove tudo
10
, que corresponde a()
. Depois que todas as substituições foram feitas, a função retorna se o que resta é apenas o prefixo binário0b
. É mais do que suficiente fazern
substituições, já que umk
número de dois dígitos leva na maioria dask/2
etapas e seu valor é maior2**k
.fonte
Ruby, 40
Manipulação simples de strings. Larga '10' até não sobrar mais nada.
fonte
Sério , 17 bytes
Saídas
0
para false e1
true. Experimente online .Explicação:
fonte
Japonês, 23 bytes
Japt é uma versão abreviada do Ja vaScri pt . Intérprete
Isso me lembra o quão longe o Japt ainda não foi comparado ao TeaScript. Depois de renovar o intérprete nos próximos dias, gostaria de adicionar caracteres de "atalho" como o Vɪʜᴀɴ.
Como funciona
Logo após esse desafio, o @ Vɪʜᴀɴ (agora conhecido como @Downgoat) me ajudou a implementar um recurso de substituição recursiva, como
W
na resposta do TeaScript. Isso significa que esse desafio agora pode ser feito em apenas 5 bytes:Teste online!
fonte
Mathematica, 49 bytes
fonte
1,0
da lista e teste se o resultado é uma lista vazia.Oitava, 48 bytes
fonte
C ++,
10494 bytesExecutar com este compilador , deve especificar a entrada padrão antes de executar.
Explicação
n>>=1
.c+=n&1?-1:1
mantém a contagem de parênteses abertos)
.n&c>=0
para quando apenas os 0s iniciais permanecem ou os parênteses fecham mais do que abrem.fonte
Haskell,
4946 bytesExemplo de uso:
f 13
->False
.Estou acompanhando o nível de aninhamento
l
como muitas outras respostas. No entanto, o caso "equilibrado" é representado por1
, assim como o caso "mais-)
que-(
"0
.PS: encontrou o ajuste do nível de aninhamento
l+(-1)^n
na resposta do xnor .fonte
signum
parece muito complicado, como sobre apenas_#0=1<0
?l>0
vez del==1
?l==1
é equilibrado. Sel>1
, os parênteses estão desequilibrados.Python 2,
6057565553525049 bytesAgradecemos ao xnor por salvar dois bytes e feersum por elevar a contagem final de bytes para 49!
Explicação
O número de entrada,,
n
é processado a partir do seu bit menos significativo.i
é um contador que controla o número de 0 e 1. Observe que ele foi inicializado1
para salvar um byte. O loop será interrompido antes den
chegar a 0 se o número de 1s exceder o número de 0s (i<=0
).Para que os parênteses sejam equilibrados, são necessárias duas condições:
i==1
)n==0
). Edit: eu percebi que esta condição não é necessária, poisi
deve ser não positiva, sen!=0
a condição anterior for suficiente.fonte
i
en
não são negativos, entãoi==n==0
éi+n==0
.i
pode ser negativo se o loop for interrompido prematuramente.i|n==0
deve sempre funcionar.while i*n
deve funcionarJavaScript ES5,
11887858277 bytesTécnica interessante na minha opinião. Menos muito, graças a @ETHproductions e @NotthatCharles
JavaScript ES6,
77575654 bytes-21 bytes em ETHproductions.
fonte
function p(x){x=x.toString(2);r=/10/;while(x.search(r)>=0){x=x.replace(r,"")}return!x}
x=>([...x=x.toString(2)].map(_=>x=x.replace(/10/,"")),!x)
o truque é mover o loop while para um.map
, já que nunca há mais dez em uma entrada do que seu comprimento.map
.x=>[...x=x.toString(2)].map(_=>x=x.replace(/10/,""))&&!x
IDK, se puder ficar mais curto.D,
209170 bytesIsso faz exatamente o que deve ser feito sem acréscimos ou benefícios.
fonte
C, 67 bytes
Praticamente uma porta da minha submissão python.
fonte
Prolog, 147 bytes
Como funciona
Converte o número decimal N na sua representação binária como uma lista (invertida). Significado:
Então:
Recursa na lista [H | T] aumentando N se o elemento principal for 0, caso contrário, diminuindo-o.
Se N em algum momento se tornar negativo ou se N no final não for 0, retorne false, caso contrário true.
O corte
Existe para evitar retroceder e encontrar soluções não binárias para
testes b (N, [N])
Experimente aqui online aqui
Execute-o com uma consulta como:
fonte
PowerShell, 106 bytes
Não vai ganhar nenhuma competição de menor duração, isso é certo. Mas ei, pelo menos está batendo em Java?
Usa a chamada .NET muito longa
[convert]::ToString($a,2)
para converter nosso número de entrada em uma sequência que representa os dígitos binários. Em seguida, fazemos um loop forçado nessa string com1..$b.length|%{..}
. Cada loop, se nosso dígito é a1
(avaliado com%2
mais do que-eq1
para salvar alguns bytes), incrementamos nosso contador; caso contrário, nós a diminuímos. Se alguma vez alcançarmos negativo, isso significa que houve mais do)
que o(
encontrado até agora, então produzimos0
eexit
. Quando terminamos o loop,$c
é um0
ou algum número>0
, então tomamos a lógica - não!
disso, que obtém a saída.Isso tem a peculiaridade de produzir
0
se os parênteses são incompatíveis porque temos mais)
, mas gerarFalse
se os parênteses são incompatíveis porque temos mais(
. Declarações falsas essencialmente funcionais equivalentes, apenas interessantes. Se todos os parênteses coincidirem, será geradoTrue
.fonte
GNU Sed (com extensão eval), 27
Sed realmente não tem uma idéia definida de truth e falsey, então aqui estou afirmando que a string vazia significa truth e todas as outras strings significam falsey.
Se isso não for aceitável, podemos fazer o seguinte:
GNU Sed (com extensão eval), 44
Isso gera 1 para verdade e 0 caso contrário.
fonte
ES (ESMin), 21 caracteres / 43 bytes
Try it here (Firefox only).
Observe que isso usa variáveis predefinidas para números (especificamente 2 e 0). Existem variáveis numéricas predefinidas de 0 a 256.
19 caracteres / 40 bytes, não competitivo
Try it here (Firefox only).
Decidiu implementar saída implícita ... No entanto, os formulários de saída anteriores ainda são suportados, então você obtém várias opções de saída!
fonte
Java,
129131 bytesProvavelmente pode ser reduzido. Explicação para vir. Graças a Geobits por 4 bytes de desconto!
fonte
int k=0;
comint j=0;
?int k=0,j=0;for(...
Depois, você pode colocar achar[]
declaração dentro do inicializador de loop para salvar também um ponto-e-vírgula.C ++, 61 bytes
Eu acho que a resposta atual do C ++ está errada: ele retorna um valor verdadeiro para todos os números pares, por exemplo, 4. Isenção de responsabilidade: não consegui usar o compilador mencionado, então usei o g ++ 4.8.4. O problema está no uso do operador AND binário em vez do AND lógico, que é usado para interromper cedo quando o número de parênteses de fechamento excede o número de parênteses de abertura. Essa abordagem pode funcionar se
true
for representada como uma palavra com um padrão de bits totalmente verdadeiro. No meu sistema, e provavelmente na maioria dos outros sistemas,true
é equivalente a1
; apenas um bit é verdadeiro. Além disso,n/=2
é menor quen>>=1
. Aqui está uma versão aprimorada como uma função:fonte
𝔼𝕊𝕄𝕚𝕟 (muito incompetente), 6 caracteres / 8 bytes
Try it here (Firefox only).
Decidi revisitar esse desafio depois de muito, muito tempo. G ficou muito melhor.
A razão pela qual essa resposta é separada é porque as duas versões são quase completamente diferentes.
Explicação
Converte a entrada em binário, substitui recursivamente as instâncias de 10 e verifica se o resultado é uma sequência vazia.
fonte
Bytes C # 98
aberto para sugestões. Eu gosto deste desafio, mesmo que seja antigo
fonte