Тройно-сбалансированные числа


13

Описание

Мы рассматриваем целое число с не менее чем 3 цифрами с тройным балансом, если при разбиении на три части цифры в каждой части суммируются до одного и того же числа. Разобьем числа следующим образом:

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)

Вызов

Ваша задача - написать программу, которая, учитывая целое число, состоящее не менее чем из 3 цифр, определяет, является ли данное число тройным балансом, и выводит истинное или ложное значение на основе его результата.

Контрольные примеры

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

Это , поэтому применяются стандартные лазейки, и победит кратчайший ответ в байтах!


1
Насколько я понимаю, если вы можете разделить это равномерно, вы должны.
полностью человек

@ Mr.Xcoder, вы разделили его на три части (они все еще не работают согласно комментарию @ MagicOctopusUnr:when split in three parts,
Стивен

4
Подумайте об использовании Песочницы , чтобы избежать такой ситуации в будущем.
Мистер Кскодер

2
Упс! Прошу прощения за путаницу в тестовых случаях, видимо, у меня был какой-то поворот в голове. Теперь, когда они исправлены, я надеюсь, что вы проголосуете, чтобы снова открыть мой вызов.
racer290

5
По умолчанию ввод разрешается принимать как строку. Можно ли считать его массивом цифр?
Луис Мендо

Ответы:



3

Желе , 23 байта

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

Попробуйте онлайн!

Должен быть более короткий путь, который каким-то образом пролетел над моей головой ...


Это кажется простым, но на самом деле это не так ... Даже сложно в 05AB1E из-за нестандартного разделения.
Волшебная Осьминог Урна

3

Сетчатка , 89 байт

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

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение: На первом этапе добавляются новые строки в начале и конце ввода. Затем второй этап пытается перемещать цифры по новым строкам в парах, однако, если в середине недостаточно цифр, то третий этап может переместить их назад, вызывая остановку цикла. Четвертый этап затем преобразует каждую цифру отдельно в одинарное, суммируя их, в то время как последний этап просто проверяет, что суммы равны.


2

Mathematica, 142 байта

(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)&

2

Желе , 20 байт

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

Попробуйте онлайн!

Как это устроено

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.

1
Я хотел бы прочитать объяснение
Феликс Домбек

@FelixDombek Я добавил объяснение.
Деннис


0

Javascript, 178 байт

(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)}

Добро пожаловать в PPCG! Вы читали страницы с советами ? Там есть много возможностей для игры в гольф ваш ответ вниз.
Нил

Если вам все еще интересно, я смог урезать ваш ответ до 106 байт: ([...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)(будьте осторожны при копировании из комментариев, так как Stack Exchange вставляет невидимые символы).
Нил

Beautyful! У меня есть чему поучиться.
CDM

0

Java 8, 149 байт

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;}

Принимает вход как int[].

Объяснение:

Попробуй это здесь.

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

Вот обзор 0-индексированных (эксклюзивных) частей для каждой длины:

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
...
  • Поскольку aмы выполняем цикл от 0до (length + 1) / 3)(это значение теперь сохраняется в s);
  • Поскольку bмы выполняем цикл с sпо length / 3 * 2 +( 0если длина по модулю-3 равна 0; 1если длина по модулю-3 равна 1 или 2) (это значение теперь сохраняется в s);
  • Ибо cмы из цикла sв length.

(все три цикла исключены с 0 индексами)


0

Рёда , 82 байта

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

Попробуйте онлайн!

Объяснение:

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 */
}

0

JavaScript, 129 , 104 байта

([...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)

Функция r разрезает строку на основе параметров b и e, а затем суммирует цифры и возвращает значение.

Чтобы нарезать правильные размеры, мы делим длину на 3 и округляем результат. Вызов slice (0, result) дает нам первый блок, slice (result, -result) дает нам второй, а slice (result) дает нам последний. Из-за способа, которым я вызываю слайс, я использовал слайс (результат, 4 * результат) вместо последнего, но он дает тот же результат.

Наконец, я сравниваю результаты, показываю, что значения равны.

Изменить: тот же принцип, лучше в гольф


Можно ли изменить , &&чтобы &в JavaScript? Кажется, что обе подержанные проверки ( &&zи &&y[1]==y[2]) не изменяют значения, поэтому, если это возможно, это не должно влиять на результат из того, что я вижу.
Кевин Круйссен,

Я посмотрю. & - это битовая операция, тогда как && является логической, поэтому она изменит выход на 1 или 0 вместо true или false, но в этом случае это прекрасно работает.
Grax32
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.