Um número é balanceado se a soma dos dígitos em cada metade do número for igual, então: 1423
é balanceado porque 1+4 = 2+3
, assim é: 42615
porque 4+2=1+5
. Observe que o dígito do meio não está incluído nos dois lados (ou nos dois lados) se houver um número ímpar de dígitos.
Desafio:
Pegue um número inteiro positivo como entrada e produza um valor verdadeiro, se for equilibrado, e um valor falso, se for desequilibrado.
Casos de teste (verdadeiro)
1
6
11
141
1221
23281453796004414
523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088
Casos de teste (falso)
10
12
110
15421
5234095123508321
6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454
Não haverá números começando com zero, por exemplo, em 00032
vez de 32
. Você deve suportar números de pelo menos 100 dígitos (com tamanho maior que 2^64-1
). Como sempre, formato de entrada opcional, para que você possa cercar o número com apóstrofos, se desejar.
Ë
vez de`Q
?Ë
havia um comando diferente quando esse desafio foi feito, então infelizmente não.> <> ,
3129 bytesExperimente online!
Linha 1: loop de entrada padrão
Linha 2: descarte o -1 na parte superior da pilha, pressione dois 0s e gire um para o fundo da pilha (isso garante que entradas de comprimento <3 não esgotem a pilha posteriormente no programa)
Linha 3: se o comprimento da pilha for> 3, adicione os dois elementos superior e inferior dois da pilha juntos.
Linha 4: Se as partes superior e inferior da pilha forem iguais, imprima 1, 0 caso contrário.
Edit: percebeu que não há necessidade de pegar os caracteres mod 12, 2 bytes salvos
fonte
Haskell,
6463 bytesOne Byte Salvo graças a nimi
fonte
b(a:t@(r:s))=a-last t+b(init t);b _=0
Braquilog , 20 bytes
Experimente online!
Explicação
fonte
Java, 85 bytes
Nota: a entrada é dada como
String
o Java não pode suportar semBigInteger
(BigInteger
es são construídos usando um ....String
)Testando e não destruído:
fonte
for (; i < l / 2;s += n.charAt(i) - n.charAt(l - ++i));
.Mathematica, 57 bytes
Explicação
Eu realmente esperava poder usar essa abordagem em algum idioma, e parece estar indo muito bem no Mathematica. A idéia é evitar a obtenção da metade da frente e de trás combinando a lista com o reverso e olhando apenas para a metade da frente.
Primeiro, transformamos a entrada em uma lista de dígitos decimais e passamos o resultado para a função sem nome à esquerda.
Agora subtraímos o reverso da lista da própria lista. Se os dígitos forem , o resultado será .
{a1,a2,...,an}
{a1-an,a2-an-1,...,an-a1}
Extraímos a primeira metade desta lista (excluindo o dígito do meio, embora isso realmente não importe, porque a diferença correspondente será de
0
qualquer maneira).E então somamos esta lista. Então isso é:
Reorganizando:
A entrada é equilibrada se as duas metades tiverem a mesma soma. Portanto, essa expressão é zero se a entrada estiver equilibrada. Então é isso que verificamos:
fonte
JavaScript (ES6),
5955514442 bytesAcontece que eu estava usando a estratégia errada completamente. Esta versão encontra recursivamente a soma da primeira metade menos a soma da segunda metade e, em seguida, retorna o NOT lógico do resultado.
Se pudéssemos retornar o falso no lugar da verdade e vice-versa, seriam 35 bytes:
Snippet de teste
Mostrar snippet de código
fonte
n[i*2]
! Agradável.f=([x,...a])=>!(a[0]?x-a.pop()+f(a):0)
?PowerShell v2 +, 85 bytes
Recebe a entrada
$a
como uma string (necessária para suportar números>2^64-1
sem entrar em uma[biginteger]
transmissão extremamente desajeitada na linha de comando).Para a explicação, vamos assumir a entrada de
'1423'
. Estamos construindo uma nova string. As duas fatias de matriz são óbvias ($a[...]
), e que está rodeado por três cordas adicionais(
,0)-(
e0)
, a formulação de uma matriz dechar
s estring
s. Observe o,
na frente para impor concatenação de matriz, não concatenação de cadeia de caracteres.Essa matriz inteira é
-join
editada juntamente com+
, resultando em uma string como(+1+4+0)-(+2+3+0)
, e você pode ver que os0
são necessários para evitar erros de sintaxe. Isso é alimentado|iex
(abreviadoInvoke-Expression
e semelhante aeval
), o que calculará o resultado matemático. Enquanto a string estiver equilibrada, você obterá0
uma saída, que encapsulamos em parênteses e pegamos o booleano, e não o mesmo!(...)
, para a saídaTrue
. Se for um número inteiro diferente de zero, será exibidoFalse
.Casos de teste
fonte
Perl, 29 bytes
Inclui +5 para
-lpF
Dê o número em STDIN
balanced.pl
:fonte
C #, 83 bytes
Experimente online!
Fonte completa, incluindo caso de teste:
O tipo de dados BigInteger permite qualquer tamanho de número. Se o número for muito grande, o compilador reclamará (o erro CS1021: constante integral é muito grande ); portanto, o método BigInteger.Parse (String) será usado.
A solução pode realmente ser reduzida para 72 bytes, considerando que a entrada é uma string (e atualizando o programa de acordo):
fonte
t[l-++i]
vez det[l-1-i++]
, e emreturn !r
vez dereturn r==0
?Python 3,
10710276 bytes-26 bytes de @Rod !
fonte
floor(l/2)
porl//2
eceil(l/2)
coml//2+l%2
para salvar 7 bytes e remover a importação matemática, economizando mais 180
onn[0:l//2]
en[l//2+l%2:]
poderia sern[-(l//2):]
. Ou você pode mover o//2
paral=len(n)//2
e usarn[:l]
en[-l:]
Ruby, 63 bytes
Nota: arg
s
deve ser string.Teste (minitest 5+ necessário):
fonte
Haskell, 55 bytes
A função recursiva
g
quebra uma sequência numérica de ambas as extremidades, repetidamente, pegando a cabeça e depois revertendo. Subtrai o resultado recursivo da cabeça, o que causa coeficientes alternativos de +1 e -1, com +1 aplicado na primeira metade e -1 na segunda metade.Então, é preciso a soma da primeira metade menos a soma da segunda metade. Isso tem o problema de que, com um número ímpar de dígitos, o centro amarra à esquerda, mas a função principal corrige isso
(<*"xx")
, que dobra cada caractere, ou seja, "12345" se torna "1122334455". Dessa forma, o dígito do meio se divide igualmente em ambos os lados e cancela.fonte
Retina,
6444 bytesExperimente online
O primeiro estágio divide a corda no meio, omitindo o caractere do meio, se houver uma (
tirada e modificada daqui .Cortesia de Martin.) Em seguida, substitua os dígitos pela representação unária e faça a correspondência se as duas metades tiverem o mesmo comprimento.fonte
(.)*?
(cada iteração envia uma captura para a pilha 2). Em seguida, tentamos chegar ao fim retornando da pilha novamente com(?<-2>.)*$
(após um dígito do meio opcional). A primeira vez que isso é possível é quando nós capturamos exatamente metade dos dígitos (baixo arredondado) para o grupo 2.JavaScript (ES6),
7467...5950 bytesSoma recursivamente a diferença do primeiro e do último dígito até restarem menos de dois dígitos:
fonte
(s-=i<0?v:-v)
.Math.sign()
resultado são.R,
10596 bytesAcontece que R é muito detalhado. Recebe a entrada como um caractere.
Formatado bem:
Explicação
y<-as.numeric(unlist(strsplit(x,"")))
Divida a entrada (uma string_ e coagi-a em um vetor em vez de em uma lista e, em seguida, volte a transformá-la em números inteiros.sum(tail(y,
:tail
pega os últimos n elementos, encontrados por:length(y)%/%2))
, onde%/%
é a divisão inteira, para obter o teto do quociente, onde o comprimento é ímpar.sum(head(y,length(y)%/%2))
: liketail
,head
pega os primeiros n elementos do vetor, encontrados da mesma maneira.Edições
=
vez de<-
, salvou outros dois bytes.fonte
length(y)%/%2
alguma forma a uma variável e usá-la nas chamadas detail
ehead
?Flacidez cerebral ,
410206204 204178 + 3 = 181 bytesAqui está uma versão de 178 bytes que usa o
-a
sinalizador.26 bytes jogados fora por DJMcMayhem
Experimente Online
Aqui está uma versão mais longa de 410 bytes que não usa o
-a
sinalizador.Experimente Online
Explicação
Aqui está uma explicação da solução mais curta
Para começar, o número é convertido em todos os seus valores ASCII pelo
-a
sinalizador.Empurramos a altura da pilha (ou seja, número de dígitos) e dividimos por dois.
Para cada número menor que o número que acabamos de enviar, movemos um dígito para a outra pilha
Se as pilhas tiverem alturas diferentes, removeremos o item superior da pilha atual
Queremos a diferença entre as somas de cada pilha. Então, usamos o seguinte algoritmo para somar cada pilha.
Isso pressupõe que nenhum dígito tenha um valor ASCII igual a zero, o que é uma suposição válida.
Executamos isso para as duas pilhas e pegamos a diferença (
<(())>
é necessário para a próxima parte.Agora queremos negar a soma. Se a soma for zero, ela abrirá a tampa revelando a que pressionamos anteriormente, caso contrário, ela removerá o número e o número e colocará um zero em cima.
fonte
([]){[{}]{}([])}{}
para somar cada pilha?({{}})
deve funcionar muito bem e, como você está recebendo entrada ASCII, não precisa se preocupar com o zero arruinando o loop.Na verdade,
1716 bytesEsta resposta é inspirada em resposta Python 2 do ElPedro e em sua ideia de uso
[-b:]
. Sugestões de golfe são bem-vindas. Experimente online!Ungolfing
fonte
Perl 6 ,
42 3933 bytesTeste-o
Teste-o
Teste (de Jo King )
Explicação:
fonte
..
lida com não-inteiros). Como cerca de 33 bytes em vezJavascript, 73 bytes
Good ol 'ES5 loops
O que está acontecendo aqui?
fonte
Python 2, 73 bytes
Os testes estão em ideone
Temos que usar em
str()
vez de ``, poisn
pode estar fora do intervalo do int assinado.fonte
Python 2,
8377 bytesEDITAR
reduzido para 77 com a ajuda de @Rod
Exemplos:
fonte
map(int,input())
em vez[int(h)for h in raw_input()]
,len(g)/2
será sempre int, não há necessidade de se converter, eor b==0
ins't realmente necessáriob==0
é necessáriolen=1
, mas você pode reduzi-lo parab<1
PHP,
73676057 bytesRequer PHP 7.1 para deslocamentos negativos de string:
Corre:
Versão anterior
Nota: requer PHP 7 para o operador da nave espacial.
Execute assim:
Explicação
Repete os dígitos no número. Verifica se o dígito pertence à primeira metade ou à segunda metade (ou é o dígito do meio) comparando o índice do dígito com o comprimento da entrada com a comparação combinada (
2 * $x <=> $l - 1
). Multiplique isso pelo dígito, pegue a soma de todos os dígitos. Se for um número equilibrado, a soma será0
.Exemplo com entrada
15324
:Tweaks
$d
, apenas itere o comprimento da entrada. Salvo 5 bytes.null
não precisa ser convertido paraint
que o PHP o interprete como0
. Guardou 1 byte.$argn
fonte
Clojure,
6664 bytesAtualização: Retirado
str
damap int
função.Isso teria sido reduzido se o formato de entrada fosse mais flexível, agora eu tinha que primeiro mapear o número inteiro em uma sequência de valores ASCII. O interior
map
calcula as diferenças de valores em pares das duas metades, e isso verifica se a soma dos deltas é zero.((comp f g h) x y z)
=(f (g (h x y z))
.Na verdade, isso acabou tendo o mesmo tamanho que apenas fazer o mapeamento dentro de
let
e definir apenas uma única função.fonte
sed (165 + 1 para -r) 166
Saída:
1 para verdadeiro
0 para falso
Experimente online!
fonte
Python 2.7,
10292 bytesO loop For funciona melhor: /
Mesma idéia, basta usar length - i para obter o outro lado. Nunca chegará ao centro de um número ímpar.
Código antigo
Obtém entrada
Salva o comprimento da entrada
Função recursiva para obter a soma da string
Compare a primeira metade da soma com a segunda metade da soma
Tentando obtê-lo abaixo de 100, mas é difícil: /
fonte
Função C, 74
Ideone.
fonte
#include"string.h"\n
, o que adiciona 19 à sua pontuação.char *n
l;i;t;f(char*n){..return!t;}
-2 bytesRaquete 204 bytes
Versão detalhada:
Teste:
Saída:
fonte
Pyke, 20 bytes
Experimente aqui!
fonte
not [0]
0 não 1Mathematica, 69
fonte
...;;]]&@*IntegerDigits
@*
é a abreviação deComposition
.f@*g
éf[g[##]]&
.