Segitiga Ternary

22

Ide ini terutama dari BIO 2017 q1 . Saya mendapat ide untuk memposting tantangan ini dari tantangan Binary Sequences saya , karena banyak orang sepertinya menyukainya.

Juga, ini adalah tantangan pertama yang saya posting tanpa memposting di sandbox. Saya akan menghapusnya jika tidak ada yang menyukainya.

Aturan

Ambil dalam urutan digit dalam ternary (basis 3); ini bisa berupa string, array atau nilai numerik bersama dengan jumlah nol sebelumnya.

Untuk setiap baris dalam segitiga, baris di bawah ini dihasilkan hingga hanya ada satu digit di baris terakhir. Untuk menemukan digit di bawah dua digit lainnya, digit tersebut akan sama dengan dua di atasnya jika dua digit lainnya di atas sama. Kalau tidak, itu akan menjadi digit yang tidak sama dengan salah satu dari mereka. Berikut ini sebuah contoh:

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

Anda hanya diharapkan untuk mengembalikan baris terakhir.

Buat kode Anda singkat.

Uji Kasus

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

Jawaban:

9

Sekam , 9 byte

%3←ΩεẊo_+

Cobalah online!

Penjelasan

Gagasan utamanya adalah menghitung pemetaan dua digit menjadi satu dengan f (a, b) = (-ab)% 3 . Untuk tujuan bermain golf, kita dapat menunda modulo hingga akhir.

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

Pada prinsipnya, itu juga mungkin untuk menghitung hasilnya secara langsung dengan mengalikan setiap elemen dengan koefisien binomial yang sesuai dan mengalikan jumlah dengan -1 untuk daftar panjang genap, tapi saya tidak tahu cara untuk melakukan itu dalam lebih sedikit byte.

Martin Ender
sumber
6

MATL , 10 byte

td"HYCEsI\

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Untuk setiap pasangan digit, kode menghitung dua kali jumlah modulo 3. Proses ini diulang sebanyak panjang input dikurangi 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
sumber
3

Python 2 , 48 byte

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

Cobalah online!

Perulangan pada sublists menghapus masing-masing elemen pertama dan terakhir.

Ini akan lebih bersih di Python 3 jika benar-benar bisa membongkar f=lambda a,*b,c:....

Tidak
sumber
3

Emojicode , 242 byte

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

Menggunakan algoritma yang sama dengan jawaban C saya. Cobalah online!

betseg
sumber
2

Haskell , 36 byte

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

Cobalah online!

Menghemat 1 byte lebih simetris:

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

Cobalah online!

Idenya sederhana: menghitung secara rekursif fungsi pada sublist menghapus masing-masing elemen pertama dan terakhir, dan menggabungkannya dengan \a b -> mod(-a-b)3. Ini sepertinya lebih pendek dari zipWithfungsinya.

Haskell , 44 byte

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

Cobalah online!

Tidak
sumber
2

C (gcc) , 91 88 84 byte

-1 byte terima kasih kepada @ 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;}

Mendapat array dan panjangnya. Cobalah online!

betseg
sumber
2

J, 23 15 Bytes

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

Terima kasih kepada @miles

Solusi lama:

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

Terinspirasi oleh solusi Martin Ender:

Penjelasan

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
sumber
2
15 byte dengan3&(|2+/\-)~<:@#
miles
@miles, ha, saya baru saja memposting ini untuk 19 byte 3|((2<.#)-@+/\])^:_- milik Anda sangat bagus.
Yunus
0

Batch, 122 byte

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

Menggunakan ekspansi binomial. Seperti yang ditunjukkan oleh @MartinEnder, jumlah harus dinegasikan (modulo 3) jika jumlah nilai (yang dihitung dalam loop pertama) genap, sehingga ndiatur ke salah satu 1atau 2sesuai. Loop kedua kemudian menghitung jumlah melalui koefisien binomial.

Neil
sumber
0

APL (Dyalog) , 17 byte

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

Cobalah online!

Bagaimana?

2+/⍵ - jumlah masing-masing dua item yang berdekatan

3- - kurangi vektor dari tiga

3| - modulo vektor oleh tiga

- ulangi sampai...

1=≢⍺ - hanya satu item yang tersisa

Uriel
sumber
0

APL + WIN, 30 28 byte

2 byte disimpan berkat Uriel.

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

Penjelasan:

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.

Ini adalah salah satu cara penulisan kode pengulangan dalam APL pada satu baris.

Graham
sumber
Anda tidak perlu yang paling kanan3|
Uriel
@Uriel. Terima kasih.
Graham
0

Javascript (ES6), 58 byte

f=s=>s[1]?f(s.replace(/.(?=(.?))/g,(a,b)=>b&&(6-a-b)%3)):s
Herman L.
sumber