Üçlü Üçgenler


22

Bunun ana fikri BIO 2017 1. Çeyrek'tir . Bu meydan okumayı Binary Sequences meydan okumamdan yayınlama fikrini aldım , çünkü birçok insan hoşuna gitti.

Ayrıca, bu, sanal alana göndermeden gönderdiğim ilk zorluktur. Kimse beğenmezse onu sileceğim.

kurallar

Üçlü (hane 3) bir rakam dizisi alın; bu bir dize, bir dizi veya önceki sıfırların sayısı ile birlikte sayısal bir değer olabilir.

Üçgendeki her satır için, son satırda yalnızca bir rakam olana kadar aşağıdaki satır oluşturulur. Diğer iki basamağın altında bir rakam bulmak için, yukarıdaki iki basamağın aynı olması durumunda rakam, üstündeki iki rakam ile aynı olacaktır. Aksi takdirde, her ikisine de eşit olmayan rakam olacaktır. İşte bir örnek:

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

Sadece son satırı geri getirmeniz bekleniyor.

Kodunu kısalt.

Test Kılıfları

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

Yanıtlar:


9

Kabuğu , 9 bayt

%3←ΩεẊo_+

Çevrimiçi deneyin!

açıklama

Ana fikir, iki basamağın eşlenmesini f (a, b) = (-ab)% 3 olarak hesaplamaktır . Golf oynamak için moduloyu sonuna kadar geciktirebiliriz.

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

Prensip olarak, her bir elemanı karşılık gelen binom katsayısı ile çarparak ve toplamı eşit uzunluktaki listeler için toplamı -1 ile çarparak doğrudan hesaplamak da mümkündür , ancak bunu daha az baytta yapmanın bir yolunu bilmiyorum.


6

MATL , 10 bayt

td"HYCEsI\

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

Her bir basamak çifti için, kod toplam modulo 3'ün iki katı hesaplar. İşlem, eksi 1 girişinin uzunluğu kadar tekrarlanır.

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 bayt

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

Çevrimiçi deneyin!

Sırasıyla ilk ve son elemanları silen alt listelerdeki özetler.

Gerçekten açılsaydı, Python 3'te bu daha temiz olurdu f=lambda a,*b,c:....


3

Emojicode , 242 bayt

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

C cevabımla aynı algoritmayı kullanır . Çevrimiçi deneyin!



2

Haskell , 36 bayt

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

Çevrimiçi deneyin!

Daha simetrik olana 1 bayt kazandırır:

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

Çevrimiçi deneyin!

Fikir basit: sırasıyla ilk ve son elemanı silen alt listelerdeki işlevi tekrar tekrar hesaplayın ve bunları birleştirin \a b -> mod(-a-b)3. Bu zipWithfuction yapmaktan daha kısa görünüyor .

Haskell , 44 bayt

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

Çevrimiçi deneyin!


2

C (gcc) , 91 88 84 bayt

@ Mr.Xcoder sayesinde -1 bayt!

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;}

Diziyi ve uzunluğu alır. Çevrimiçi deneyin!


2

J, 23 15 bayt

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

@Miles sayesinde

Eski Çözüm:

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

Martin Ender'in çözümünden ilham alan:

açıklama

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 bayt ile3&(|2+/\-)~<:@#
mil

@miles, ha, bunu neredeyse 19 byte göndermek üzereydim 3|((2<.#)-@+/\])^:_- seninki gerçekten güzel.
Jonah

0

Toplu iş, 122 bayt

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

Binom genişlemesini kullanır. @MartinEnder'in işaret ettiği gibi, eğer (ilk döngüde sayılan) değerlerin sayısı eşitse, toplam nya 1da 2buna göre ya da buna göre ayarlanmışsa , toplamın ihmal edilmesi gerekir (modulo 3) . İkinci döngü daha sonra toplamı binom katsayıları üzerinden hesaplar.


0

APL (Dyalog) , 17 bayt

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

Çevrimiçi deneyin!

Nasıl?

2+/⍵ - her iki bitişik öğeyi toplamı

3- - üçten vectorized çıkarma

3| - üçlü vectorized modülo

- e kadar tekrar edin...

1=≢⍺ - sadece bir ürün kaldı


0

APL + WIN, 30 28 bayt

2 bayt Uriel'in izniyle kaydedildi.

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

Açıklama:

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.

Bu, APL’de döngü kodunu tek bir satıra yazmanın bir yoludur.


En sağa ihtiyacın yok3|
Uriel

@Uriel. Teşekkürler.
Graham

0

Javascript (ES6), 58 bayt

f=s=>s[1]?f(s.replace(/.(?=(.?))/g,(a,b)=>b&&(6-a-b)%3)):s
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.