İleri-Geri Sıra


18

Oluşan bir yol düşünün <ve >ve biten bir @, mesela

><>@

En soldaki hücrede bir yürüteç başlar. Yolu şu şekilde geçecektir:

  • Yürüteç bir @hücre üzerindeyse , hedefe ulaştı ve bitti.
  • Yürüteç bir >hücre üzerindeyse , tüm yol döngüsel olarak yürüteçle birlikte bir adım sağa kayar .
  • Yürüteç bir <hücre üzerindeyse , tüm yol döngüsel olarak yürüteçle birlikte bir adım sola kayar .
  • Daha sonra, yürüteç tek bir adım atar. Yolun her iki ucundaysa, sondan uzaklaşır. Aksi takdirde, başlangıçta sağa doğru yürürken, son adımda hareket ettiği yönde (dönüşü görmezden gelir) devam eder.

Yukarıdaki örnek üzerinde çalışalım. Yürüteç pozisyonu ile işaretlenir ^:

><>@   --rotate-->  @><>
^                    ^
step right (first step):
@><>   --rotate-->  ><>@
  ^                  ^
step right:
><>@   --rotate-->  @><>
  ^                    ^
step left (dead end):
@><>   --rotate-->  ><>@
  ^                  ^
step left:
><>@   --rotate-->  @><>
^                    ^
step left:
@><>   Goal reached!
^

Yürüteç , işlemdeki 6 hücreyi ziyaret etti (başlangıç ​​hücresi ve bunun yanı sıra @her hücreyi ziyaret edildiği sıklıkta sayma).

Burada, yürüteç kenarları boyunca bir döndürme ile taşınan küçük bir örnek:

>>@   --rotate-->  @>>
^                   ^
step right (first step):
@>>   --rotate-->  >@>
  ^                ^
step right (dead end):
>@>   Goal reached!
 ^

Bu sefer yürüteç 3 hücreyi ziyaret etti .

Bunu kolayca bir tamsayı dizisine dönüştürebiliriz:

  • Size pozitif bir tamsayı N verilir , örn 9.
  • Bu tamsayının ikili temsilini hesaplarsınız, örn 1001.
  • Sonra çevirmek 1içine >ve 0içine <ve ekleme @: ><<>@.
  • Bu şekilde yapılan sayıyla yürüteç tarafından ziyaret edilen hücre sayısını N ile ilişkilendiriyoruz .

Elde edilen sekansın ilk birkaç elemanı şunlardır:

2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7

Bu oldukça keyfi görünebilir, ancak ortaya çıkan dizi aslında çok fazla yapıya sahiptir:

resim açıklamasını buraya girin

Referans için, bu macanda dizinin ilk 2048 sayısını bulabilirsiniz .

Meydan okuma

Tahmin ettiniz: yukarıdaki diziyi hesaplayacaksınız. Bunu üç yoldan biriyle yapabilirsiniz:

  • Sürekli olarak (sayısal olmayan karakterlerle ayrılmış) değerler çıkararak veya bunları destekleyen dillerde sonsuz bir tür jeneratör kullanarak sonsuz bir dizi (bellek izin verirken) üretebilirsiniz. STDOUT'a sonsuz bir akış yazdırırsanız, sayıları tek tek yazdırmanız gerekmez, ancak her sayının sınırlı bir süre sonra (ve sırayla) yazdırılacağından emin olun. Bu seçeneği kullanırsanız, herhangi bir girdi almamalısınız.
  • Eğer bir tamsayıdır sunar N girişi ve üretmek olarak N dizisinin inci terimi.
  • Sen bir tamsayı alabilir N giriş ve üretim her şey gibi kadar N dizisinin inci terim, ya bir liste veya dize olarak kesin bir ayırıcı kullanılarak.

Tabanlar arasında kolayca dönüştürülemeyen dilleri cezalandırmak istemediğim için, N tamsayısı yerine , S ve s'yi her zamanki gibi (liste veya dize olarak) kullanarak N'nin ikili temsilini alabilirsiniz. -Önemli biraz önce.01

STDIN (veya en yakın alternatif), komut satırı bağımsız değişkeni veya işlev bağımsız değişkeni ile girdi alarak ve sonucu STDOUT (veya en yakın alternatif), işlev dönüş değeri veya işlev (çıkış) parametresi aracılığıyla çıktı alarak bir program veya işlev yazabilirsiniz.

Standart kuralları geçerlidir.

Arka fon

Bu aslında benim ezoterik programlama dilim Labirent'in "yolu" kaynak kodu olarak yorumlaması gereken basit bir yorumlayıcı "keneler" sayısını hesaplar . Bu durumda, "yürüteç" basitçe komut işaretleyicisidir (bir konumu ve bir yönü vardır), @komut programı sonlandırır <ve >kaynak kodu değiştirme komutlarıdır.


hangisi gerekli? 1, 2 veya 3 ve gönderimlerimiz nasıl puanlanıyor
Abr001am

@ Agawa001 "Bunu üç yoldan biriyle yapabilirsiniz:" Hangisini kullanmak istediğiniz yaklaşım ve dil için en kolay olduğunu düşünüyorsanız, bunlardan birini seçin.
Martin Ender

Neden bugün tüm tekrarlayan numaralar!?! codegolf.stackexchange.com/questions/78787/… : D
kedi

Yanıtlar:


6

Jöle , 10 bayt

ð+\ḤiḤoµL‘

Bu işlev, ikili basamak listesi olarak tek bir tamsayıyı girdi olarak kabul eder.

Algoritma @ Agawa001'in cevabındaki algoritmaya eşdeğerdir .

Çevrimiçi deneyin! veya ilk 2048 sayılarını oluşturun .

Arka fon

Yolundan altında pozisyonları numaralandırma 0 için L toplam veren L + 1 konumları arasında olabilir. L , yolu kodlayan N sayısının ikili basamaklarının sayısına denk gelir . Bu gösterimle, yürüteç 0 konumunda başlar , hedef L konumunda .

Yürüteç attığı her adımda, hedefe bir adım daha yaklaşır (şu anda yürüdüğü yönde). Ayrıca, her vardiya adımında, vites değiştirme yönünde ya da karşı hareket edip etmediğine bağlı olarak, pozisyonunu 2 modulo L + 1 kadar arttırır veya azaltır veya mevcut pozisyonda kalır.

Yönünü değiştirmek için, L - 1 ( L yönü ) veya 1 konumu ( 0 yönü ) üzerine inmesi ve ardından yönünde kayması gerekir. Bir sonraki adım onu ​​ters yöne bakacak şekilde önceki konumuna geri getirecektir.

  • Eğer L bile olduğunu L - 1 onun başlangıç konumundan ilerlemek olamaz yani, garip 1 - L doğrudan. Ulaşmanın tek yolu L' den geçmek , 0'a geçmek ve 1'e inmek için bir sonraki adımı atmak , sonra sağa ilerlemektir. Bu, L adımlarından daha az olmayan bir şekilde yapılabilen 2L konumlarının ilerletilmesini gerektirir .

    Ancak, yön değiştirmeden L adımlarını attıktan sonra hedefe ulaşmış olacak. Başlangıç ​​hücresi için bir tane ekleyerek , bu durumda toplam L + 1 ziyaret edilen hücre elde ederiz.

  • Eğer L garip, L - 1 o kaymıştır alma yoluyla bu pozisyonu ulaşabilmesi için, hatta olduğunu / 2 - (1 L) sağa kere. Pozisyon ise L - 1 bir altında olduğunu , 1 o zaman, o pozisyona kaydırılır alacak L dönüp, ve pozisyon adım L - 1 (bakacak leftwards).

    Bu, amacına ulaşmadan önce olabilir veya olmayabilir, bu yüzden analiz edilmesi gereken iki durum vardır:

    • Daha varsa (L + 1) / 2 arasında oluşumları 1 ikili genişleme N , alma L adımları yönü çevirmek için yeterli olmayacaktır. Bu L adımları, yürüteç hedefine getirdiğinden, başlangıç ​​hücresi için bir tane eklediğinden, toplam , bu durumda L + 1 ziyaret edilen hücre elde ederiz.

    • En az varsa (L + 1) / 2 arasında oluşumları 1 ikili genişleme N ilerleyen, ((L + 1) / 2) inci oluşumu gerektirecektir I , adım burada ben bu oluşum başlangıç konumudur arasında , 1 .

      Böylece, I adımlarını attıktan sonra , yürüteç L - 1 konumunda , sola bakar. Yönleri tekrar çevirmek için 1. pozisyona doğru sola doğru ilerlemesi gerekiyordu . Ancak, eşit durumda olduğu gibi, (L - 1) - 1 tuhaf olduğundan, 0'dan geçmeyi gerektirir. ve L adımlarını atlatmayı .

      Sol yöndeki hedefe ilk mesafe 1 olduğundan , I adımlarını attıktan sonra , yürüteç yön değiştirdikten sonra kendini hedeften I + 1 mesafesinde bulur . Beri ben <L , sahip olduğumuz Ben + 1 ≤ L , sonraki yüzden I + 1 adım hedefe onu getirecektir.

      Bu, toplam I + I + 1 = 2I + 1 adımlarını verir. Başlangıç ​​hücresi için bir tane ekleyerek , bu durumda toplam 2I + 1 + 1 = 2 (I + 1) ziyaret edilen hücre elde ederiz.

Nasıl çalışır

ð+\ḤiḤoµL‘  Main link. Argument: x (list of binary digits of N)

       µ    Monadic chain. Argument: x
        L   Compute L, the length of x.
         ‘  Increment to yield L + 1.

ð           Dyadic chain. Left argument: x. Right argument: L + 1
 +\         Compute the cumulative sum of x.
            This replaces the k-th one (and all zeroes to its right) with k.
   Ḥ        Unhalve; multiply all partial sums by 2.
    i       Find the first index of L + 1.
            This either gives I + 1, the 1-based index of the ((L + 1) / 2)-th one
            or 0 if the list doesn't contain L + 1.
            The result will be 0 if x contains less than (L + 1) / 2 ones
            or if L + 1 is an odd integer.
     Ḥ      Unhalve; yield either 2(I + 1) or 0.
      o     Logical OR with L + 1; if the previous operation returned a falsy
            value (i.e., if it yielded 0), replace that value with L + 1.

9

Matlab (puan = 230, n = inf)

function w(s,f),b=[];e=0;for i=s:f,a=dec2bin(i);c=find(a=='1');g=numel(a)+1;if numel(c)>=g/2;if mod(g,2)==1,fprintf('%d ',g);else,d=c(g/2);fprintf('%d ',2*d);end,else,fprintf('%d ',g);end,e=e+1;if(e==100),e=0;fprintf('\n');end;end
  • İşlev başlangıç ​​dizini ve bitiş olarak f alır ( infsonsuza kadar devam etmek istiyorsanız yazın).
  • İşlev, iki çıkış tipi arasında kayda değer bir gecikme olmadan sonsuza kadar gidebilir h=1000000000000000000000000000000000000000000000000000;w(h,h+1).
  • Algoritma, daha sonra açıklayacağım matematiksel bir yaklaşımı izler ve bu programa dayanarak Martin'in referans listesini onaylar:

    stored=[2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 14, 8, 8, 8, 14, 8, 14, 12, 12, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13];
    b=[];for i=1:numel(stored)
    a=dec2bin(i);
    c=find(a=='1');
    if numel(c)>=(numel(a)+1)/2
    if mod(numel(a)+1,2)==1
    b=[b numel(a)+1];
    else
    d=c((numel(a)+1)/2);
    b=[b 2*d];
    end
    else
    b=[b numel(a)+1];
    end
    end
    for i=1:numel(stored)
    if (b(i))
    if b(i)~=stored(i)
    'error',
    end
    end
    end
    
  • Algoritma 2048 ilk test vakalarını doğruladığından, herhangi bir test vakası için körü körüne olacağını varsayacağım, bu yüzden algoritmam, bu işlemde keşfettiğim ve hareket eden işaretçinin acısı olmadan keşfettiğim birkaç özellikle çalışır:

    1- eğer ikili çeviride 1'in iki katı sequnce uzunluğunu aşmazsa L, çıktıL+1

    2- eğer sıra uzunluğu eşitse ve önceki koşul ayarlanmadıysa, çıktı aynı olur L+1

    3- Aksi halde, çıktı L/21'in inci indeksinin iki katıdır .


Eğer birlikte ne anlama geldiği konusunu Can "çıkışı 1. iki katı L / 2th endeksidir" ? İnanılmaz derecede belirsiz.
orlp

@ veya bu 10010001 dizisinde 1'in ikinci oluşumu 4'tür, 2 ile 8'dir.
Abr001am

1
Bu a=dec2bin(input(''));c=find(a=='1');g=nnz(a)+1;if nnz(c)<g/2|mod(g,2);g,else,2*c(g/2),end, sekansın sadece tek bir elemanını veren en az 89 bayta golf edilebilir .
David

8

Python, 122 119 113 110 108 107 103 bayt

def l(b):
 p=e=w=len(b);d=i=1
 while e:p+=1-2*b[w-e];d*=2*(1!=d-p>~w)-1;p-=d;e=(e-d)%-~w;i+=1
 return i

Girdiyi ikili basamakların bir listesi olarak alır. Test etmek için yardımcı fonksiyon:

b = lambda n: [int(d) for d in bin(n)[2:]]

7 bayt kaydettiği için Lynn'e teşekkür ederiz.


4
Pew pew pew. : D
AdmBorkBork

Çok fazla değil, ama ... Sanırım p-d-1in[-2,w]bir bayt kurtarıyor.
Lynn

İfadeyi değiştirmek d*=2*(1!=d-p>~w)-1dört tane daha tasarruf sağlar! ° v °
Lynn

@Lynn de Morgan'ın yasalarını iyi kullanmak!
orlp

u benimki ile karşılaştırmak için geniş bir çıkış aralığı sağlayabilir? thanx
Abr001am

3

Python 2, 99 bayt

def l(b):l=len(b);return(l>=sum(b)*2or l%2<1)and-~l or[i+1for i,c in enumerate(b)if b[i]][l/2]*2

Agawa001'in parlak cevabının Python limanı.

Okunabilir sürüm:

def l(b):
    if len(b) >= 2*sum(b) or len(b)%2 == 0:
        return len(b) + 1

    return 2*[i+1 for i, c in enumerate(b) if b[i]][len(b)//2]

@ Agawa001 Henüz algoritmanızı anlamadım, ancak 10 milyona kadar deneysel olarak doğruladım.
orlp

3

MATL, 31 , 25 bayt

BXHnQtHsy2/<w2\+~?2/Hfw)E

Bu, Agawa001 algoritmasının sadece bir MATL sürümüdür, tek farkı bir tamsayı girişi alır ve sırayla N. Terim döndürür. Yığında tüm öğeleri takip etmek zor oldu! Delirmemek için bir pano kullanarak başvurmak zorunda kaldım. Şunları yapabilirsiniz çevrimiçi deneyin!

İlk N terimlerini :"@koddan önce ve ]Dsonra ekleyerek bir döngü haline getirilebilir .

6 bayt kurtardığı için Luis Mendo'ya teşekkürler!


2

Julia 0.4, 4̷4̷ 42 bayt

x->(k=endof(x)+1;try k=2find(x)[k/2]end;k)

Bu işlev, ikili basamak listesi olarak tek bir tamsayıyı girdi olarak kabul eder.

Algoritma @ Agawa001 yanıtı ve Jelly cevabımdakine eşdeğerdir .

Çevrimiçi deneyin!

Nasıl çalışır

find(x)x'in sıfır olmayan tüm öğelerinin 1 tabanlı indekslerini döndürür . Elde edilen diziye k / 2 dizininde erişmeye çalışıyoruz ve başarılı olursa k üzerine yazıyoruz , seçilen dizinin iki katı ile .

Bu, yalnızca aşağıdakilerden biri doğru olduğunda başarısız olur:

  • k / 2 , integral olmayan bir şamandıradır ve bu nedenle InexactError yükseltilir.

  • Dizin dizisi k / 2 öğesinden daha az öğeye sahip, bu nedenle bir BoundsError öğesi yükseltildi.

Her iki durumda da, k üzerine yazma başarısız olur, bu nedenle orijinal değeri döndürülür.


1

JavaScript (ES6), 65 bayt

s=>(l=s.length+1)%2|!(m=s.match(`(0*1){$l/2}}`))?l:m[0].length*2

İkili bir dizeyi kabul eder. Diğer çeşitli yanıtlardan geri dönme denetimini kullanır.


1

Python 2, 74 bayt

def f(x):k=len(x)+1;print next((i*2for i in range(k)if k==2*sum(x[:i])),k)

Bu işlev, ikili basamak listesi olarak tek bir tamsayıyı girdi olarak kabul eder.

Algoritma @ Agawa001 yanıtı ve Jelly cevabımdakine eşdeğerdir .

Ideone üzerinde test edin .

Nasıl çalışır

nextgirişimleri ilk tamsayı bulmak 2i olan k==2*sum(x[:i])doğru döner. Yana x[:i]ihtiva i elemanları, bu 1 tabanlı düzeyi indeksini verir (k / 2) inci 1 .

nextk / 2 integral değilse veya x k / 2'den daha az içeriyorsa başarısız olur . Bu durumda, varsayılan k değeri döndürülür.


0

> <> , 63 bayt

2r11&>}:?v{1->:l2-%?vr{{$>1+$}$:2=$@&101.
 +&?!^&n;>{1+^ .0+bf<

Bu meydan okumada örnek kalıbı gördüğüm andan itibaren hangi dili kullanacağımı biliyordum :)

Kullanılması N almak için N terimini .

Girdinin yığında ikili olduğu varsayılır. Yürüteç etrafta dolaşmak yerine, bu çözüm çoğunlukla bandı yürüteç altında hareket ettirmeye dayanır.

Çevrimiçi deneyin!

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.