Hofstadter'ın Şekil-Şekil Sırası Oluşturma


16

Gelen Gödel, Escher, Bach , Douglas Hofstadter'in yaygın olarak şekil-şekil dizisi olarak ifade edilir, bir tam sayı dizisini sunar:

2, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, ...

Sıranın tanımını kendiniz meydan okumanın bir parçası olarak çalışmaktan hoşlanabilirsiniz , ancak bunu çözmek istemiyorsanız veya bulmak istemiyorsanız, AE30'da sıra A030124 ve Wikipedia'da biraz daha net bir tanım olarak bulabilirsiniz .

nSTDIN, ARGV veya işlev bağımsız değişkeni ile verilen , dizinin ilk nsayılarının listesini herhangi bir makul liste biçiminde STDOUT'a yazdıran bir program veya işlev yazın .

Bu kod golf, baytlarda en kısa çözüm kazanır.

Yanıtlar:


6

CJam, 38 30 29 21 bayt

li_3*,2>\{(_pX+:X-}*;

Çevrimiçi deneyin.

Nasıl çalışır

li                     " Read an integer N from STDIN.              ";
  _3*,2>               " Push S := [ 2 3 ... (N * 3 - 1) ].         ";
        \{        }*   " Do the following N times:                  ";
          (            " Shift an integer I from S.                 ";
           _p          " Print a copy of I, followed by a linefeed. ";
             X+:X      " Execute X += I. (X is initialized to 1.)   ";
                 -     " Remove X from S.                           ";
                    ;  " Discard S from the stack.                  ";

Örnek çalışma

$ cjam <(echo 'li_3*,2>\{(_pX+:X-}*;') <<< 20
2
4
5
6
8
9
10
11
13
14
15
16
17
19
20
21
22
23
24
25

Tercüman için URL'yi yazarken aditsu'yu kaçırdınız
Beta Decay

@BetaDecay o zaman neden düzeltmek için düzenleme yapmıyorsunuz;)
Martin Ender

@Martin Yeterli temsilciye sahip olduğumu düşünmedim ...
Beta Çürüme

2
@BetaDecay Yapmıyorsunuz, ancak yine de önerebilirsiniz (eğer kabul edilirlerse size 2 temsilci verir).
Martin Ender

Kodumu 8 ek bayt kapalı golf için çok zeki hissettim. Sonra anladım ki şimdi histokrat, matsjoyce ve Peter Taylor'ın cevaplarıyla aynı şeyi yapıyor ...
Dennis

6

Haskell, 67 61 60 56 55 53 karakter

g n=take n$2:4:h
a#(x:s)=[a..x-2]++x#s
h=5#scanl(+)8h

ilk algoritmaya geri dönelim.

bu çözüm, dizinin başlangıç ​​elemanlarını toplayarak kompleman dizisini hesaplar. daha sonra diziyi, tamamlayıcının dizi numaraları arasındaki tüm sayılar olarak hesaplar.

(#)tamamlayıcı dizi arasındaki sayıları hesaplayan işlevdir.
hdizinin kendisidir.
gsoruyu cevaplayan işlevdir.

g işlevi, h'den sadece gerekli miktarda elemanı alacak şekilde tanımlanır.

incelikler:

haslında ilk 2 eleman hariç şekil figürü dizisidir.
tamamlayıcı dizi hesaplanmaz, ancak her eleman için 1 eklenmiş tamamlayıcı dizi hesaplanır.
bu iki incelik scanl(+)8h(ek 1'ler eklenmiş olan tamamlayıcı dizinin kodu (ilk 2 öğe hariç)) 8içinde bulunur. 1 eklenmiş tamamlayıcı dizinin üçüncü elemanı içindir.
onlar eklendiği için hesaplama ilk iki öğe eksik değil nedenidir giçinde 2:4:h.

misal:

>g 50
[2,4,5,6,8,9,10,11,13,14,15,16,17,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,57,58,59]

5

Yakut, 54 48

f=->n{x=1
b=*2..n*n
n.times{b-=[x+=p(b.shift)]}}

gösteri

Düzenleme: Ben golf biraz daha tamamladı Ben bellekte tam tamamlayıcı dizisi tutmak gerekmez fark etti. Şimdi şu şekilde çalışır: xTamamlayıcı sıradaki en büyük hesaplanmış sayıyı takip etmek için kullanırız ve sıra biçin bir aday havuzudur. nkez, kalan en küçük elemanı çıkarır ve tamamlayıcı dizideki bir sonraki sayıyı hesaplamak için bekleriz x. Sonra her iki sayıyı da aday havuzundan kaldırırız, bu nedenle her zaman iki diziye de eklenmemiş en küçük sayıyı çıkarırız.

Ruby golf hileleri: Stabby lambda sözdizimi bir yöntem tanımından daha kısadır. Çıkış STDOUT yerine dönüş değeri olarak verildiği gereklilik dönüş değeri gerçeğini kullanmak için bana ilham p(x)olan xo Anarşi Golf kullanılan Yakut sürümünde böyle değil çünkü normalde hatırlamıyorum hangi.


1
O nasıl çalışır?
gururlu haskeller

1
FWIW kullanabilirsiniz 2..2*n. Kullanmak zorundayım n*nçünkü etkili bir b = [x]^bşekilde yapıyorum, bu yüzden ben büyük değerinin en büyük değerinden daha büyük olması gerekiyor x, ancak b -= [x]sadece bçıkış dizisinin mümkün olan en büyük değerini içeren gerektirir .
Peter Taylor

4

GolfScript ( 24 21 bayt)

~.3*,1>\{(\(.p@+\|}*;

Çevrimiçi demo

Bu oldukça farklı başladı, ama bir GolfScript bağlantı noktasında birleşen sona erdi histocrat s' Ruby çözümü önce Dennis biraz daha farklı bir yöne götürün bazı önerilerde bulunulmuştur. Özellikle, sayıları tanımladığımız şekilde yazdırmak, sonunda baskı için bir dizide toplamaktan biraz tasarruf sağlar; bunun nedeni, hiçbir noktada yığın üzerinde 3'ten fazla öğe hakkında endişelenmemiz gerekmediği anlamına gelir.

teşrih

~.3*,           # Eval input n, dup, multiply by 3, make list [0 1 ... 3n-1]
1>              # Discard 0, which is part of neither sequence
\{              # Execute n times: stack contains pool of numbers not yet seen
                # in either sequence and the first element of it is the next element of the
                # complement sequence
  (\(           #   Pop two numbers from the start of the pool: stack is
                #     pool[0] pool[2..max] pool[1]
  .p            #   Print pool[1]
  @+            #   Rotate pool[0] to top and add to pool[1]
  \|            #   Place pool[0]+pool[1] at the start of the pool and
                #   (this is the clever bit) remove it from later in the pool
}*
;               # Discard the unused remainder of the pool

Eğer değiştirirseniz ^ile \-, o kadar değiştirebileceğiniz ).*ile 3*. Bu, bayt tasarrufu yapmaz, ancak çalışma süresini ve bellek kullanımını önemli ölçüde azaltır. - Tamsayıyı dizinin üstünde tutarak bir bayt kaydedebilmelisiniz. Döngü aynı bayt sayısına sahip olacaktır, ancak başlatma bir bayt daha kısa olacaktır.
Dennis

2
Set birliği farktan daha da iyi çalışır:~.3*,1>\{(\(.p@+\|}*;
Dennis

3

J - 28 karakter

Bağımsız ndeğişken olarak işlev alma .

($+/\(-.~2+i.)&:>:+/)^:_&2 4

nHerhangi bir değişiklik üretene kadar sol argüman olarak bir işlevi sağ argümanına tekrar tekrar çalıştırıyoruz. Başlangıç ​​argümanı listedir 2 4.

Fonksiyonun kendisinde, kısmi toplamları +/\ve tam toplamı alırız +/ve sonra ikisini birlikte arttırırız &:>:. Daha sonra her tamsayıyı 2'den tam toplamdan ( 2+i.) daha fazlasına üretiriz ve -.tanımlamaya göre daha uzun bir şekil-rakam sırası bırakarak subtract ( ) kısmi toplamlarını koyarız. Son olarak, listeyi kısaltır veya döngüsel olarak uzatırız n.

Sonuç bu 2 4olur 3 7ve bu 2..8ayrılmaktan çıkarılır 2 4 5 6 8. Başka turundan sonra, 2 4 5 6 8olur 3 7 12 18 26olur

2 4 5 6 8 9 10 11 13 14 15 16 17 19 20 21 22 23 24 25 27

Bu şekilde, figür-şekil sırasını tekrar tekrar genişletiyoruz. $Uzunluk davranış dizisi uzunluğa büyümeye bekleyen sadece önemsiz olmayan bir karakter kazandıran bir yoludur nveya daha fazlası ve çıkışı ndeğiştiklerini bıraktığınızda ilk değerlerini. Çok fazla beklemek zorunda da değiliz: iç fiilin dört uygulamasından 46336 terim alabiliriz.

K ile aynı fonksiyon:

  • k2, 37 karakter: {{x#y@&~_lin[y:1+!1+/y;1+\y]}[x]/2 4}
  • k4, 36 karakter: {{x#y@&~(y:2+!1+/y)in\:1+\y}[x]/2 4}

2

Java - 183 158

Bu şimdiye kadar bir şey golfed en oldu ve ben gurur duyuyorum! (Grafiklerin üst kısmına yakın bir yerde olmasa da (Java olduğu için))

Peter Taylor'a öneriler için teşekkürler

class f{public static void main(String[]a){int q=1,m=Byte.valueOf(a[0]),w=2,n[]=new int[m*m*2];for(n[q+=w]=1;m-->0;){System.out.println(w);for(;n[++w]>0;);}}}

daha büyük -

public class f {
    public static void main(String[] a) {
        int q = 1, m = Byte.valueOf(a[0]), w = 2, n[] = new int[m * m * 2];
        for (n[q += w] = 1; m-- > 0;) {
            System.out.println(w);
            for (; n[++w] > 0;)
                ;
        }
    }
}

Bu iç döngü oldukça etkileyici bir şekilde gizlenmiştir, ancak bence birkaç bayt tasarruf edebilirsiniz. Byte.valueOfüçü kaydeder ve soru girdi aralığını belirtmediğinden, kabul edilebilir olması gerektiğini düşünüyorum. Döngüler dışında, msadece initialize için kullanılır n, böylece, k++<molabilir m-->0ortadan kaldırarak, ktamamen. int[] nolarak başlatıldı edilebilir int n[]ve önceki Başlatıcı birleştirilecek. nasla değerleri dışında tutar 1, öyle n[...]!=0de olabilir n[...]>0. Başlatıcı daha sonra birinci forhalkanın başlatıcı parçası olabilir .
Peter Taylor

Ve eğer kurtulur uve sadece kullanırsanız ++w, n[q]veya ayarlamanıza gerek yoktur n[w]. Bir hata var, nne zaman m==2biterse n=new int[2*m*m], en iyi başlangıç ​​tarafından sabit gibi görünüyor , ama bence 157 bayta düşüyor.
Peter Taylor

Başlatıcı için ilk döngü için başlatıcı parçası haline gelmek istediğim şey for(int q=1,w=2,m=...,n[]=...;m-->0;){...noktalı virgül kurtarmaktı.
Peter Taylor

1

Python 2-77 bayt


Kod:

n=input();x=1;b=range(2,n*n)
while n:v=b.pop(0);x+=v;print v;b.remove(x);n-=1

Girdi stdin dışında @ histokrat çözeltisi ile aynı şekilde çalışır.


1

Python 2-68

R=[1]
s=0
n=input()
while n:s+=1+(s+1in R);R+=[R[-1]+s];print s;n-=1

0

Jöle , 15 bayt

SƤŻ‘µṀ‘Rḟ
2dz¡ḣ

Çevrimiçi deneyin!

6 girişinde hafıza hatası.

Nasıl çalışır

SƤŻ‘µṀ‘Rḟ  Aux. link (monad). Input: part of the desired sequence
SƤŻ‘       Sum of prefixes, then prepend a zero and increment
           This is a list of numbers to exclude from the next iteration
    µ      Re-focus on the above
     Ṁ‘Rḟ  Create range 1..Max + 1, then remove all elements of the above
           +1 is needed to progress from [2] to [2,4]

2dz¡ḣ  Main link (monad). Input: n, number of terms
2dz¡   Starting from 2, apply aux. link n times
    ḣ  Take n elements from the beginning

Daha verimli sürüm, 16 bayt

SƤŻ‘µṀ‘Rḟḣ³
2ÇÐL

Çevrimiçi deneyin!

Bu J cevabından bir fikir kullanır . Her bir yinelemeyi istenen uzunluğa kadar kesin ve düzeltme noktasını alın. (Max + 1 S) yerine (sum) kullanmayı düşündüm Ṁ‘, ancak doğruluğunu garanti edemem.


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.