Números com equilíbrio triplo

13

Descrição

Consideramos um número inteiro com pelo menos três dígitos com balanceamento triplo se, quando divididos em três partes, os dígitos de cada parte somarem o mesmo número. Dividimos os números da seguinte forma:

abcdefghi - Standard case: the number of digits is divisable through 3:
abc def ghi

abcdefgh - Number % 3 == 2: The outer groups are both assigned another digit
abc de fgh (the inner group will have one digit less than both outer groups)

abcdefghij - Number % 3 == 1: The inner group is assigned the extra digit
abc defg hij (the inner group will have one digit more than the outer groups)

Desafio

Sua tarefa é escrever um programa que, dado um número inteiro com pelo menos três dígitos, determine se o número fornecido é triplo-balanceado e gera um valor verdadeiro ou falso com base no resultado.

Casos de teste

333 -> True
343 -> False
3123 -> True
34725 -> True
456456 -> False
123222321 -> True

Isso é , então as brechas padrão se aplicam e pode ganhar a resposta mais curta em bytes!

racer290
fonte
1
Pelo que entendi, se você pode dividir igualmente, deve.
11456 Totallyuman Humano
@ Mr.Xcoder você dividi-lo em três partes (ele ainda não funciona como por @ o comentário de MagicOctopusUnr:when split in three parts,
Stephen
4
Considere usar o Sandbox , para evitar essa situação no futuro.
Mr. Xcoder
2
Ops! Sinto muito pela confusão sobre os casos de teste, aparentemente tive algum tipo de reviravolta na minha cabeça. Agora que eles foram corrigidos, espero que você vote para reabrir meu desafio.
racer290
5
Por padrão, a entrada pode ser aceita como uma sequência. Pode ser tomado como uma matriz de dígitos?
18777 Luis Mendo

Respostas:

7

Python 2 , 93 88 86 bytes

-4 bytes graças a @LeakyNun
-2 bytes graças a @ Mr.Xcoder

def g(i):l=-~len(i)/3;print f(i[:l])==f(i[l:-l])==f(i[-l:])
f=lambda a:sum(map(int,a))

Experimente online!

ovs
fonte
3

Gelatina , 23 bytes

DµL‘:3‘Ṭ©œṗ⁸U®œṗЀS€€FE

Experimente online!

Deve haver uma maneira mais curta que de alguma forma voou sobre minha cabeça ...

Freira Furada
fonte
Parece simples, mas realmente não é tbh ... Mesmo difícil em 05AB1E devido à divisão não padrão.
Magic Octopus Urn
3

Retina , 89 bytes

^|$
¶
{`¶(.)(.*)(.)¶
$1¶$2¶$3
}`^((.)*.)(.)¶((?<-2>.)*)¶(.)
$1¶$3$4$5¶
\d
$*
^(1+)¶\1¶\1$

Experimente online! O link inclui casos de teste. Explicação: O primeiro estágio adiciona novas linhas no início e no final da entrada. O segundo estágio tenta mover os dígitos pelas novas linhas em pares; no entanto, se não houver dígitos suficientes no meio, o terceiro estágio poderá movê-los para trás, fazendo com que o loop pare. O quarto estágio então converte cada dígito separadamente em unário, somando-o, enquanto o último estágio simplesmente verifica se as somas são iguais.

Neil
fonte
2

Mathematica, 142 bytes

(s=IntegerDigits@#;c=Floor;If[Mod[t=Length@s,3]==2,a=-1;c=Ceiling,a=Mod[t,3]];Length@Union[Tr/@FoldPairList[TakeDrop,s,{z=c[t/3],z+a,z}]]==1)&
J42161217
fonte
2

Gelatina , 20 bytes

DµL‘:3x2jSạ¥¥LRṁ@ḅ1E

Experimente online!

Como funciona

DµL‘:3x2jSạ¥¥LRṁ@ḅ1E  Main link. Argument: n

D                     Decimal; convert n to base 10, yielding a digits array A.
 µ                    Begin a new chain with argument A.
  L                   Compute the length of A.
   ‘                  Increment; add 1 to the length.
    :3                Divide the result by 3.
                      This yields the lengths of the outer chunks.
      x2              Repeat the result twice, creating an array C.
             L        Compute l, the length of A.
            ¥         Combine the two links to the left into a dyadic chain.
                      This chain will be called with arguments C and l. 
           ¥              Combine the two links to the left into a dyadic chain.
         S                    Take the sum of C.
          ạ                   Compute the absolute difference of the sum and l.
        j                 Join C, using the result to the right as separator.
                      We now have an array of the lengths of all three chunks the
                      digits of n have to be split in.
              R       Range; map each chunk length k to [1, ..., k].
               ṁ@     Mold swapped; takes the elements of A and give them the shape
                      of the array to the right, splitting A into chunks of the
                      computed lengths.
                 ḅ1   Convert each chunk from unary to integer, computing the sum
                      of its elements.
                   E  Test if the resulting sums are all equal.
Dennis
fonte
1
Eu adoraria ler uma explicação
Felix Dombek
@FelixDombek Adicionei uma explicação.
Dennis
0

Javascript, 178 bytes

(a)=>{b=a.split(/(\d)/).filter((v)=>v);s=Math.round(b.length/3);f=(m,v)=>m+parseInt(v);y=b.slice(s,-s).reduce(f,0);return b.slice(0,s).reduce(f,0)==y&&y==b.slice(-s).reduce(f,0)}
cdm
fonte
Bem-vindo ao PPCG! Você leu as páginas de dicas ? Há muito espaço para jogar sua resposta para baixo.
Neil
Caso você ainda esteja interessado, consegui reduzir sua resposta para 106 bytes: ([...b],s=~b.length/3|0,f=(m,v)=>+m+ +v,y=b.splice(s).reduce(f))=>b.splice(-s).reduce(f)==y&y==b.reduce(f)(tome cuidado ao copiar dos comentários, pois o Stack Exchange insere caracteres invisíveis).
314 Neil
Beautyful! Muitas coisas para eu aprender lá.
Cdm
0

Java 8, 149 bytes

q->{int l=q.length,s=(l+1)/3,a=0,b=0,c=0,i=0;for(;i<s;a+=q[i++]);for(i=s,s=l/3*2+(l%3<1?0:1);i<s;b+=q[i++]);for(i=s;i<l;c+=q[i++]);return a==b&b==c;}

Toma a entrada como um int[] .

Explicação:

Experimente aqui.

q->{                 // Method with int-array parameter and boolean return-type
  int l=q.length,    //  Length of the input-array
      s=(l+1)/3,     //  (Length + 1) divided by 3
      a=0,b=0,c=0,   //  Three sums starting at 0
      i=0;           //  Index-integer
  for(;i<s;          //  Loop (1) from 0 to `s1` (exclusive)
    a+=q[i++]        //   And increase `a` with the next digit
  );                 //  End of loop (1)
  for(i=s,s=l/3*2+(l%3<1?0:1);i<s;
                     //  Loop (2) from `s1` to `s2` (exclusive)
    b+=q[i++]        //   And increase `b` with the next digit
  );                 //  End of loop (2)
  for(i=s;i<l;       //  Loop (3) from `s2` to `l` (exclusive)
    c+=q[i++]        //   And increase `c` with the next digit
  );                 //  End of loop (3)
  return a==b&b==c;  //  Return if `a`, `b` and `c` are equal
}                    // End of method

Aqui está uma visão geral das partes indexadas 0 (exclusivas) para cada comprimento:

Length:  Parts:    0-indexed (exclusive) parts:

 3       1,1,1     0,1 & 1,2 & 2,3
 4       1,2,1     0,1 & 1,3 & 3,4
 5       2,1,2     0,2 & 2,3 & 3,5
 6       2,2,2     0,2 & 2,4 & 4,6
 7       2,3,2     0,2 & 2,5 & 5,7
 8       3,2,3     0,3 & 3,5 & 5,8
 9       3,3,3     0,3 & 3,6 & 6,9
10       3,4,3     0,3 & 3,7 & 7,10
...
  • Para anós loop do 0que(length + 1) / 3) (esse valor agora está armazenado em s);
  • Pois bfazemos um loop de spara length / 3 * 2 +( 0se o comprimento modulo-3 for 0;1 se o comprimento módulo 3 for 1 ou 2) (esse valor agora é armazenado em s);
  • Pois cpassamos de spara length.

(todos os três loops são exclusivos indexados a 0)

Kevin Cruijssen
fonte
0

Röda , 82 bytes

f s{n=((#s+1)//3)[s[:n],s[n:#s-n],s[#s-n:]]|[chars(_)|[ord(_)-48]|sum]|[_=_,_=_1]}

Experimente online!

Explicação:

f s{ /* function declaration */
    n=((#s+1)//3)
    [s[:n],s[n:#s-n],s[#s-n:]]| /* split the string */
    [ /* for each of the three strings: */
        chars(_)|    /* push characters to the stream */
        [ord(_)-48]| /* convert characters to integers */
        sum          /* sum the integers, push the result to the stream */
    ]|
    [_=_,_=_1] /* take three values from the stream and compare equality */
}
fergusq
fonte
0

JavaScript, 129 , 104 bytes

([...n],l=n.length/3+.5|0,r=(b,e=b*-4,z=0)=>n.slice(b,e).map(x=>z-=x)&&z)=>r(0,l)==r(-l)&&r(l,-l)==r(-l)

A função r corta a string com base nos parâmetros be, e depois soma os dígitos e retorna o valor.

Para cortar nos tamanhos corretos, dividimos o comprimento por 3 e arredondamos o resultado. Chamar fatia (0, resultado) nos dá o primeiro bloco, fatia (resultado, resultado) nos dá o segundo e fatia (resultado) nos dá o último. Devido à maneira como estou chamando fatia, usei fatia (resultado, resultado de 4 *) em vez da última, mas fornece o mesmo resultado.

Finalmente, comparo os resultados, mostrando que os valores são iguais.

Edit: mesmo princípio, melhor golfe

Grax32
fonte
É possível mudar &&para &JavaScript? As duas verificações em segunda mão ( &&ze &&y[1]==y[2]) não parecem modificar valores; portanto, se for possível, não deve afetar o resultado do que posso ver.
Kevin Cruijssen
Eu vou dar uma olhada. & é uma operação de bits vs && sendo lógica, portanto alterará a saída para 1 ou 0 em vez de verdadeira ou falsa, mas que funciona muito bem nesse caso.
Grax32