Tam giác tam giác


22

Ý tưởng của điều này chủ yếu là từ BIO 2017 q1 . Tôi có ý tưởng cho việc đăng thử thách này từ thử thách Binary Sequences của tôi , vì rất nhiều người có vẻ thích nó.

Ngoài ra, đây là thử thách đầu tiên tôi đã đăng mà không đăng trên hộp cát. Tôi sẽ xóa nó nếu không ai thích nó.

Quy tắc

Lấy một chuỗi các chữ số trong ternary (cơ sở 3); đây có thể là một chuỗi, một mảng hoặc giá trị số cùng với số lượng các số 0 trước đó.

Đối với mỗi hàng trong tam giác, một hàng bên dưới được tạo cho đến khi chỉ có một chữ số ở hàng cuối cùng. Để tìm một chữ số bên dưới hai chữ số khác, chữ số sẽ giống như hai chữ số ở trên nếu hai chữ số khác ở trên bằng nhau. Nếu không, nó sẽ là chữ số không bằng một trong hai. Đây là một ví dụ:

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

Bạn chỉ được mong đợi trả lại hàng cuối cùng.

Làm cho mã của bạn ngắn.

Các trường hợp thử nghiệm

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

Câu trả lời:


9

Husk , 9 byte

%3←ΩεẊo_+

Hãy thử trực tuyến!

Giải trình

Ý tưởng chính là tính toán ánh xạ của hai chữ số thành một là f (a, b) = (-ab)% 3 . Đối với mục đích chơi gôn, chúng ta có thể trì hoãn modulo cho đến khi kết thúc.

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

Về nguyên tắc, cũng có thể tính kết quả trực tiếp bằng cách nhân từng phần tử với hệ số nhị thức tương ứng và nhân tổng bằng -1 cho các danh sách có độ dài chẵn, nhưng tôi không biết cách nào để làm điều đó với ít byte hơn.


6

MATL , 10 byte

td"HYCEsI\

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Đối với mỗi cặp chữ số, mã sẽ tính hai lần tổng modulo 3. Quá trình được lặp lại nhiều lần bằng độ dài của đầu vào trừ đi 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 byte

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

Hãy thử trực tuyến!

Truy xuất trên danh sách con xóa các yếu tố đầu tiên và cuối cùng tương ứng.

Điều này sẽ sạch hơn trong Python 3 nếu nó thực sự có thể giải nén f=lambda a,*b,c:....




2

Haskell , 36 byte

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

Hãy thử trực tuyến!

Lưu 1 byte qua đối xứng hơn:

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

Hãy thử trực tuyến!

Ý tưởng rất đơn giản: tính toán đệ quy hàm trên danh sách con xóa phần tử đầu tiên và cuối cùng tương ứng, và kết hợp chúng với \a b -> mod(-a-b)3. Điều này có vẻ ngắn hơn so với zipWith'ftion này.

Haskell , 44 byte

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

Hãy thử trực tuyến!



2

J, 23 15 byte

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

Cảm ơn @miles

Giải pháp cũ:

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

Lấy cảm hứng từ giải pháp của Martin Ender:

Giải trình

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 byte với3&(|2+/\-)~<:@#
dặm

@miles, ha, tôi vừa mới đăng bài này với 19 byte 3|((2<.#)-@+/\])^:_- của bạn thật sự rất tuyệt.
Giô-na

0

Mẻ, 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%

Sử dụng mở rộng nhị thức. Như @MartinEnder chỉ ra, tổng phải được phủ định (modulo 3) nếu số lượng giá trị (được tính trong vòng lặp đầu tiên) là chẵn, do đó nđược đặt thành một 1hoặc 2theo đó. Vòng lặp thứ hai sau đó tính tổng thông qua các hệ số nhị thức.


0

APL (Dyalog) , 17 byte

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

Hãy thử trực tuyến!

Làm sao?

2+/⍵ - tổng hợp mỗi hai mục liền kề

3- - trừ vector hóa từ ba

3| - Modulo véc tơ bằng ba

- lặp lại cho đến khi ...

1=≢⍺ - chỉ còn một mục


0

APL + THẮNG, 30 28 byte

2 byte lưu lịch sự của Uriel.

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

Giải trình:

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.

Đây là một cách viết mã lặp trong APL trên một dòng.


Bạn không cần điều đúng nhất3|
Uriel

@Uriel. Cảm ơn.
Graham

0

Javascript (ES6), 58 byte

f=s=>s[1]?f(s.replace(/.(?=(.?))/g,(a,b)=>b&&(6-a-b)%3)):s
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.