Троичные треугольники


22

Идея этого в основном из BIO 2017 1 кв . У меня появилась идея опубликовать этот вызов из моего задания «Бинарные последовательности» , так как многим людям это понравилось.

Кроме того, это первый вызов, который я разместил без публикации в песочнице. Я удалю это, если никому это не нравится.

правила

Взять в последовательности цифр в тройной (база 3); это может быть строка, массив или числовое значение вместе с числом предшествующих нулей.

Для каждой строки в треугольнике генерируется строка ниже, пока в последней строке не останется только одна цифра. Чтобы найти цифру ниже двух других цифр, цифра будет такой же, как две над ней, если эти две другие цифры выше равны. В противном случае это будет цифра, которая не равна ни одной из них. Вот пример:

0 0 1 2 0 1 2 2
 0 2 0 1 2 0 2
  1 1 2 0 1 1
   1 0 1 2 1
    2 2 0 0
     2 1 0
      0 2
       1

От вас ожидается только возврат последней строки.

Сделайте ваш код коротким.

Тестовые случаи

0 -> 0
11 -> 1
10 -> 2
000 -> 0
012 -> 1
21102 -> 2
201021 -> 1
111111 -> 1
1020202020 -> 2
0212121210 -> 0

Ответы:


9

Шелуха , 9 байт

%3←ΩεẊo_+

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

объяснение

Основная идея состоит в том, чтобы вычислить отображение двух цифр в одну при f (a, b) = (-ab)% 3 . В целях игры в гольф мы можем отложить модуль до самого конца.

   Ωε       Apply the following function until the list is only one
            element in length.
     Ẋo       Apply the following function to pairs of adjacent values.
       _+       Add the two values and negate the result.
  ←         Take the first (and only) element of this list.
%3          Take it modulo 3.

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


6

MATL , 10 байт

td"HYCEsI\

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

Для каждой пары цифр код вычисляет вдвое больше суммы по модулю 3. Процесс повторяется столько раз, сколько длина ввода минус 1.

t        % Implicit input: array of length n. Duplicate
d        % Consecutive differences. Gives an array of length n-1
"        % For each (that is, do n-1 times)
  HYC    %   2-column matrix where each column is a sliding block of length 2
  E      %   Times 2, element-wise
  s      %   Sum of each column
  I\     %   Modulo 3
         % Implicit end. Implicit display

3

Python 2 , 48 байт

f=lambda a,*l:-(f(*l)+f(a,*l[:-1]))%3if l else a

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

Рекурсирует подсписки, удаляя первый и последний элементы соответственно.

Это было бы чище в Python 3, если бы он действительно мог распаковать f=lambda a,*b,c:....




2

Haskell , 36 байт

f[a]=a
f(h:t)=mod(-f t-f(h:init t))3

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

Сохраняет 1 байт над более симметричным:

f[a]=a
f l=mod(-f(tail l)-f(init l))3

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

Идея проста: рекурсивно вычислить функцию на подсписках, удаляя первый и последний элемент соответственно, и объединить их с \a b -> mod(-a-b)3. Это кажется короче, чем zipWithэта функция.

Haskell , 44 байта

f[a]=mod a 3
f l=f$zipWith((-).(0-))l$tail l

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



2

J, 23 15 байт

3&(|2+/\-)~<:@#

Благодаря @ миль

Старое решение:

3|2&(-@+/\)^:(#>1:)^:_]

Вдохновленный решением Мартина Эндера:

объяснение

3|2&(-@+/\)^:(#>1:)^:_]    | Whole program
                      ]    | Seperates the argument from the _ (infinity)
           ^:(#>1:)^:_     | Do while the length is greater than one
  2&(-@+/\)                | Inverse of the sum of adjacent elements
3|                         | Modulo 3

2
15 байт с3&(|2+/\-)~<:@#
миль

@ Майлз, ха, я как раз собирался опубликовать это для 19 байтов 3|((2<.#)-@+/\])^:_- твой действительно хорош.
Иона

0

Пакет, 122 байта

@set/an=2,s=i=l=0
@for %%e in (%*)do @set/al+=1,n^^=3
@for %%e in (%*)do @set/as+=%%e*n,s%%=3,n*=l-=1,n/=i+=1
@echo %s%

Использует биномиальное расширение. Как указывает @MartinEnder, сумма должна быть сведена на нет (по модулю 3), если число значений (которые подсчитываются в первом цикле) является четным, поэтому nустанавливается либо на одно, 1либо на 2соответствующее значение. Затем второй цикл вычисляет сумму с помощью биномиальных коэффициентов.


0

APL (Dyalog) , 17 байт

{3|3-2+/⍵}⍣{1=≢⍺}

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

Как?

2+/⍵ - суммируйте каждые два смежных элемента

3- - векторное вычитание из трех

3| - по вектору по модулю три

- повторять до ...

1=≢⍺ - остался только один предмет


0

APL + WIN, 30 28 байт

2 байта сохранены благодаря любезности Уриэля.

n←⎕⋄¯1↑∊⍎¨(⍴n)⍴⊂'n←3|3-2+/n'

Объяснение:

n←⎕ Prompt for screen input of the form: 0 0 1 2 0 1 2 2

'n←3|3-2+/n' Successive rows are 3 mod 3 minus successive digit pairs.

(⍴n)⍴⊂ Create a nested vector of the row code, one element per row. 

¯1↑∊⍎¨ Execute each element of row code, flatten result and take final value.

Это один из способов написания циклического кода в APL в одной строке.


Вам не нужно самое правое3|
Уриэль

@Uriel. Спасибо.
Грэм

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.