Stöhr dizisini oluşturun


12

Ruby öğreniyorum ve bu sorunu çözmek için ilk önemsiz kodumu yazdım.

Zor olan, Stöhr dizisinin ( S) ilk n elemanını şu şekilde tanımlamaktır:

S [0] = 1

S [n], dizideki iki farklı önceki öğenin toplamı olarak ifade edilemeyen en küçük sayıdır.

Böylece dizi 1, 2, 4, 7 ve 10 ile başlar. Bir sonraki eleman 13'tür, çünkü 11 (= 1 + 10) ve 12 (= 2 + 10) önceki elemanların toplamıdır, ancak 13 değildir.

En kısa kodu arıyorum. Ruby'de kendi karakterim 108 karakter uzunluğunda, ama belki de göndermeden önce başkalarının neyle karşılaştığını görmek için beklerim?


Cevapları şimdiye kadar seviyorum. Şimdi, belki de geri dönüp gereksinimleri değiştirmek için çok geç, ama sanırım özellikle dizinin tanımını kullanan çözümlerle ilgileniyorum (yani, kod önceden bilmiyor) sayılar 3 artar). Yani: bunu yapabiliyorsanız ahlaki bonus puanları.
Théophile

Matematiksel dizilerdeki problem budur. Deseni biliyorsanız, genellikle daha kısa olacaktır.

Bu dizi (?) Kullanılmadan aritmetiktir.
user75200

@ user75200 İlk üç elemandaki farklardan da görebileceğiniz gibi sekans aritmetik değildir, ancak üçüncü elemandan başlayan sıra gerçekten aritmetiktir. Posta Pulu sorunuyla bağlantılı olarak kullanılır.
Théophile

Yanıtlar:


13

APL, 7

APL'de dizin 0 veya dizin 1 ile çalışmak isteyip istemediğinizi seçebilirsiniz. Bunu global değişken ⎕IO ← 0 ayarlayarak yapabilirsiniz.

Eğer indeks 0'da çalışmayı seçersek:

+\3⌊1⌈⍳

Açıklama:

⍳    creates a sequence 0...n   (0 1 2 3 4 5)
1⌈   takes whichever is bigger, number in sequence or 1 (1 1 2 3 4 5)
3⌊   takes whichever is lower, number in sequence or 3 (1 1 2 3 3 3)
+\   partial sums for the sequence (1 2 4 7 10 13)

Tryapl.org adresinde deneyin


1 tabanlı indeksle çalışıp 1'den n'ye bir dizi oluşturamaz ve bunu başka bir 1 ile başlatamaz mısınız? Bu yapılabilirse, daha kısa mı?
Doktor

Girmem gereken kod daha uzundu. Bu dizin 1, 10 karakter için kodum oldu: + \ 3⌊1, ⍳¯1 + Ayrıca, index-0 sürümü de 0 argümanı ile çalışır, ancak bu değil.
Moris Zucca

Ah. evet. APL gerçekten parladı ..
Doktor

9

Haskell - 11 21

Tembel sonsuz dizi

1:2:[4,7..]

Sadece verilen üye sayısını döndüren işlev (iç çekme)

flip take$1:2:[4,7..]

Sen sahip bir giriş almak ve sadece ilk yazdırmak için nnumaralar.
Doktor

4
@Optimizer Eh, teknik olarak , sen var "ilk üretmek için n -it siz de onlardan geri kalanını üretemez demiyor Stöhr dizisinin elemanlarını"! Bir girdi de almanız gerektiği anlamına gelmez. swish'in orijinal kodu aslında herhangi bir n için ilk n terimini oluşturur .
wchargin

1
@WChargin fazla akıllı olmaya çalışıyor yeni değil. OP kelimelerini tam anlamıyla almak ve gerekenden fazladan çıktı üretmek her ikisi de standart boşluklar olarak kabul edilir.
Doktor

2
Eğer bunun için sormak kadar @Optimizer Aslında tembel yollarla olmanın hiçbir ekstra çıkış oluşturulabilir, sizler için sorabilirsiniz herhangi istediğiniz terimler.
swish

1
@swish anlamadım. Burada tembel olan nedir?
Doktor


6

CJam, 14 bayt

1l~{_p_3e<+}*;

Burada test edin.

1'den başlar. Sonra S [n] = S [n-1] + dak (S [n-1], 3) .

1l~{_p_3e<+}*;
1              "Push 1.";
 l~            "Read and evaluate input N.";
   {       }*  "Repeat this block N times.":
    _p         "Duplicate the last number and print it.";
      _3e<     "Duplicate it again, and take minimum with 3.";
          +    "Add to last number.";
             ; "Discard final number to prevent output.";

Bu, 3 ile 2 saat -1 yerine h -Stöhr sekanslarına kolayca genellenir .


6

Brainfuck, 13 karakter

+.+.++.[+++.]

Veya n çıkışla sınırlamak istiyorsak 30 karakter:

,->+.<[->+.<[->++.<[->+++.<]]]

1
Bence ilk nöğeleri yazdırmanız gerekiyor , sonsuz bir akış değil ...
Sp3000

@ Sp3000 Karakter kodlarını sayısal girdi ve çıktı olarak kullanmak genel olarak kabul ediliyor mu? Metada bulunamıyor. Bununla BF kodunu düzeltmek oldukça kolay olurdu.
randomra

Şahsen bunun için genel fikir birliğinin ne olduğundan emin değilim, üzgünüm. Ben de bu konuda biraz sorun yaşadım.
Sp3000

ilk n elemanları için, ben -> +. <[-> +. <[-> ++. <[-> +++. <]]] (29 karakter) yapabileceğimi düşünüyorum, ama bu kadar zarif değil . Ve dilin giriş ve çıkış için ASCII kodlarını kullanmakla sınırlı olduğunu düşünmüyorum.
jgosar

1
Kodunuz bu kadar zarif olmasa bile soruyu cevaplamak zorunda. Gönderiyi düzenlemenizi ve cevabını düzeltmenizi öneririm ,->+.<[->+.<[->++.<[->+++.<]]]. (Başlangıçta giriş okuma virgülünü kaçırdınız.)
randomra

4

Python, 136 bayt

def f(n):
 if n<1:return[1]
 x=f(n-1);y=set(x)|{a+b for a in x for b in x if a!=b};return x+[min([a for a in range(1,max(y)+2)if{a}-y])]

Doğrudan tanımdan. Bunu ne kadar golf yapabileceğimden emin değilim - kesinlikle beklediğimden çok daha uzun.


3

J, 14 karakter

Bu sadece [1,2, 4+3*k (k=0..n-1) ]diziyi kodlar ve birincisini alır N.

   ({.1,2,4+3*i.) 10
1 2 4 7 10 13 16 19 22 25

.

J, 18 karakter

Bu [0,1,2,3...], [1,1,0,0...]ve ' nin doğrusal bir kombinasyonunu kullanır [0,1,1,1...]. Daha kısa olmalı ama golf görünmüyor.

   ((3&*+<&2-2**)@i.) 10
1 2 4 7 10 13 16 19 22 25

3

Başlangıcı , 32 20

Düzenleme: ... şimdi iki kez seslerle!

?(1-)
4 +3
2  ^
1 !^

Bu, Python yorumlayıcısının birlikte olduğunu varsayar NUMERIC_OUTPUT = True. Brainfuck sunumu gibi, bu cevap da girdinin bir kod noktası şeklinde verildiğini varsayar. Bu kısmen bu meta tartışma için daha fazla dikkat çekmek (ve kısmen, Prelude'u seviyorum çünkü). İlk 32 sayıyı yazdırmak istiyorsanız, diyelim ki, STDIN üzerine bir boşluk koymanız gerekir. Tabii ki, bu geçerli girdilerin üst sınırı olduğu anlamına gelir, ancak bu cevap yine de kazanmıyor, bu yüzden Prelude'un sınırları dahilinde bu iyi.

açıklama

Prelude'da, tüm satırlar paralel olarak yürütülür, bu satır kendi yığınına sahiptir ve sonsuz miktarda sıfır olarak başlatılır. Yalnızca tek bir talimat işaretçisi vardır (sütunları işaret eder), bu nedenle bir ses için bir döngü girerseniz, diğer tüm sesler onunla birlikte döngü yapar.

Aşağıda, ben sütun yerine satır açıklama ekleyebilir kod devrik ettik:

?421  Read a character into the first stack. Push 4, 2, 1 onto the other stacks, respectively.
      Generally, the fourth stack will hold the next number to be printed, the third stack the
      one after that, and the second stack the number two steps ahead.
(     Start a loop if the input wasn't 0.
1+ !  Push a 1 onto the first stack. Add the top elements in the second stack. On the first
      iteration this will be 0 and 4, so it does nothing. On all further iterations
      this will increment the last number by 3.
-3^^  Subtract one from the first stack. Push a 3 onto the second stack for the next iteration.
      Copy the last value from the second to the third, and the third to the fourth stack.
)     If the top of the first stack is not 0, jump back to the column after the (.

2

JavaScript (ES6) 92

Problem tanımına dayalı özyinelemeli bir işlev olarak

S=(n,v=1,s=[],r=0)=>[for(a of s)for(b of s)r+=(a-b&&a+b==v)]|r||(s.push(v),--n)?S(n,v+1,s):s

1,2, 1 + 3 * k: 58 modelini kullanarak

S=(n)=>(i=>{for(t=1;n>r.push(t+=i);i+=(i<3));})(0,r=[])||r

Yan not: h-Stöhr dizisini bulma h(sadece 2 yerine sayıların toplamını doğrulama ). RFonksiyon listesi elemanlarının belirli sayıda kadar tüm Possibile toplamları çalışır.

S=(n,h=2,s=[],v=1,R=(t,v,l,i=0,r=t,w)=>{
  for(;r&&l&&v[i];i++)
    w=[...v],r=!R(t-w.splice(i,1),w,l-1)
  return!r;
})=>R(v,s,h)||(s.push(v),--n)?S(n,h,s,v+1):s

Ungolfed kabaca eşdeğer (ve ES5 uyumlu)

function S(n, v, s)
{
  var r=0,a,b
  v = v||1
  s = s||[]
  for(a of s)
    for(b of s)
    {
      if (a != b && a+b == v) 
        r++;
    }
  if (r == 0) 
  {
    s.push(v);
    --n;
  }
  if (n != 0)
     return S(n,v+1,s)
  else
     return s
}

FireFox / FireBug konsolunda test edin . Basit fonksiyon:

S(20)

[1, 2, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55]

Gelişmiş fonksiyon:

S(10,5)

[1, 2, 4, 8, 16, 32, 63, 94, 125, 156]


2

> <> (balık) , 72 65 49 46 karakter

1n1-:?!;' 'o2n1-v
v1&no' ':<4&;!?:<
>-:?!;&3+^

Giriş tercümana verilir:

>fish.py stohr.fish -v 10
1 2 4 7 10 13 16 19 22 25

İlk> <> programım önerileri takdir etti.


Oh iyi! Birisinin bir program yazmasını umuyordum.
Théophile

2

> <>, 31 bayt

4i1nao:?!;2nao1-:?!;$:nao3+$d0.

Tek bir karakterde okur, kod noktasını kullanır (örn. Boşluk = 32) ve sayıları her satıra bir tane yazdırır.


2

Perl6 22/30

Perl6'nın diziyi benim için çözüp çözemeyeceğini göreceğim.

Bunu yapmak için Perl6'da yerleşik REPL kullandım

$ perl6
> 1,2,4,7...*
Unable to deduce arithmetic or geometric sequence from 2,4,7 (or did you really mean '..'?)
> 1,2,4,7,10...*
1 2 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 ...

Hmm, Perl'in çıkardığı modeli görüyorum. 4'den sonra bir sonraki değeri elde etmek için 3 eklersiniz.

1,2,4,*+3...*

13 karakter uzunluğunda Stöhr dizisindeki sayıların sonsuz bir listesini elde etmek için kodu yapan bir karakter kaydeder.

Bu kod, REPL'de sadece bizim için sonucun özünü yazdırdığı için yararlı bir şey yapar . Aksi takdirde yazdırmak için Perl'e sonuçları yazdırmasını açıkça söylemeniz gerekir.

$ perl6 -e 'say 1,2,4,*+3...*'

( * + 3sadece bağımsız değişkenine eklenen 3 döndüren bir kod başvurusu almanın bir yoludur. Bunu yazmanın diğer yolları { $_ + 3 }, veya -> $i { $i + 3 }, veya { $^i + 3 }veya sub ($i){ $i + 3 })


Bir şey oluşturmanın en kısa yolu İlk n öğeyi oluşturmak için çağrılabilir Öğelerin bir dilimini elde etmektir.

{(1,2,4,*+3...*)[^$_]} # 22

İlk $_değerleri üretecek olan boşluk bağlamında , sonra bunları derhal atın.

Void bağlamından başka bir şeyde, bir argüman alan anonim bir kod bloğu (adsız temel bir alt program) oluşturur.

# store it in a scalar variable
my $sub = {(1,2,4,*+3...*)[^$_]};
say $sub.(5);
# 1 2 4 7 10

# use it immediately
say {(1,2,4,*+3...*)[^$_]}.(5);
# 1 2 4 7 10

# pretend it always had a name
my &Stöhr-first = {(1,2,4,*+3...*)[^$_]};
say Stöhr-first 5;

Bu meydan okuma için geçerli olarak nitelendirilmesi gereken bir isme sahip olduğunu düşünüyorsanız, muhtemelen bunu yaparsınız:

sub s(\n){(1,2,4,*+3...*)[^n]} # 30

Çünkü olsa sda bu çağırmak için, ikame operatör için kullanılır parens olmayan isteğe bağlıdır. (Sanırım farklı bir isim vermiş olabilirsiniz)

say s(5);
# 1 2 4 7 10

Zorlukta aksi belirtilmedikçe, golf zorluklarını kodlamak için yapılan başvurular sadece parçacıklar değil tam programlar veya işlevler olmalıdır .
Martin Ender

@ MartinBüttner adil olmak gerekirse 1,2,4,*+3...*gereken değerleri üretecek bir nesne yaratır. Bunun birçok insan aslında bir şey yaratmak sanmıyorum çağrılabilir Perl6 böyle etrafında bir şey.
Brad Gilbert b2gills

2

Zaten çok daha iyi bir java cevabı olduğunu görüyorum ama bu konuda biraz zaman geçirdim ve göndereceğim. berbat olsa bile.

Java 313 karakter (ekrana sığması için +4)

import java.util.*;public class S{public static void main(String[] a){
Set<Integer> S=new HashSet<Integer>();S.add(1);int i=1,k=0;
while(S.size()<=new Integer(a[0])){if(S.contains(i)){}else{k=0;for(int j:S){
for(int l:S){if(l!=j){if((j+l)==i)k=1;}}}if(k==0)S.add(i);}i++;}for(int x:S)
{System.out.println(x);}}}

nasıl geliştirileceğine dair ipuçları veya işaretçiler almak için her zaman minnettarım


1

T-SQL 204

Girdinin @N adlı bir değişken içinde olduğunu varsayar. İsterseniz bir prosedür yapabilirim, ancak T-SQL'de STD_IN almanın iyi bir yolu yok.

Ayrıca, ahlaki bonus için yay!

DECLARE @Q INT=0,@B INT=2
DECLARE @ TABLE(A INT)WHILE @N>0
BEGIN
SET @N-=1
WHILE @B>1
BEGIN
SET @Q+=1
SELECT @B=COUNT(*)FROM @ C,@ B WHERE C.A+B.A=@Q
END
INSERT INTO @ VALUES(@Q)SET @B=2
END
SELECT*FROM @

Güzel! SQL hakkında fazla bir şey bilmiyorum — @N burada nasıl kullanılır? Başlangıca yakın olduğunu görüyorum, ancak daha sonra başvurulmuyor gibi görünüyor.
Théophile

Görünüşe göre @N"for döngüsü" nin "i" si.
Jacob

Jacob haklı. @N, for döngüsünün "i" si olup SQL'de bir while döngüsüdür. Esasen çapraz tabloya kendisi ile katılır ve @Q'ya eklenen çiftleri bulur. En az iki çift varsa (yani sadece kendisiyle bir sayı değil), o zaman atlar. Aksi takdirde, tabloya ekler. @ tablonun adıdır.
bmarks

1

Mathematica, 27 bayt

Hmmm, hala Mathematica'nın cevabı yok mu? İşte iki:

NestList[#+3~Min~#&,1,#-1]&
Array[i=1/2;i+=3~Min~i&,#]&

her ikisi de bir tamsayı alan ve bir tamsayı listesi döndüren adsız bir saf işlev tanımlar. Bu benim CJam başvurumla aynı nüks ilişkisine dayanmaktadır. ArrayYineleme 1/2ilişkisi her zaman değer döndürülmeden önce uygulandığından , -based kodunun başladığını unutmayın .



1

Python - hatta yakın değil (139)

Bunun diğerlerinin yaptığı gibi kolayca hesaplanamayacağı varsayımı altında hareket ederek bulduğum en kısa çözüm aşağıdadır:

from itertools import combinations as C
x,i,n=[],1,input()
while len(x)<=n:
 if i not in [sum(y) for y in C(x,2)]:x.append(i)
 i+=1
print n

1

Clojure - 130 118

(defn s[n](last(take n(iterate #(if(<(count %)3)(conj %(+ (apply + %)1))(conj %(+(last %)(second %)(first %))))[1]))))

Golfsiz sürüm:

(defn stohr [n]
  (last
    (take n
      (iterate #(if (< (count %) 3)
                   (conj % (+ (apply + %) 1))
                   (conj % (+ (last %) (second %) (first %)))) [1]))))

Paylaş ve Keyfini çıkar.


1

Yakut - 108 88

q=->n{*k=1;(m=k[-1];k<<([*m+1..2*m]-k.combination(2).map{|i,j|i+j})[0])while k.size<n;k}

Bu, dizinin tanımını kullanır.

Daha okunabilir versiyon:

q=->n{
    *k=1
    (
        m = k[-1]
        k << ([*m+1..2*m] - k.combination(2).map{|i,j|i+j})[0]
    ) while k.size < n
    k
}

baskı q [10]

[1, 2, 4, 7, 10, 13, 16, 19, 22, 25]


Ruby Golf ipuçları: *k=1yerine k=[1]. foo while baryerine while bar;foo;end. [*s..e]yerine (s..e).to_a. .mapyerine to_a.map. {|a,b|a+b}yerine {|i|i.inject(:+)}.
histokrat

@histocrat Teşekkürler, bu çok yardımcı!
Théophile

0

STATA 51

di 1 2 _r(a) 
loc b=3*$a-2
forv x=4(3)`b'{
di `x'
}

0

TI-BASIC, 41 27 30 bayt

Hesap makineniz için

Input N:For(I,1,N:I:If I>2:(I-2)3+1:Disp Ans:End

0

GML , 67 bayt

n=argument0;for(i=1;i<=n;i++){t=i;if i>2t=(i-2)*3+1show_message(t)}
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.