Çalışma uzunluğu kodlamasında çevrimler


26

Örneğin , 1ve kullanarak bazı ikili dizileri göz önünde bulundurun 2:

1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1 ...

Şunun uzunluklarını yazalım:

1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1 ...
_  _  ____  ____  _  _  _  ____
1, 1, 2,    2,    1, 1, 1, 2,   ...

Bu durumda başka bir ikili sekans elde ettik. Tabii ki, bu garanti edilmez (örneğin, süreci tekrarlarsak, üçüncü adım olur 3), ama yapalım varsayalım.

Şimdi soru şu ki, bu tür çalışma uzunluğu kodlaması türünü birden çok kez uygulamak bize orijinal diziyi geri verecek şekilde bir dizi bulabilir miyiz? 1 döngü uzunluğu için (yani bu dönüşümün sabit bir noktası) Oldenburger-Kolakoski dizisini ( OEIS A0000002 girişi) buluyoruz :

1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, ...

(Aslında başka bir çözüm var: öncüyü de ihmal edebiliriz 1.)

Boy-2'lik bir döngü ne olacak? Bu da mümkün! Aşağıdaki iki dizi birbirlerinin çalışma uzunluklarının listesidir:

1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, ...
2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, ...

(Bunlar OEIS A025142 ve A025143 girişleridir . Tek çözüm budur.)

Uzunluk 3'ü bulabilir miyiz? Elbette, burada her sekans bir sonrakinin çalışma uzunluğu kodlamasıdır (üçüncüsü, ilkinin çalışma uzunluğu kodlamasıdır):

1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, ...
1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, ...
2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, ...

Bu durumda başka bir çözüm var. Her döngü uzunluğu için böyle bir döngü bulabileceğimiz ortaya çıktı. Aslında, farklı uzunluktaki n sayısı, OEIS girişi A001037 tarafından verilir (bu, bir çevrimdeki sırasının birinci seçim olduğu düşünülen keyfi seçimi saymaz).

Eğlenceli gerçek: Göründüğü gibi, bu zorluk karmaşık haritayı inceleyerek ilham almıştır f(z) = z - 1/z. O haritanın bu zorlukla ne yapması gerektiğini kim bilemezse, bir kurabiye alır.

Meydan okuma

Bir döngü uzunluğu k > 0ve bir dizi uzunluğu göz önüne alındığında , yukarıdaki çalışma uzunluğu dönüşümü altında bir döngü oluşturan farklı (sonsuz) ikili dizilerin n > 0birinci nterimlerini çıkar k. Birden fazla döngü varsa, bunlardan herhangi birini çıkartabilirsiniz. Döngüde hangi sırayla başlayacağınız ve döngünün hangi yöne gideceği size kalmış (böylece her bir sıranın bir sonrakini tanımlayacak şekilde veya her bir sıranın öncekini döngüsel olarak tanımladığı şekilde çıktılar).

STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı yoluyla giriş alarak ve sonucu STDOUT (veya en yakın alternatif), fonksiyon dönüş değeri veya function (out) parametresi ile çıktı alarak bir program veya işlev yazabilirsiniz.

Çıktı, dış boyut kve iç boyut olacak şekilde herhangi bir uygun, açık, iç içe liste biçiminde olabilir n.

Standart kuralları geçerlidir.

Ek örnekler

İşte bazı örnekler. Ancak dediğim gibi, çözümler benzersiz değil, bu yüzden kendi çözümleriniz farklı olabilir ve yine de doğru olabilir. Belki bunlar olsa bir çözüm bulmanıza yardımcı olur. Her örneği k nsıralar izler, öyle ki her satır bir sonrakini tanımlar (döngüsel olarak):

4 20
1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2
2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1
2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1
1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1

5 6
2, 2, 1, 2, 2, 1
1, 1, 2, 2, 1, 2
2, 1, 2, 2, 1, 1
1, 1, 2, 1, 1, 2
2, 1, 2, 2, 1, 2

8 20
2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2
1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1
2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2
2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2
1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1
2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2
1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1
2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1

13 50
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1
1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1
1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1
1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1
1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1

Son iki çıktıdaki tüm satırların farklı olmadığını unutmayın, ancak sonunda nyeterince büyük olsalar bile .

ilgili sorular


1
Jeneratör listesini çıkartabilir miyiz?
CalculatorFeline

@CatsAreFluffy Hayır, özür dilerim. (Belki bir dahaki sefere ...)
Martin Ender

Yanıtlar:


6

CJam (41 bayt)

{Ma*{1:Bm<{1+ee{(1&B^)+}%e~A<0:B;}%}@:A*}

Bu, sırayla yığına girdi alan n kve çıktıya yığın bırakan anonim bir işlevdir . Çevrimiçi demo

Temel fikir, bir Lyndon kelime sütunu ile başlamak [2 1 1 1 ...]ve yinelenerek her satırın ilk elemanını ve değişimini çalıştırarak uzunluk çözer ve daha fazla eleman elde edebileceğimize dayanarak uzanır.


3

Haskell, 72 bayt

~(a:b)?c=c:[c|a>1]++b?(3-c)
k!n=take k$take n<$>last(k!n)?2:map(?1)(k!n)

Demo:

*Main> 4!20
[[2,1,1,2,2,1,2,2,1,2,1,1,2,1,1,2,2,1,2,1],[1,1,2,1,2,2,1,1,2,1,1,2,2,1,2,2,1,2,1,1],[1,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2],[1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,1,2,1,2,2]]

1
Sonunda iyi iş çıkardın! :) Haskell olmayanlar için bir açıklama ekler misiniz? :)
Martin Ender
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.