É um número equilibrado?


38

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 é: 42615porque 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 00032vez 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.

Respostas:


12

05AB1E , 14 7 bytes

€D2äO`Q

Explicação

Usando 141 como exemplo:

€D       # duplicate each (turns the number into a list of digits)
         # STACK: ['1','1','4','4','1','1']
  2ä     # split list in 2 (as we duplicated each element, 
         # the middle element will exist on both sides for an odd length input
         # STACK: [['1','1','4'],['4','1','1']]
    O    # sum each sublist
         # STACK: [6,6]
     `   # flatten
         # STACK: 6, 6
      Q  # compare for equality
         # STACK: 1 (true)

Experimente online!


Você não pode usar em Ëvez de `Q?
Erik the Outgolfer

@ EriktheOutgolfer: Ëhavia um comando diferente quando esse desafio foi feito, então infelizmente não.
Emigna

10

> <> , 31 29 bytes

i:0(?v
~00}v>
v+r+>l4(?
>{=n;

Experimente 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



5

Braquilog , 20 bytes

@eL@2tM,Lr@2t:M:+a#=

Experimente online!

Explicação

@eL                    Get the list of digits L of the input
  L@2tM,               Get the second half M of L
        Lr@2t          Get the second half of the reverse of L
             :M        The list [L, M]
               :+a#=   The sum of elements of L and the sum of elements of M must be equal

5

Java, 85 bytes

n->{int s=0,i=0,l=n.length();for(;i<l/2;)s+=n.charAt(i)-n.charAt(l-++i);return s==0;}

Nota: a entrada é dada como Stringo Java não pode suportar sem BigInteger( BigIntegeres são construídos usando um .... String)

Testando e não destruído:

import java.util.function.Predicate;

public class Main {

  public static void main(String[] args) {
    Predicate<String> f = n -> {
      int s = 0, i = 0, l = n.length();
      for (; i < l / 2;) {
        s += n.charAt(i) - n.charAt(l - ++i);
      }
      return s == 0;
    };

    String[] truthies = {"1",
      "6",
      "11",
      "141",
      "23281453796004414",
      "523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088"};
    for (String s : truthies) {
      boolean result = f.test(s);
      System.out.println(result);
    }
    String[] falsies = {"10",
      "12",
      "110",
      "15421",
      "5234095123508321",
      "6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454"};
    for (String s : falsies) {
      boolean result = f.test(s);
      System.out.println(result);
    }
  }
}

Boa resposta. Você poderia salvar 2 bytes, fazendo o loop for vazio: for (; i < l / 2;s += n.charAt(i) - n.charAt(l - ++i));.
todeale 24/09/16

@todeale Veja o código do golfe, não o código não-destruído. Eu acho que sua sugestão e minha resposta golfed usar a mesma quantidade de bytes
Olivier Grégoire

Opa! Agora eu vejo.
todeale 24/09/16

5

Mathematica, 57 bytes

Tr@(#-Reverse@#)[[;;⌊Length@#/2⌋]]==0&@*IntegerDigits

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.

...&@*IntegerDigits

Primeiro, transformamos a entrada em uma lista de dígitos decimais e passamos o resultado para a função sem nome à esquerda.

...(#-Reverse@#)...

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}

...[[;;⌊Length@#/2⌋]]

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 0qualquer maneira).

Tr@...

E então somamos esta lista. Então isso é:

a1 - an + a2 - an-1 + ... + a⌊n/2⌋ - a⌈n/2⌉+1

Reorganizando:

a1 + a2 + ... + a⌊n/2⌋ - (a⌈n/2⌉+1 + ... + an-1 + an)

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:

...==0

5

JavaScript (ES6), 59 55 51 44 42 bytes

f=([x,...a],n=0)=>a[0]?f(a,x-a.pop()+n):!n

Acontece 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:

f=([x,...a])=>a[0]?x-a.pop()+f(a):0

Snippet de teste


Eu realmente gosto disso n[i*2]! Agradável.
Arnauld

@ Arnauld Obrigado :-) Encontrei uma abordagem completamente diferente agora que não precisa disso ...
ETHproductions

Agora, isso é brilhante!
Arnauld

Você não pode usar f=([x,...a])=>!(a[0]?x-a.pop()+f(a):0)?
mbomb007

@ mbomb007 Não; que retornaria um booleano (coagido a 0 ou 1) após cada recursão, em vez de uma soma.
ETHproductions

4

PowerShell v2 +, 85 bytes

param($a)!((,'('+$a[0..(($b=$a.length)/2-1)]+'0)-('+$a[($b/2)..$b]+'0)')-join'+'|iex)

Recebe a entrada $acomo uma string (necessária para suportar números >2^64-1sem 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)-(e 0), a formulação de uma matriz de chars e strings. Observe o ,na frente para impor concatenação de matriz, não concatenação de cadeia de caracteres.

Essa matriz inteira é -joineditada juntamente com +, resultando em uma string como(+1+4+0)-(+2+3+0) , e você pode ver que os 0são necessários para evitar erros de sintaxe. Isso é alimentado |iex(abreviado Invoke-Expressione semelhante a eval), o que calculará o resultado matemático. Enquanto a string estiver equilibrada, você obterá 0uma saída, que encapsulamos em parênteses e pegamos o booleano, e não o mesmo !(...), para a saída True. Se for um número inteiro diferente de zero, será exibido False.

Casos de teste

PS C:\Tools\Scripts\golfing> '1','6','11','141','23281453796004414','523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088'|%{$_;.\is-it-a-balanced-number.ps1 $_;'---'}
1
True
---
6
True
---
11
True
---
141
True
---
23281453796004414
True
---
523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088
True
---

PS C:\Tools\Scripts\golfing> '10','110','15421','5234095123508321','6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454'|%{$_;.\is-it-a-balanced-number.ps1 $_;'---'}
10
False
---
110
False
---
15421
False
---
5234095123508321
False
---
6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454
False
---

4

Perl, 29 bytes

Inclui +5 para -lpF

Dê o número em STDIN

balanced.pl <<< 1423

balanced.pl:

#!/usr/bin/perl -lpF
$;+=$_-pop@F for@F;$_=!$

4

C #, 83 bytes

n=>{var t=n+"";int l=t.Length,i=0,r=0;for(;i<l/2;)r+=t[i]-t[l-1-i++];return r==0;};

Experimente online!

Fonte completa, incluindo caso de teste:

using System;
using System.Numerics;

namespace BalancedNumber
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<BigInteger,bool>s= n=>{var t=n+"";int l=t.Length,i=0,r=0;for(;i<l/2;)r+=t[i]-t[l-1-i++];return r==0;};

            Console.WriteLine(s(1));    //true
            Console.WriteLine(s(6));    //true
            Console.WriteLine(s(11));   //true
            Console.WriteLine(s(141));  //true
            Console.WriteLine(s(23281453796004414));    //true
            BigInteger bi = BigInteger.Parse("523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088");
            Console.WriteLine(s(bi));   //true
            Console.WriteLine(s(10));   //false
            Console.WriteLine(s(12));   //false
            Console.WriteLine(s(110));  //false
            Console.WriteLine(s(15421));    //false
            Console.WriteLine(s(5234095123508321)); //false
            bi = BigInteger.Parse("6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454");
            Console.WriteLine(s(bi));   //false
        }
    }
}

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):

t=>{int l=t.Length,i=0,r=0;for(;i<l/2;)r+=t[i]-t[l-1-i++];return r==0;};

1
Não surpreendentemente, minha resposta c acabou parecendo bastante com essa. Você pode fazer em t[l-++i]vez de t[l-1-i++], e em return !rvez de return r==0?
Digital Trauma

A prefixação do operador de incremento deve fazer o truque e salvar 2 bytes, mas em C # o valor de retorno deve ser um booleano, portanto! R não o cortará. Obrigado, atualizarei minha resposta o mais rápido possível.
adrianmp

4

Python 3, 107 102 76 bytes

n=input()
l=len(n)
print(sum(map(int,n[:l//2]))==sum(map(int,n[l//2+l%2:])))

-26 bytes de @Rod !


2
você pode substituir floor(l/2)por l//2e ceil(l/2)com l//2+l%2para salvar 7 bytes e remover a importação matemática, economizando mais 18
Rod

1
também você não precisa do 0on n[0:l//2]e n[l//2+l%2:]poderia ser n[-(l//2):]. Ou você pode mover o //2para l=len(n)//2e usar n[:l]en[-l:]
Rod

5
Também parece muito estranho quando sua importação não está no topo.
mbomb007

@ Rod Eu vim aqui para mudar todas as coisas que você mencionou no primeiro comentário, mas fiquei impressionado com o segundo, muito obrigado! :)
Yytsi 23/09/16

@Rod Usando sua última dica no seu segundo comentário, as caixas de teste de um dígito retornam valores falsey :(
Yytsi 23/09/16

4

Ruby, 63 bytes

->s{e=s.chars*?+
l=s.size
e[l-1-r=l%2,2*r+1]="=="
l<2||eval(e)}

Nota: arg sdeve ser string.

Teste (minitest 5+ necessário):

require 'minitest/autorun'

class TestRunner < Minitest::Test
  def setup
    @truthy_nums = %w(1 6 11 141 23281453796004414 523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088)
    @falsy_nums = %w(10 110 15421 5234095123508321 6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454)

@f=->s{e=s.chars*?+
l=s.size
e[l-1-r=l%2,2*r+1]="=="
l<2||eval(e)}

  end
  def test_true
    @truthy_nums.each do |e|
      assert @f[e], e
    end
  end
  def test_false
    @falsy_nums.each do |e|
      assert !@f[e], e
    end
  end
end

4

Haskell, 55 bytes

g(h:t)=read[h]-g(reverse t)
g _=0
(==0).g.(<*"xx").show

A função recursiva gquebra 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.

   g "12345" 
== 1 - g "5432"
== 1 - (5 - g "432")
== 1 - (5 - (4 - g "32"))
== 1 - (5 - (4 - (3 - g "2"))
== 1 - (5 - (4 - (3 - 2))
== 1 + 2 + 3 - 4 - 5

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.


3

Retina, 64 44 bytes

^((.)*?).?(?=(?<-2>.)*$)
$1 
\d
$*
^(1+) \1$

Experimente 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.


Por que você usaria um grupo de não captura em um código de golfe? ;) Independentemente disso, no .NET é muito mais curto dividir a string com grupos de balanceamento: retina.tryitonline.net/… (Eu também tentei vários estágios, mas isso acaba retina.tryitonline.net/… um pouco mais ).
Martin Ender

@MartinEnder Sim, eu sabia que seria, mas nunca entendi o conceito. E suponho que negligenciei o grupo que não capturava.
mbomb007

1
É realmente simples neste caso: contamos caracteres (.)*?(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.
Martin Ender

3

JavaScript (ES6), 74 67 ... 59 50 bytes

Soma recursivamente a diferença do primeiro e do último dígito até restarem menos de dois dígitos:

let f =

n=>!(F=n=>n[1]?(n.pop()-n.shift()+F(n)):0)([...n])

// some truthy examples
console.log(f("11"));
console.log(f("141"));
console.log(f("523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088"));

// some falsy examples
console.log(f("12"));
console.log(f("110"));
console.log(f("6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454"));


1
Boa técnica. Eu acho que você pode fazer (s-=i<0?v:-v).
ETHproductions

@ETHproductions - Interessante ver o quão perto os métodos com e sem o Math.sign()resultado são.
Arnauld

Darn, você pode ter me batido para a boa ... nice one :)
ETHproductions

Eu estava errado ;-)
ETHproductions

3

R, 105 96 bytes

Acontece que R é muito detalhado. Recebe a entrada como um caractere.

function(x){y<-as.numeric(unlist(strsplit(x,"")));l<-length(y)%/%2;sum(tail(y,l))==sum(head(y,l))}

Formatado bem:

function(x){
    y=as.numeric(unlist(strsplit(x,"")))
    l=length(y)%/%2
    sum(tail(y,l))==sum(head(y,l))
}

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,: tailpega 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)): like tail, headpega os primeiros n elementos do vetor, encontrados da mesma maneira.

Edições

  • Economizou sete bytes graças a niam
  • Comutado para em =vez de <-, salvou outros dois bytes.

Você pode vincular de length(y)%/%2alguma forma a uma variável e usá-la nas chamadas de taile head?
nimi

@nimi Oh sim, bom ponto.
Azor Ahai 23/09/16

85 bytes tio.run/…
Sumner18

consolidando ye na primeira soma, alterando as.numeric para as.double (), unlist () para el (). Isso me permitiu fazer tudo em uma linha, removendo os suportes, e Pryr :: f suposições os formals / variáveis a partir do código
Sumner18

3

Flacidez cerebral , 410 206 204 204 178 + 3 = 181 bytes

Aqui está uma versão de 178 bytes que usa o -asinalizador.

26 bytes jogados fora por DJMcMayhem

Experimente Online

([])(<(()()(<>))>)<>{({}[()])<>(({}()[({}<({}())>)])){{}(<({}({}<({}[()])>))>)}{}<>}{}<>{}{}({}<>){({}[()]<({}<>)<>>)}{}([]<>[[]]<>){(<{}{}>)}{}({{}<>[{}]<>}<(())>){{}{}((<>))}{}

Aqui está uma versão mais longa de 410 bytes que não usa o -asinalizador.

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.

{{}{}((<>))}{}

Por que usar ([]){[{}]{}([])}{}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.
DJMcMayhem

@DJMcMayhem Good point. Esqueci que não havia zero na pilha
Wheat Wizard

3

Na verdade, 17 16 bytes

Esta 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!

$♂≈;l½L│±aHΣ)tΣ=

Ungolfing

      Implicit input n.
$♂≈   list(str(n)). This converts n to a list of n's digits.
;l    Duplicate the list of digits and get its length. Call it len.
½L    Push len//2.
│     This duplicates the stack.
        Stack: len//2, digit_list, len//2, digit_list
±     Negate the len//2 at TOS for later.
a     Invert the stack.
        Stack: digit_list, len//2, digit_list, -(len//2)
HΣ    Push digit_list[:len//2], then push its sum.
)     Rotate this first sum to BOS.
tΣ    Push digit_list[-(len//2):], then push its sum.
=     Check if those sums are equal.
      Implicit return.

3

Perl 6 ,  42 39  33 bytes

{[==] .comb[{^($_/2),Int($_/2)..*}]>>.sum}

Teste-o

{[==] .comb[^(*/2),(*/2).Int..*]>>.sum}

Teste-o

{[==] .comb[^*/2,^*/2+*/2]>>.sum}

Teste (de Jo King )

Explicação:

{ # lambda with implicit parameter 「$_」

  [==]                   # reduce the following using &infix:«==»

    .comb\               # split input into individual characters
    [                    # index into that using:

      # first half of the values (includes middle value)
      # 「(0/2) ..^ (*/2)」
      ^ * / 2,     

      # last half of the values (includes middle value)
      ^ * / 2            # same number of values as first half
        + * / 2          # shifted up by half

    ]\
    >>.sum               # sum each of the two halves separately
}

Isso parece não funcionar mais (suspeito que haja uma alteração na maneira como ..lida com não-inteiros). Como cerca de 33 bytes em vez
Jo rei

2

Javascript, 73 bytes

Good ol 'ES5 loops

for(a=c=0,b=(l=(s=prompt()).length)-1;a<~-l/2;c-=s[a++]-s[b--]);alert(!c)

O que está acontecendo aqui?

for(
    a=c=0,               // a = left digits of the number
                         // c = the result
    b=                   // b = right digits of number
        (l=              // l = length of number - 1
            (s=prompt()) // s = the number as input from user
        .length)-1; 

    a<~-l/2;             // while a < length of number / 2, rounded down (~-)

    c-=
        s[a++]           // c -= left digit
        -
        s[b--]           // c += right digit (because - and - == +)
 );
                         // for balanced numbers c should be 0
 alert(!c)               // 0 equals false in javascript, so output the opposite of c

2

Python 2, 73 bytes

def f(n):x=map(int,str(n));d=len(x)/2;print sum(x[:d])==sum(x[-d:])or d<1

Os testes estão em ideone

Temos que usar em str()vez de ``, pois npode estar fora do intervalo do int assinado.


Ah, é por isso que eu estava recebendo o L no final. +1
ElPedro

2

Python 2, 83 77 bytes

g=[int(h)for h in raw_input()];b=int(len(g)/2);print sum(g[:b])==sum(g[-b:])or b==0

EDITAR

reduzido para 77 com a ajuda de @Rod

g=[int(h)for h in raw_input()];b=len(g)/2;print sum(g[:b])==sum(g[-b:])or b<1

Exemplos:

D:\>bal.py
1
True

D:\>bal.py
6
True

D:\>bal.py
523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088
True

D:\>bal.py
10
False

D:\>bal.py
110
False

D:\>bal.py
 6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454
False

você pode usar map(int,input())em vez [int(h)for h in raw_input()], len(g)/2será sempre int, não há necessidade de se converter, e or b==0ins't realmente necessário
Rod

na verdade, b==0é necessário len=1, mas você pode reduzi-lo parab<1
Rod

2

PHP, 73 67 60 57 bytes

Requer PHP 7.1 para deslocamentos negativos de string:

for(;2*$x<strlen($a=$argn);)$s+=$a[$x++]-$a[-$x];echo!$s;

Corre:

echo 15324 | php -nR 'for(;2*$x<strlen($a=$argn);)$s+=$a[$x++]-$a[-$x];echo!$s;';echo

Versão anterior

Nota: requer PHP 7 para o operador da nave espacial.

for(;$x<$l=strlen($a=$argv[1]);)$s+=(2*$x<=>$l-1)*$a[$x++];echo!$s;

Execute assim:

php -d error_reporting=30709 -r 'for(;$x<$l=strlen($a=$argv[1]);)$s+=(2*$x<=>$l-1)*$a[$x++];echo!$s;' -- 15324;echo

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 :

  index     0  1  2  3  4 
  digit     1  5  3  2  4

  2*index   0  2  4  6  8
  length-1  4  4  4  4  4
  factor    1  1  0 -1 -1  # Result of the spaceship operator

  result    1  5  0 -2 -4
           --------------
  sum                   0

Tweaks

  • Não defina o dígito para $d , apenas itere o comprimento da entrada. Salvo 5 bytes.
  • O deslocamento da string nullnão precisa ser convertido paraint que o PHP o interprete como 0. Guardou 1 byte.
  • Usando deslocamentos negativos de sequência para obter os dígitos da segunda metade e iterando para metade da sequência. Economizou 7 bytes, mas requer PHP 7.1
  • Salva 3 bytes usando $argn

2

Clojure, 66 64 bytes

Atualização: Retirado strda map intfunção.

(comp #(=(apply +(map -(drop(/(count %)2)%)%))0)#(map int %)str)

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 interiormap 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 lete definir apenas uma única função.


1

sed (165 + 1 para -r) 166

/^.$/c1
:l;s,^([^!])([^!]*)([^!])!?([^=]*)=?(.*),\2!\4\1=\5\3,;tl;:
s,.?!|0,,;s,2,11,;s,3,21,;s,4,31,;s,5,41,;s,6,51,;s,7,61,
s,8,71,;s,9,81,;t;s,1=1,=,;t;/^=$/c1
c0

Saída:
1 para verdadeiro
0 para falso

Experimente online!


1

Python 2.7, 102 92 bytes

O loop For funciona melhor: /

s=`input()`
a,b,l=0,0,len(s)
for i in range(l/2):a=a+int(s[i]);b=b+int(s[l-i-1])
print a==b

Mesma idéia, basta usar length - i para obter o outro lado. Nunca chegará ao centro de um número ímpar.

Código antigo

s=input()
l=len(s)
def n(i):return 0if not i else int(i[0])+n(i[1:])
print n(s[:l/2])==n(s[l/2+l%2:])

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: /


1

Função C, 74

l;i;t;f(char *n){l=strlen(n);for(t=i=0;i<l/2;)t+=n[i]-n[l-++i];return !t;}

Ideone.


Você não pode usar strlen sem incluir #include"string.h"\n, o que adiciona 19 à sua pontuação.
NoSeatbelts

1
@NoSeatbelts Sim, você pode - experimente o link Ideone. O compilador provavelmente fornecerá vários avisos, mas compilará um executável de qualquer maneira (pelo menos o GCC e o Clang). Qual compilador você está usando? Há até uma dica de código de golfe sobre isso .
Digital Trauma

1
Não há necessidade do espaçochar *n
Cyoce

Remover espaços l;i;t;f(char*n){..return!t;}-2 bytes
Khaled.K 7/17

1

Raquete 204 bytes

(define(f n)(let*((s(number->string n))(g(λ(x y)(apply +(map(λ(x)(string->number(string x)))
(string->list(substring s x y))))))(l(string-length s))(h(/ l 2)))(if(=(g 0(floor h))(g(ceiling h)l))#t #f)))

Versão detalhada:

(define (f1 n)
(let* (  (s (number->string n))
         (g(λ(x y)
              (apply + (map
                        (λ(x)
                          (string->number
                           (string x)))
                        (string->list
                         (substring s x y))))))
         (l (string-length s))
         (h (/ l 2)))
    (if(= (g 0 (floor h)) (g (ceiling h) l)) 
       #t #f  ) ) ) 

Teste:

(f 23281453796004414)
(f 523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088)
(f 15421)
(f 5234095123508321)

Saída:

#t
#t
#f
#f


1

Mathematica, 69

Tr@#[[;;⌊l=Length@#/2⌋]]==Tr@#[[⌈l⌉+1;;]]&@*IntegerDigits

2
Você pode salvar alguns bytes alterando o final para...;;]]&@*IntegerDigits
Martin Ender

@MartinEnder obrigado, mas como isso funciona?
shrx,

@*é a abreviação de Composition. f@*gé f[g[##]]&.
Martin Ender
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.