Числовые треугольники

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. Применяются правила Code-Golf, поэтому наименьшее количество байтов выигрывает. В случае, если есть две записи с одинаковым низким баллом, победитель будет награжден в зависимости от количества голосов "за".
  2. То, что мы в основном получаем, это 11 строк по 19 символов в длину ... То, как вы будете выводить окончательный результат, полностью зависит от вас: массив, консоль, вывод файла, STDOUT и т. Д., Поэтому, пожалуйста, используйте любой метод вывода, который вам нравится. работать в ваших интересах. Единственное правило в выводе - у нас 11 строк по 19 символов в каждой строке в формате, аналогичном приведенному выше ...
  3. Если это помогает вашему коду, используйте любой разделитель для цифр ... Просто помните, что удобочитаемость может быть фактором.
  4. Никаких глупых лазеек .
  5. Жесткое кодирование ввода не допускается. Цели этого кода таковы, что его можно использовать для получения разных результатов каждый раз с различными данными. Жесткое кодирование, 1 1 1 1 1 1 1 1 1 1например, полностью сводит на нет весь смысл алгоритма.

С нетерпением ждем, что вы все можете придумать!

Уолли Уэст
источник
1
Нужен ли мне разделитель, если мой треугольник выровнен по центру (который, таким образом, читается)?
JungHwan Мин.
1
Похоже, это без пробела (мой ответ имеет пробел, который занимает 10 байтов).
Юнг Хван Мин
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

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

Emigna
источник
7

Mathematica, 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) мод 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`
`
ETHproductions
источник
Отличная работа! Может ли уловка JHM 3-((x+y)%3)помочь уменьшить этот код?
WallyWest
2
Нет. p^c||pуже немного короче :-)
ETHproductions
Теперь, как, черт возьми, я это пропустил? Конечно! Здесь хорошо работают функции XOR!
WallyWest
1
XOR ?! Я не мог думать об этом. К сожалению, использование XOR делает мой код длиннее: P
JungHwan Мин.
Для 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
@WallWest Спасибо. :) Просто подожди Пиф, Желе и Мэтл. ;)
Мартин Эндер
На самом деле, мне любопытно узнать, как будет выглядеть решение GolfScript ...;)
WallyWest
О, кто-нибудь до публикации решения SQL? ;)
WallyWest
1

Python 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

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

mbomb007
источник
1

PHP, 143 байта

<?for($t=$_GET[t];$i<181;$s+=$v,$i+=2)$t[$i+20]=($v=$t[$i])*($z=$t[$i+2])>0&$i!=18?($v+$z)%3^3:" ";echo chunk_split($t.str_pad($s,8," ",0),19);
Йорг Хюльсерманн
источник
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)

Arnauld
источник