Потрійні врівноважені числа


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)

Виклик

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

Тестові справи

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

Це , тому застосовуються стандартні лазівки, і, можливо, найкоротша відповідь у байтах виграє!


1
Як я розумію, якщо ви зможете розділити їх рівномірно, ви повинні.
повністюлюдський

@ Mr.Xcoder ви розділили його на три частини (він все ще не працює, як за коментарем @ MagicOctopusUnr:when split in three parts,
Stephen

4
Подумайте про використання пісочниці , щоб уникнути подібної ситуації в майбутньому.
Містер Xcoder

2
Ого! Вибачте за плутанину щодо тестових випадків, мабуть, у мене був якийсь поворот у голові. Тепер, коли вони виправлені, я сподіваюся, що ви проголосуєте за повторне відкриття мого виклику.
racer290

5
За замовчуванням введення дозволено приймати як рядок. Чи можна його сприймати як масив цифр?
Луїс Мендо

Відповіді:



3

Желе , 23 байти

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

Спробуйте в Інтернеті!

Повинен бути коротший шлях, який якимось чином пролетів над моєю головою ...


Це здається прямолінійним, але насправді це не tbh ... Навіть складно в 05AB1E через нерозділення за замовчуванням.
Magic Octopus Urn

3

Сітківка , 89 байт

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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення: Перший етап додає нові рядки на початку та в кінці введення. Потім другий етап намагається переміщати цифри через нові рядки парами, однак якщо в середині залишилося недостатньо цифр, тоді третій етап може перенести їх назад, внаслідок чого цикл зупиниться. Потім четвертий етап перетворює кожну цифру окремо в одинакову, таким чином підсумовуючи їх, тоді як на останньому етапі просто перевіряється, чи є рівні рівні.


2

Математика, 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 вставляє невидимі символи).
Ніл

Гарний! Мені багато чого навчитися там.
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;}

Приймає введення як an 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 і округлимо результат. Виклик фрагмента (0, результат) дає нам перший блок, фрагмент (результат, -результат) дає нам другий, а фрагмент (результат) дає нам останній. Завдяки тому, як я називаю фрагмент, я використав фрагмент (результат, результат 4 *) замість останнього, але він дає такий же результат.

Нарешті, я порівнюю результати, показую, що значення рівні.

Редагувати: той же принцип, краще гольф


Чи можна змінити &&на &JavaScript? Обидві перевірені ( &&zі &&y[1]==y[2]) б / в, схоже, не змінюють значення, тому, якщо це можливо, це не повинно впливати на результат із того, що я бачу.
Кевін Крейссен

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