Число трикутників


11

Кредит

Дякую письмовому питанню Ранда Аль'Тхора за натхнення для цього виклику коду-гольфу.

Фон

Природа цього виклику базується на алгоритмі, згаданому Рандом у його "Трикутнику, утвореному з трьох літер":

  • Почніть з послідовності з 10 літер, кожна з яких X, Y або Z.
  • Під кожним рядком побудуйте наступний ряд наступним чином. Якщо дві сусідні літери однакові, під ними напишіть ту саму букву; якщо вони різні, напишіть під ними третій лист.

Потім ви повторите попередній крок, поки у вас в десятому ряду не буде однієї літери.

Виклик

Ми збираємося поставити математичний спин на вищевказаний алгоритм:

  • Почнемо з послідовностей з 10 цифр, кожна розділена пробілом, і кожна з яких або 1, 2 або 3.
  • Під кожним рядком побудуйте наступний ряд наступним чином. Якщо дві сусідні цифри однакові, під ними напишіть однакову цифру; якщо вони різні, напишіть під ними третю цифру.
  • Повторіть попередній крок, поки не будете мати остаточне число.

Отже, дотримуючись цього алгоритму, якщо, наприклад, починаючи з рядка 1 2 3 3 1 3 1 3 1 2, формується такий трикутник:

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1 2 3 3 1 3 1 3 1 2
 3 1 3 2 2 2 2 2 3 
  2 2 1 2 2 2 2 1  
   2 3 3 2 2 2 3   
    1 3 1 2 2 1    
     2 2 3 2 3     
      2 1 1 1      
       3 1 1       
        2 1        
         3         

Мені також цікаво знати суму всіх цифр у трикутнику числа, тому додайте всі ці цифри і поставте цю загальну суму в одинадцятий ряд, правильно обґрунтований останньою цифрою у першому рядку. Отже, наш трикутник чисел буде виглядати приблизно так (пробіли в моєму прикладі представлені нижче .символом для показу форматування.)

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109

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

Тестування

Тестування цього рядка можна проводити за допомогою випадково згенерованого рядка з десяти цифр за вашим вибором або з генерованого з фрагмента нижче ...

c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");

$("#btn").click(function(){
  $("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.

Правила

  1. Діють правила кодового гольфу, тому найменша кількість байтів виграє виклик. У випадку, якщо є два записи з однаковим низьким балом, переможець буде присуджений виходячи з кількості голосів, що піднялися.
  2. Що ми в основному після - це 11 рядків, 19 символів завдовжки ... Як ви будете відображати свій остаточний висновок, повністю залежить від вас: масив, консоль, вихід файлів, STDOUT тощо, тому будь ласка, використовуйте будь-який метод виводу, який вам сподобається. працювати на вашу користь. Єдине правило на виході - це те, що у нас є 11 рядків з 19 символами в кожному рядку в аналогічному для вище формату форматі ...
  3. Якщо це допомагає вашому коду, використовуйте будь-який роздільник для цифр ... Просто пам’ятайте, що розбірливість може бути фактором, що сприяє.
  4. Ніяких дурних бійниць .
  5. Жорстке кодування вводу не дозволено. Цілі цього коду такі, що його можна використовувати для отримання різних результатів кожного разу з різним введенням. 1 1 1 1 1 1 1 1 1 1Наприклад, жорстке кодування , повністю, заперечує всю точку алгоритму.

З нетерпінням чекаємо, що ви все можете придумати!



1
Чи потрібен мені роздільник, якщо мій трикутник розташований у центрі (що, таким чином, є розбірливим)?
JungHwan Min

1
Схоже , що це не місце (моя відповідь має місце, яке займає 10 байт).
JungHwan Min

2
Дозвіл надано
WallyWest

1
Зауважте, що для рядка з 10 (або будь-якого числа 1 більше, ніж потужність у 3) цифр, підсумкова цифра тривіально обчислюється від першої та останньої цифри рядка; інші цифри не мають значення.
Ніл

Відповіді:


1

05AB1E , 32 26 байт

DvÐOˆðýðN×.ø,ü+3%3^}\¯O19j

Пояснення

D                 # duplicate input
v                 # for y,N in input,len(input): (10 times do)
 Ð                # triplicate current list
 Oˆ               # sum one copy and add it to global array
 ðý               # merge one copy on spaces
   ðN×.ø          # surround it with N spaces
        ,         # and print it
 ü+               # reduce one copy by addition
   3%             # modulus 3
     3^           # XOR 3
                  # this is the list sent to the next iteration
}                 # end loop
\                 # drop empty list left over from last iteration of loop
 ¯O               # sum the global array giving the triangles total sum
   19j            # join with spaces up to 19 chars

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


7

Математика, 104 97 90 94 байт

{Grid[List@*Row/@#],#~Total~2}~Column~Right&[NestList[3-Mod[+##,3]&@@@Partition[#,2,1]&,#,9]]&

Пояснення

Partition[#,2,1]

Перегородки вхід на довжину 2, зміщення 1 розділів.

3-Mod[+##,3]&@@@

Бере кожен розділ і обчислює відповідний вихід.

Тут причетний фокус. Я склав два числа, взяв мод 3 і відніс цей результат від 3. Це дає потрібне число. (наприклад, 3 - ((2 + 1) mod 3) = 3)

NestList[ ... ,9]

Повторюємо вищезазначений процес дев'ять разів, даючи всі ітерації як вихід.

Grid[List@*Row/@#]

Відформатуйте кожну ітерацію в рядки і введіть всю річ в один стовпчик (вирівняний по центру), створивши трикутник.

#~Total~2

Візьміть загальну кількість всіх чисел.

{...}~Column~Right

Поєднайте трикутник і загальне, а праворуч вирівняйте всю річ (трикутник вже вирівняний, тому його вирівнювання не вплине).


1
Натхненний підхід з єдиною функцією, яка піклується про однакові та різні типи батьків ... Мені це подобається!
WallyWest

3

JavaScript (ES6), 143 142 байти

Збережено 1 байт завдяки @Neil

a=>a.map((_,i)=>(q=" ".repeat(i))+(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+q,x=0).join`
`+`
`+(" ".repeat(18)+x).slice(-19)

Я спробував поєднувати різні частини, але в кінцевому підсумку це було на 5 байт:

a=>[...a.map((_,i)=>(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+" ".repeat(i),x=0),x].map(q=>(" ".repeat(18)+q).slice(-19)).join`
`

Чудова робота! Чи може хитрість JHM 3-((x+y)%3)допомогти зменшити цей код?
WallyWest

2
Ні. p^c||pвже зовсім трохи коротше :-)
ETHproductions

Тепер, як, чорт, я це пропустив? Звичайно! Тут добре працюють функції XOR!
WallyWest

1
XOR ?! Я не міг про це подумати. Але, на жаль, використання XOR
збільшує

Бо i?p^(p=c)||p:cви можете використовувати i&&p^(p=c)||c?
Ніл

2

Рубі, 134 101 байт

Використання модульного трюку JHM.

->a{b=*a
(0..8).map{|i|[" "*i,a=a.each_cons(2).map{|x,y|b<<n=3-(x+y)%3
n}]*" "}<<"%19d"%b.reduce(:+)}

Дивіться це на eval.in: https://eval.in/649993


2

CJam ,  44  40 байт

l~{S*\_S*\2ew{:+3%3^}%2$N@}A%_s:~:+sJSe[

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

Пояснення

l~       e# Read and evaluate input.
{        e# Map this block over i in the range [0 1 ... 9].
  S*     e#   Get a string of i spaces (the indentation).
  \_     e#   Swap with the current line of trits and duplicate it.
  S*     e#   Join the trits with spaces.
  \2ew   e#   Swap with the other copy of the trits and get all consecutive pairs.
  {      e#   Map this block over the pairs...
    :+   e#     Sum the pair.
    3%   e#     Modulo 3.
    3^   e#     XOR 3.
         e#     This expression (x+y)%3 ^ 3 computes the required mapping.
  }%     e#   Now this is the next line.
  2$     e#   Copy the indentation (to pad the lines to equal length).
  N      e#   Push a linefeed.
  @      e#   Pull up the next line.
}A%      e# The result of this is a nested array whose string representation is
         e# the required triangle.
_s       e# Duplicate and flatten into a string.
:~       e# Eval each character which gives a list of all the trits.
:+       e# Sum that.
s        e# Turn the sum into a string.
JSe[     e# Left-pad it with spaces to width 19.

Як завжди, дуже вражаюче! Ти поки що в лідері!
WallyWest

1
@WallyWest Дякую :) Тільки зачекайте Pyth, Jelly та MATL. ;)
Мартін Ендер

Насправді мені цікаво дізнатися, як буде виглядати рішення GolfScript ...;)
WallyWest,

О, хто-небудь до публікації рішення SQL? ;)
WallyWest

1

Пітон 2, 164 байти

Порівняно просте ітеративне рішення.

L=input()
s=0
for i in range(len(L)):
    print" "*-~i+" ".join(`L`[1::3]);s+=sum(L);N=L;L=[]
    for a,b in zip(N,N[1:]):L+=[list({1,2,3}-{a,b}),[a]][a==b]
print"%19s"%s

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



0

JavaScript (ES6), 112 100 96 байт

Приймає масив як вхідний і рекурсивно будує трикутник, розділений комами.

f=(s,p=`
`,S=0)=>p+(s[0]?s+f(s.map((v,i)=>(S+=v,v^s[i-1]||v)).slice(1),p+' ',S):(p+S).slice(-9))

console.log(f([1,2,3,3,1,3,1,3,1,2])); // reference example
console.log(f([3,3,2,1,3,1,2,1,2,1])); // random example
console.log(f([1,1,1,1,1,1,1,1,1,1])); // all ones (test case for sum < 100)

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