Trójkąty Trójskładnikowe

22

Pomysł ten pochodzi głównie z BIO 2017 q1 . Pomysł na opublikowanie tego wyzwania powstał z mojego wyzwania Sekwencje binarne , ponieważ wielu osobom podobało się.

Jest to także pierwsze wyzwanie, które opublikowałem bez publikowania w piaskownicy. Usunę go, jeśli nikomu się nie spodoba.

Zasady

Weź sekwencję cyfr w trójce (podstawa 3); może to być ciąg, tablica lub wartość liczbowa wraz z liczbą poprzedzających zer.

Dla każdego wiersza w trójkącie generowany jest wiersz poniżej, aż w ostatnim rzędzie będzie tylko jedna cyfra. Aby znaleźć cyfrę poniżej dwóch innych cyfr, cyfra będzie taka sama jak dwie nad nią, jeśli te dwie pozostałe cyfry powyżej są równe. W przeciwnym razie będzie to cyfra, która nie będzie równa żadnej z nich. Oto przykład:

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

Oczekuje się, że zwrócisz tylko ostatni wiersz.

Skróć swój kod.

Przypadki testowe

0 -> 0
11 -> 1
10 -> 2
000 -> 0
012 -> 1
21102 -> 2
201021 -> 1
111111 -> 1
1020202020 -> 2
0212121210 -> 0
0WJYxW9FMN
źródło

Odpowiedzi:

9

Łuska , 9 bajtów

%3←ΩεẊo_+

Wypróbuj online!

Wyjaśnienie

Główną ideą jest obliczenie odwzorowania dwóch cyfr na jedną jako f (a, b) = (-ab)% 3 . Do celów golfowych możemy opóźnić modulo do samego końca.

   Ωε       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.

Zasadniczo możliwe jest również obliczenie wyniku bezpośrednio przez pomnożenie każdego elementu przez odpowiedni współczynnik dwumianowy i pomnożenie sumy przez -1 dla list o parzystej długości, ale nie znam sposobu na zrobienie tego w mniejszej liczbie bajtów.

Martin Ender
źródło
6

MATL , 10 bajtów

td"HYCEsI\

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Dla każdej pary cyfr kod oblicza dwukrotność sumy modulo 3. Proces powtarza się tyle razy, ile wynosi długość wejścia minus 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
Luis Mendo
źródło
3

Python 2 , 48 bajtów

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

Wypróbuj online!

Powtarza się na podlistach, usuwając odpowiednio pierwszy i ostatni element.

Byłoby to czystsze w Pythonie 3, gdyby faktycznie mogło się rozpakować f=lambda a,*b,c:....

xnor
źródło
3

Emojicode , 242 bajty

🐋🍨🍇🐖🔢➡️🚂🍇🔂i⏩➖🐔🐕1 0🍇🔂j⏩0i🍇🍊❎😛🍺🔲🐽🐕j🚂🍺🔲🐽🐕➕1j🚂🍇🐷🐕j➖➖3🍺🔲🐽🐕j🚂🍺🔲🐽🐕➕1j🚂🍉🍉🍉🍎🍺🔲🐽🐕0🚂🍉🍉

Używa tego samego algorytmu co moja odpowiedź C. Wypróbuj online!

betseg
źródło
2

Haskell , 36 bajtów

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

Wypróbuj online!

Oszczędza 1 bajt na bardziej symetrycznym:

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

Wypróbuj online!

Pomysł jest prosty: rekurencyjnie oblicz funkcję na podlistach, usuwając odpowiednio pierwszy i ostatni element, i połącz je z nimi \a b -> mod(-a-b)3. Wydaje się to krótsze niż zipWithtworzenie tej funkcji.

Haskell , 44 bajty

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

Wypróbuj online!

xnor
źródło
2

C (gcc) , 91 88 84 bajtów

-1 bajt dzięki @ Mr.Xcoder!

j;f(a,l)int*a;{for(;l-->1;)for(j=0;j<l;)a[j++]=a[j]^a[j+1]?3-a[j]-a[j+1]:a[j];a=*a;}

Pobiera tablicę i długość. Wypróbuj online!

betseg
źródło
2

J, 23 15 bajtów

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

Dzięki @miles

Stare rozwiązanie:

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

Zainspirowany rozwiązaniem Martina Endera:

Wyjaśnienie

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
Bolce Bussiere
źródło
2
15 bajtów z3&(|2+/\-)~<:@#
mil
@miles, ha, właśnie miałem to opublikować za 19 bajtów 3|((2<.#)-@+/\])^:_- twój jest naprawdę fajny.
Jonasz
0

Partia, 122 bajty

@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%

Wykorzystuje ekspansję dwumianową. Jak wskazuje @MartinEnder, suma musi być zanegowana (moduł 3), jeśli liczba wartości (które są liczone w pierwszej pętli) jest parzysta, więc njest ustawiona na jedną 1lub 2odpowiednio. Druga pętla oblicza następnie sumę za pomocą współczynników dwumianowych.

Neil
źródło
0

APL (Dyalog) , 17 bajtów

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

Wypróbuj online!

W jaki sposób?

2+/⍵ - zsumuj każde dwa sąsiednie elementy

3- - wektoryzowane odejmij od trzech

3| - wektoryzowane modulo o trzy

- powtarzaj, aż...

1=≢⍺ - został tylko jeden przedmiot

Uriel
źródło
0

APL + WIN, 30 28 bajtów

2 bajty zapisane dzięki uprzejmości Uriela.

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

Wyjaśnienie:

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.

Jest to jeden ze sposobów pisania kodu pętli w APL w jednym wierszu.

Graham
źródło
Nie potrzebujesz skrajnego prawa3|
Uriel
@Uriel. Dzięki.
Graham
0

JavaScript (ES6), 58 bajtów

f=s=>s[1]?f(s.replace(/.(?=(.?))/g,(a,b)=>b&&(6-a-b)%3)):s
Herman L.
źródło