Потрійні трикутники


22

Ідея цього в основному з BIO 2017 q1 . У мене виникла ідея опублікувати цей виклик із мого виклику Бінарні послідовності , оскільки багатьом людям здавалося, що це подобається.

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

Правила

Візьміть послідовність цифр у потрійному (основа 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+/\-)~<:@#

Завдяки @miles

Старе рішення:

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+/\-)~<:@#
миль

@miles, ha, я ось-ось збирався опублікувати це на 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.