Zeckendorf Temsilciliği Kapsamındaki Özetleme


14

Zeckendorf teoremi , her pozitif tamsayının, bitişik olmayan Fibonacci sayılarının toplamı olarak benzersiz bir şekilde temsil edilebileceğini gösterir. Bu meydan okumada, Zeckendorf temsilindeki iki sayının toplamını hesaplamanız gerekir.


F n , n. Fibonacci sayısı olsun

F 1 = 1,
F 2 = 2 ve
herkes için k > 2, F k = F k - 1 + F k - 2 .

Zeckendorf temsil Z'nin ( N , negatif olmayan bir tam sayı) n gibi pozitif bir tamsayı dizi

n = Σ i ∈ Z ( n ) F i   ve
i ∈ Z ( n ) i + 1 ∉ Z ( n ).

(Prosa: a numarası Zeckendorf temsil n söz konusu göstergeler için Fibonacci sayıları için Özetle bu şekilde pozitif bir tamsayı dizi , n ve hiçbir iki komşu tamsayı olduğu grubun parçası olan)

Özellikle, Zeckendorf temsili benzersizdir. İşte Zeckendorf temsilleri için bazı örnekler:

Z (0) = ∅ (boş küme)
Z (1) = {1}
Z (2) = {2}
Z (3) = {3} ({1, 2} 3'ün Zeckendorf temsili değil)
Z (10) = {5, 2}
Z (100) = {3, 5, 10}

Bu zorlukta, Zeckendorf gösterimleri bit kümeleri olarak kodlanır, burada en az anlamlı bit 1kümenin bir parçasıysa temsil eder , vb. Hem giriş hem de çıkış Zeckendorf gösterimlerinin 31 bite sığdığını varsayabilirsiniz.

Göreviniz hesaplamak Z'nin (etmektir n + m ) Verilen Z ( n ) ve Z ( m ). Sekizli içinde en kısa uzunlukta çözelti kazanır.

Burada ANSI C ile yazılmış bir referans uygulaması bulabilirsiniz . Aynı zamanda Zeckendorf gösterimlerini oluşturmak veya Zeckendorf temsilinden bir sayı hesaplamak için de kullanılabilir.

İlk iki sütunun girdiyi ve üçüncü sütunun çıktıyı içerdiği bazı örnek girdi ve çıktı çiftleri şunlardır:

73865           9077257         9478805
139808          287648018       287965250
34              279004309       279004425
139940          68437025        69241105
272794768       1051152         273846948
16405           78284865        83888256
9576577         4718601         19013770
269128740       591914          270574722
8410276         2768969         11184785
16384           340             16724

4
Girdi / Çıktıyı detaylandırabilir misiniz?
flawr

@flawr Lütfen sağlanan başvuru uygulamasına bir göz atın. Kendi örnek girişinizi oluşturmak için kullanabilirsiniz.
FUZxxl

3
Burada tam olarak ne istediğinizi belgeleyebilir ve benim gibi bazı örnekler verebilirseniz mutlu olurum ve belki de diğerleri de C'de akıcı değildir
flawr

Teklik argümanı ile aynı fikirde değilim. Fibonacci dizisi 1, 1, 2 ile başladığından 3'ü F0 + F2 = 1 + 2 = 3'e açıkça ayrıştırabilirsiniz. F0 ve F2 bitişik değildir .
orlp

1
@orlp Burada tanımlanan Fibonacci dizisi F1 = 1 ve F2 = 2 ile başlar. Yani onu okuma şeklim, tanımınızdan F0 burada kullanılan dizinin bir parçası değil.
Reto Koradi

Yanıtlar:


5

K (ngn / k) , 45 43 42 41 bayt

{2/<':(+/F@&+/'|2\x){y!x}\|F:64(+':1,)/0}

Çevrimiçi deneyin!

@ Bubbler algoritması

{ } argüman ile işlev x

64( )/0 başlangıç ​​değeri olarak 0 kullanarak 64 kez yapın:

  • 1, başa 1

  • +': her birini ekleyin (ilk elemanı olduğu gibi bırakın)

F:F"fibonacci dizisi" için atamak

| tersine çevirmek

(.. ){y!x}\.. soldaki değerle başlayarak, sağdaki liste için kümülatif kalanları (soldan sağa) hesaplayın. soldaki değer, zeckendorf temsili olmayan girdilerin düz toplamıdır:

  • 2\xgirişleri ikili kodlar. bu 2 bitlik bir matris olacak

  • | tersine çevirmek

  • +/' her birini topla

  • &1'ler nerede? - endekslerin listesi. 2'ler varsa, ilgili dizin iki kez tekrarlanır.

  • F@ dizi dizine ekleme F

  • +/ toplam

<': her öncekinden daha az (sonucun ilki her zaman falsey olacaktır)

2/ ikili kod çözme


10

CJam, 76 74 70 63 59 bayt

2q~{32{2\#I&},}fI+32_,*{WUer$Kf-[UU]/[-2X]*2,/2a*Kf+}fKf#1b

CJam yorumlayıcısında çevrimiçi deneyin veya tüm test senaryolarını bir kerede doğrulayın .

Fikir

Sorudaki dizinin küçük bir varyasyonunu tanımlayarak başlıyoruz:

G -2 = 0
G -1 = 1
G, K = G , k-1 + G K-2 her k , negatif olmayan bir tamsayıdır

Bu şekilde, bit dizilerinin giriş veya çıkışının bit 0'ı (LSB), Fibonacci sayı G 0'a ve genel olarak k ila G k bitine karşılık gelir .

Şimdi, Z (n) ve Z (m) ' deki her set bitini kodladığı dizinle değiştiriyoruz.

Örneğin, giriş 532 10 = 1000010100 2 haline dönüştürülmüş olur [2 4, 9] .

Bu, tek bir tane oluşturmak için birleştirebileceğimiz iki tamsayı dizisi verir.

Örneğin, n = m = 100 ise, sonuç A: = [2 4 9 2 4 9] olur .

Her değiştirin k içinde A tarafından G k ve sonuçları arasında, biz elde n + m = 200 , yani A olan bir ayrıştırmak için bir yol 200 kesinlikle Zeckendorf teoremi değil bir Fibonacci sayıları içine ama.

Olduğunu hatırdan çıkarmadan G K + G , k + 1 = G k + 2 ve G k + G k = G k + G , k-1 + G K-2 = G k + 1 + G , k-2 , birbirini izleyen yerini alabilir ve (yani, diğerleri tarafından çoğaltılmış endeksler (k, k + 1) ile k + 2 ve (k, k) ile (k + 1, k - 2) ), bu ikameler tekrar tekrar tekrar Zeckendorf gösterimi ulaşılana kadar. 1

Ortaya çıkan negatif endeksler için özel durum dikkate alınmalıdır. Yana G -2 = 0 , dizin -2 sadece göz ardı edilebilir. Ayrıca, G -1 = 0 = G 0 , bu nedenle sonuçta ortaya çıkan -1 , 0 ile değiştirilmelidir .

A örneğimiz için, sonuncusu Zeckendorf temsilidir, aşağıdaki (sıralı) gösterimleri elde ederiz.

[2 2 4 4 9 9] → [0 3 4 4 9 9] → [0 5 4 9 9] → [0 6 9 9] → [0 6 7 10] → [0 8 10]

Son olarak, tamsayı dizisinden bit dizisine geri dönüş yapıyoruz.

kod

2             e# Push a 2 we'll need later.
q~            e# Read and evaluate the input.
{             e# For each integer I in the input:
  32{         e#   Filter [0 ... 31]; for each J:
    2\#       e#     Compute 2**J.
    I&        e#     Compute its logical AND with I.
  },          e#   Keep J if the result in truthy (non-zero).
}fI           e#
+             e# Concatenate the resulting arrays.
32_,*         e# Repeat [0 ... 31] 32 times.
{             e# For each K:
  WUer        e#   Replace -1's with 0's.
  $           e#   Sort.
  Kf-         e#   Subtract K from each element.
  [UU]/[-2X]* e#   Replace subarrays [0 0] with [-2 1].
  2,/2a*      e#   Replace subarrays [0 1] with [2].
  Kf+         e#   Add K to each element.
}fK           e#
f#            e# Replace each K with 2**K.
1b            e# Cast all to integer (discards 2**-2) and sum.

1 Uygulama 32 kez yer değiştirmeye çalışır ve Zeckendorf temsilinin gerçekten gerçekleştirilip gerçekleştirilmediğini kontrol etmez. Bunun yeterli olduğuna dair resmi bir kanıtım yok, ancak tüm olası 15-bit gösterim miktarlarını test ettim (toplamlarının gösterimleri 17 bite kadar gerektirir) ve 6 tekrar hepsi için yeterliydi. Her halükarda, tekrar sayısını 99'a çıkarmak bayt sayısını arttırmadan mümkündür, ancak performansı kırabilir.


10

APL (Genişletilmiş Dyalog) , 39 bayt

1↓⍧|/⌽(+/g[⍸⌽+/⊤⎕]),↑,\⌽g←(2+/,)⍣38⍨⍳2

Çevrimiçi deneyin!

2 uzunluğunda bir argüman alarak tam bir programa dönüştü ve aynı zamanda Fibonacci jeneratörünü de değiştirdi. @Ngn'e birçok fikir için teşekkürler.

Kullanır ⎕IO←0böylece ⍳2değerlendirir 0 1.

Fibonacci jeneratör (yeni)

Son iki sayının yanlış olduğunu, ancak programın çıktısını değiştirmediğini unutmayın.

(2+/,)⍣38⍨⍳2
 0 1 ((2+/,)⍣38) 0 1

Step 1
0 1 (2+/,) 0 1
 2+/ 0 1 0 1
 (0+1) (1+0) (0+1)  2+/ evaluates sums for moving window of length 2
 1 1 1

Step 2
0 1 (2+/,) 1 1 1
 2+/ 0 1 1 1 1
 1 2 2 2

Step 3
0 1 (2+/,) 1 2 2 2
 2+/ 0 1 1 2 2 2
 1 2 3 4 4

Zeckendorf - Ova (kısmi)

⍸⌽+/⊤⎕
        Take input from stdin, must be an array of 2 numbers
        Convert each number to base 2; each number is mapped to a column
  +/     Sum in row direction; add up the counts at each digit position
        Reverse
        Convert each number n at index i to n copies of i

APL (Genişletilmiş Dyalog) , 47 bayt

g1↓(1,+\⍤,)⍣201
{⊥1↓⍧|/⌽⍵,↑,\⌽g}+⍥{+/g[⍸⌽⊤⍵]}

Çevrimiçi deneyin!

Fibonacci sayılarını tekrar kullanmak için önceki cevabın 1. Bölümü değiştirildi. Ayrıca, başka yerlerde bazı bayt kaydetmek için yinelenen 1 bırakın.

Bölüm 1 (yeni)

{+/g[⍸⌽⊤⍵]}
       ⊤⍵     Argument to binary digits
     ⍸⌽       Reverse and convert to indices of ones
   g[    ]    Index into the Fibonacci array of 1,2,3,5,...
 +/           Sum

APL (Genişletilmiş Dyalog) , 52 bayt

{⊥1↓¯1↓⍧|/⌽⍵,↑,\⌽(1,+\⍤,)⍣201}+⍥({+∘÷⍣(⌽⍳≢⊤⍵)⍨1}⊥⊤)

Çevrimiçi deneyin!

Nasıl çalışır

APL'nin bir dizideki tek tek öğeler üzerinde çalışması için bilinmediği için Zeckendorf'a eklenecek süslü bir algoritma yoktur. Bunun yerine, iki girişi Zeckendorf'tan düz tamsayılara dönüştürmeye, eklemeye ve geri dönüştürmeye devam ettim.

Bölüm 1: Zeckendorf'tan düz tamsayıya

{+∘÷⍣(⌽⍳≢⊤⍵)⍨1}⊥⊤   Zeckendorf to plain integer
                   Convert the input to array of binary digits (X)
{    (  ≢⊤⍵)  }     Take the length L of the binary digits and
      ⌽⍳              generate 1,2..L backwards, so L..2,1
{+∘÷⍣(     )⍨1}     Apply "Inverse and add 1" L..2,1 times to 1
                    The result looks like ..8÷5 5÷3 3÷2 2 (Y)
                   Mixed base conversion of X into base Y

Base |             Digit value
-------------------------------
13÷8 | (8÷5)×(5÷3)×(3÷22 = 8
 8÷5 |       (5÷3)×(3÷22 = 5
 5÷3 |             (3÷22 = 3
 3÷2 |                   2 = 2
 2÷1 |                   1 = 1

Bölüm 2: İki düz tamsayı ekleyin

+⍥z2i   Given left and right arguments,
          apply z2i to each of them and add the two

Bölüm 3: Toplamı tekrar Zeckendorf'a dönüştürün

"Hem giriş hem de çıkışın Zeckendorf gösterimlerinin 31 bit'e sığdığını varsayabilirsiniz."

{⊥1↓¯1↓⍧|/⌽⍵,↑,\⌽(1,+\⍤,)⍣201}   Convert plain integer N to Zeckendorf
                 (1,+\⍤,)⍣201    First 41 Fibonacci numbers starting with two 1's
                ⌽                ⍝ Reverse
             ↑,\                 ⍝ Matrix of prefixes, filling empty spaces with 0's
          ⌽⍵,                     Prepend N to each row and reverse horizontally
        |/                        Reduce by | (residue) on each row (see below)
                                 Nub sieve; 1 at first appearance of each number, 0 otherwise
  1↓¯1                           Remove first and last item
                                 Convert from binary digits to integer

Fibonacci jeneratörü

(1,+\⍤,)⍣201
 1 ((1,+\⍤,)⍣20) 1   Expand 
 Apply 1 (1,+\⍤,) x 20 times to 1

First iteration
1(1,+\⍤,)1
 1,+\1,1   Expand the train
 1,1 2     +\ is cumulative sum
 1 1 2     First three Fibonacci numbers

Second iteration
1(1,+\⍤,)1 1 2
 1,+\1,1 1 2   Expand the train
 1 1 2 3 5     First five Fibonacci numbers

20   ... Repeat 20 times

Bu, Fibonacci sayılarının özelliğinden kaynaklanır: Fibonacci,

F0=F1=1;n0,Fn+2=Fn+1+Fn

sonra

n0,Σben=0nFben=Fn+2-1

Yani toplamı 1,F0,,Fn (1 ile başlayan Fibonacci dizisi) F1,,Fn+2. Sonra 0 diziniyle başlayan olağan Fibonacci dizisini elde etmek için 1'i tekrar başlatacağım.

Fibonacci - Zeckendorf basamakları

Input: 7, Fibonacci: 1 1 2 3 5 8 13

Matrix
0 0 0 0 0 0 13 7
0 0 0 0 0 8 13 7
0 0 0 0 5 8 13 7
0 0 0 3 5 8 13 7
0 0 2 3 5 8 13 7
0 1 2 3 5 8 13 7
1 1 2 3 5 8 13 7

Reduction by residue (|/)
- Right side always binds first.
- x|y is equivalent to y%x in other languages.
- 0|y is defined as y, so leading zeros are ignored.
- So we're effectively doing cumulative scan from the right.
0 0 0 0 0 0 13 7 → 13|7 = 7
0 0 0 0 0 8 13 7 →  8|7 = 7
0 0 0 0 5 8 13 7 →  5|7 = 2
0 0 0 3 5 8 13 7 →  3|2 = 2
0 0 2 3 5 8 13 7 →  2|2 = 0
0 1 2 3 5 8 13 7 →  1|0 = 0
1 1 2 3 5 8 13 7 →  1|0 = 0
Result: 7 7 2 2 0 0 0

Nub sieve (⍧): 1 0 1 0 1 0 0
1's in the middle are produced when divisor  dividend
(so it contributes to a Zeckendorf digit).
But the first 1 and last 0 are meaningless.

Drop first and last (1↓¯1↓): 0 1 0 1 0
Finally, we apply base 2 to integer (⊥) to match the output format.

6

Haskell, 325 396 bayt

EDIT: yeni sürüm:

s f[]=[]
s f l=f l
x((a:b):(c:d):(e:r))=x(b:d:(a:e):r)
x(a:b:((c:d:e):r))=x((c:a):b:e:((d:s head r):s tail r))
x[]=[]
x(a:r)=a:x r
w l|x l/=l=w.x$l|True=l
l=length
t n x=take n$repeat x
j 0=[]
j n=t(mod(n)2)1:j(div(n)2)
i n=[[],[]]++j n++t(32-(l$j n))[]
u[]=0
u(a:r)=2*u r+l a
o(_:a:r)=u r+l a
z a b=o$w$zipWith(++)(i a)(i b)

z işi yapar.


Bazı şeyler hemen kısaltılabilir - örneğin işlev en yüksek önceliğe sahiptir, bu nedenle ebeveynleri işlev uygulamaları etrafında kurtarabilirsiniz ve ayrıca korumalar ebeveynlere de ihtiyaç duymaz - muhafızlar nerede dururlar =, bu nedenle orada ebeveynlere ihtiyaç yoktur , ve benzerleri, vb. ve :sağa doğru ilişkilendirildiğini ve orada bazılarını kesebileceğinizi unutmayın . Ama neyse, tebrikler! Çok karmaşık görünüyor. Bunun nasıl çalıştığını anlamak için sabırsızlanıyorum!
gururlu haskeller

@proudhaskeller Yararsız bir şekilde karmaşık olsa da, düzenlememe bakın. Temel fikri açıklayayım mı? Başka bir yol daha iyi olabilir, ama başlangıçta mümkün olduğunca fazla desen eşleştirmesi yapmaya çalıştım. Ah, ebeveynler tarafından parantez demek istediniz:
Leif Willerts

chillax, ilk defa burada. Uzun süre kalırsan daha iyi büyüyeceksin. Haskell golf ipuçları sorusunu bazı bilgiler için kontrol ettiğinizden emin olun codegolf.stackexchange.com/questions/19255/…
gururlu haskeller

@proudhaskeller düzenlemek geldi ...
Leif Willerts

4

ES6, 130 bayt

(n,m)=>{for(a={},s=0,i=x=y=1;i<<1;i+=i,z=y,y=x,x+=z)s+=((n&i)+(m&i))/i*(a[i]=x);for(r=0;i;i>>>=1)s>=a[i]?(s-=a[i],r|=i):0;return r}

Başlangıçta yerinde (etkili bir şekilde CJam uygulama satırları boyunca) hesaplamak için çalıştı ama geçici tükenmeden devam etti, bu yüzden sadece sayıları ve gerçek tamsayı geri dönüştürdüm.

(Evet, muhtemelen eval kullanarak bir bayt kaydedebilirim.)


1

Yakut , 85 73 65 bayt

->*a{r=(0..2*a.sum).select{|r|r^r*2==r*3};r[a.sum{|w|r.index w}]}

Çevrimiçi deneyin!

Nasıl?

Önce kodlanmış toplam için bir üst sınır alın: (a + b) * 2 tamam.

Şimdi (0..limit) 'ten zeckendorf olmayan tüm sayıları filtreleyin.

Bir arama masamız var, buradan yokuş aşağı.


1

Python 3, 207 bayt

def s(n):
 p=1
 while n>=2*p:
  p*=2
 return n if n<=p else s(n+p//2)if n>=3*p/2 else s(m)if (m:=s(n-p)+p)!= n else n
a=lambda n,m:(b:=n&m)>-1 and s(a(a(a(s((n|m)-b%4),b//4*2),b//4),b%4*2+b%4//2))if m else n

Çevrimiçi deneyin! (Tüm test senaryolarını doğrulayın)

açıklama

Bu program, Zeckendorf gösterimlerinin ikili çevirilerini doğrudan manipüle eder. İşlev a(n,m), ana hesaplamaları gerçekleştirir s(n)ve Zeckendorf temsilindeki bitişik sayılardan kurtulan yardımcı bir işlevdir.

Fonksiyonla başlayalım s(n)(netlik için genişletildi):

def s(n): 
    p=1                  #This finds the highest digit of the binary form of n.
    while n>=2*p:
        p*=2
    if n<=p:             #If n is a power of two (i.e, our number is already a Fibonnaci number)...
        return n         #Then return it normally.  This also works for zero. (A)
    if n>=3*p/2:         #If n's first digit is followed by a 1 (i.e, it starts with 11X)
        return s(n+p//2) #Then replace that with 100X (B)
    m = s(n-p)+p         #Otherwise, apply s to the rest of the number (C)
    if m==n:             #If this is out final result, we're done! (D)
        return n
    return s(m)          #Otherwise, reapply it. (E)

Örneğin, 107 sayısı ( 1101011ikili olarak, 1 + 2 + 5 + 13 + 21 = 42'yi temsil eder), aşağıdaki işleme tabi tutulur:

1+2+5+13+21 [1101011] -> 1+2+5+34 [10001011] (B)
1+2+5+34 [10001011] (C)
 1+2+5 [1011] (C)
  1+2 [11] -> 3 [100] (B)
 ->3+5 [1100] (A/E)
 (E):  3+5 [1100] -> 8 [10000] (B)
->8+34 [10010000] (A/E)
(E): 8+34 [10010000] (C)
->8+34 [10010000] (A/E)

Çevrimiçi deneyin! (ayrıntılı çıktı ile)

İşte genişletilmiş bir sürümü a(n,m):

def a(n,m):
    if m==0:
        return n
    b=n&m
    t=s((n|m)-b%4)              #(A)
    t=a(t,b//4*2)               #(B)
    t=a(t,b//4)                 #(C)
    return s(a(t,b%4*2+b%4//2)) #(D)

Bu işlev, iki Zeckendorf gösterimini birleştirmesi daha kolay olan dört ikili sayıya dönüştürür. Çizgi (A), iki ikili Zeckendorf temsilinin bitsel OR'ıdır - bunlar her iki gruptaki her bir Fibonacci sayısının bir kopyasına karşılık gelir. (B) ve (C), sırasıyla 1 ve 2 kez sağa kaydırılan iki sayının bitsel AND'idir. (B) ve (C) için karşılık gelen Fibonacci sayıları birlikte eklendiğinde, bunların bitlerimizdeki AND'e eşdeğer olacağını nve mçünkü F (n) = F (n-1) + F (n-2) .

Örneğin, n = 101001 (1 + 5 + 13'e karşılık gelen) ve m = 110110 (2 + 3 + 8 + 13) ikili sayılarımız olduğunu varsayalım. Sonra (A) = 111111 (1 + 2 + 3 + 5 + 8 + 13), fonksiyonumuzla 1010100'e (3 + 8 + 21) dönüştürülür s, (B) = 10000 (8) ve ( C) = 1000 (5). (1 + 5 + 13) + (2 + 3 + 8 + 13) = (3 + 8 + 21) + (8) + (5) = 45 olup olmadığını kontrol edebiliriz. Bu işlem ((3 + 8 + 21) + (8)) + (5) = ((3 + 8 + 21) + (5) + (3)) + (5) vb.

Bu sistemle ilgili tek zorluk, mülke itaat etmedikleri için Fibonacci 1 ve 2 sayıları için işe yaramamasıdır F(n)=F(n-1)+F(n-2)(en düşük iki sayıdır)! Bu nedenle, her ikisinde de 1 veya 2 bulunduğunda nve mA, B ve C'den çıkarıldıklarında, toplamları 1 + 1 = 2 ve 2 + 2 = 1 + 3 özelliği altında D'ye yerleştirilir. Örneğin, 1 + 3 (101) + 1 + 3 + 5 (1101) eklersek, şunu elde ederiz:

(A): 3 + 5 (1100) = 8 (10000)

(B): 2 (10)

(C): 1 (1)

(D): 2 (10)

3 ve 5'in A içine yerleştirildiğine dikkat edin, kopya 3, B ve C'de 2 + 1'e bölündü ve yinelenen 1'ler, A, B ve C'den çıkarıldı, birlikte eklendi ve D'ye konuldu. Benzer şekilde, eğer 2 + 3 (110) + 2 + 3 + 5 (1110) ekleyin, elde ederiz:

(A): 3 + 5 (1100) = 8 (10000)

(B): 2 (10)

(C): 1 (1)

(D): 1 + 3 (101)

Çevrimiçi deneyin! (a ayrıntılı çıktı ile)


0

Wolfram Dili (Mathematica) , 218 bayt

Fold[#+##&,Total@PadLeft@IntegerDigits[#,2]//.{{p=n_/;n>1,r=y___}:>{0,n,y},{q=x___,i_,p,j_,k_,r}:>{x,i+1,n-2,j,k+1,y},{q,i_,p,j_}:>{x,i+1,n-2,j+1},{q,i_,p}:>{x,i+1,n-2},{1,1,r}:>{1,0,0,y},{q,i_,1,1,r}:>{x,i+1,0,0,y}}]&

Çevrimiçi deneyin!

Basitçe desen eşleme.

Ungolfed:

FromDigits[Total@PadLeft@IntegerDigits[#, 2] //.
   {{n_ /; n > 1, y___} :> {0, n, y},
    {x___, i_, n_ /; n > 1, j_, k_, y___} :> {x, i + 1, n - 2, j, k + 1, y},
    {x___, i_, n_ /; n > 1, j_} :> {x, i + 1, n - 2, j + 1},
    {x___, i_, n_ /; n > 1} :> {x, i + 1, n - 2},
    {1, 1, y___} :> {1, 0, 0, y},
    {x___, i_, 1, 1, y___} :> {x, i + 1, 0, 0, y}}, 2] &
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.