Stöhr 시퀀스 생성


12

Ruby를 배우고 있으며이 문제를 해결하기 위해 사소한 첫 번째 코드를 작성했습니다.

도전 제를 생성하는 N 개의 의 요소 Stöhr 서열 , S 는 다음과 같이 정의된다 :

S [0] = 1

S [n]은 시퀀스에서 서로 다른 두 개의 이전 요소의 합계로 표현할 수없는 가장 작은 숫자입니다.

따라서 시퀀스는 1, 2, 4, 7, 10으로 시작합니다. 11 (= 1 + 10) 및 12 (= 2 + 10)는 이전 요소의 합이지만 13은 아니기 때문에 다음 요소는 13입니다.

가장 짧은 코드를 찾고 있습니다. Ruby에서 내 자신의 길이는 108 자이지만 게시하기 전에 다른 사람들이 무엇을 보게 될지를 기다릴 수 있습니까?


나는 지금까지 답변을 좋아한다. 이제 돌아가서 요구 사항을 변경하기에는 너무 늦었지만 시퀀스 자체의 정의를 사용하는 솔루션에 특히 관심이 있다고 언급했을 것입니다. 숫자는 3) 올라갑니다. 그렇게 할 수 있다면 도덕적 인 보너스 포인트입니다.
Théophile

수학 시퀀스의 문제입니다. 패턴을 알고 있으면 일반적으로 짧아집니다.

이 순서는 아무런 사용없이 산술적입니다 (?).
user75200

@ user75200 첫 세 요소의 차이점에서 알 수 있듯이 시퀀스는 산술적이지 않지만 세 번째 요소에서 시작하는 하위 시퀀스는 실제로 산술입니다. 우표 문제와 관련하여 사용됩니다.
Théophile

답변:


13

APL, 7

APL에서 인덱스 0 또는 인덱스 1로 작업 할 것인지 선택할 수 있습니다. 전역 변수 ⎕IO ← 0을 설정하여이를 수행합니다.

인덱스 0에서 작동하도록 선택하면 다음이 있습니다.

+\3⌊1⌈⍳

설명:

⍳    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에서 사용해보십시오


1 기반 인덱스로 작업 한 다음 1 대 n 배열을 만들고 다른 1 앞에 추가 할 수 없습니까? 그렇게 할 수 있다면 더 짧습니까?
Optimizer

내가 얻은 코드는 더 길었습니다. 이것은 색인 1, 10 문자에 대한 내 코드입니다.
Moris Zucca

아 그래 APL은 정말 여기를 통해 빛났다.
Optimizer

9

하스켈- 11 21

게으른 무한 시퀀스

1:2:[4,7..]

제공된 멤버 수만 반환하는 함수 (한숨)

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

당신은 입력을 받아 첫 번째 인쇄 할 n수 있습니다.
Optimizer

4
@Optimizer 기술적으로 , " Stöhr 시퀀스 의 첫 n 개 요소를 생성" 해야 합니다. 나머지 요소도 생성 할 수는 없습니다. 입력을 받아야한다고 말하는 것은 아닙니다. 동성 연애자의 원래 코드는 실제로 처음 생성하지 n 개의 어떤을 위해, 용어를 N .
wchargin

1
@WChargin이 지나치게 똑똑해 지려고하는 것은 새로운 것이 아닙니다. OP의 문구를 문자 그대로 사용하고 필요한 것보다 추가 출력을 생성하는 것은 표준 허점으로 간주됩니다.
Optimizer

2
@Optimizer 실제로 게으르다는 것은 요청하기 전에는 추가 출력이 생성되지 않음을 의미하며 원하는 용어를 요청할 수 있습니다 .
swish

1
@swish 이해가 안됩니다. 게으른 무엇입니까?
Optimizer

7

파이썬 2, 37 35 바이트

lambda n:[1,2][:n]+range(4,n*3-4,3)

패턴을 사용하는 중 ...


1
4범위에 포함 할 수 있습니다 :lambda n:[1,2][:n]+range(4,n*3-4,3)
Jakube

좋은 발견. 지금 35로 수정되었습니다.
논리 기사

6

CJam, 14 바이트

1l~{_p_3e<+}*;

여기에서 테스트하십시오.

1부터 시작합니다. 그런 다음 S [n] = S [n-1] + min (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.";

32 h -1로 바꾸면 h- Stöhr 시퀀스를 쉽게 일반화 할 수 있습니다 .


6

Brainfuck, 13 자

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

또는 n 개의 출력으로 제한하려면 30자를 사용하십시오.

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

1
n무한한 스트림이 아닌 첫 번째 요소 를 인쇄해야한다고 생각 합니다.
Sp3000

@ Sp3000 문자 코드를 숫자 입력 및 출력으로 사용합니까? 메타에서 찾을 수 없습니다. 이를 통해 BF 코드를 수정하는 것은 매우 쉽습니다.
randomra

개인적으로 나는 이것에 대한 일반적인 합의가 무엇인지 잘 모르겠습니다. 죄송합니다. 나는 이것에도 약간의 문제가 있었다.
Sp3000

첫 번째 n 요소의 경우, 내가 할 수 있다고 생각합니다-> +. <[-> +. <[-> ++. <[-> +++. <]]] (29 자),하지만 우아하지 않습니다 . 그리고 언어가 입력 및 출력에 ASCII 코드를 사용하는 것으로 특별히 제한되지 않는다고 생각합니다.
jgosar

1
우아하지 않더라도 코드 질문에 대답 해야 합니다. 게시물을 수정하고에 대한 답변을 수정하는 것이 좋습니다 ,->+.<[->+.<[->++.<[->+++.<]]]. (처음에 입력 쉼표를 놓쳤습니다.)
randomra

4

파이썬, 136 바이트

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])]

정의에서 바로. 골프를 얼마나 할 수 있는지 잘 모르겠습니다. 예상보다 훨씬 길었습니다.


3

J, 14 자

이것은 단지 [1,2, 4+3*k (k=0..n-1) ]시퀀스를 하드 코딩 하고 첫 번째를 취합니다 N.

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

.

J, 18 자

이것은 [0,1,2,3...], [1,1,0,0...]및 의 선형 조합을 사용합니다 [0,1,1,1...]. 짧아야하지만 골프를 칠 수는 없습니다.

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

3

전주곡 , 32 20

편집 : ... 지금 두 배의 목소리로!

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

이것은 파이썬 인터프리터를 로 가정합니다 NUMERIC_OUTPUT = True. Brainfuck 제출과 마찬가지로이 답변은 입력이 코드 포인트의 형태로 제공되는 것으로 가정합니다. 이것은 부분적 으로이 메타 토론에 더 많은 관심을 끌기위한 것입니다 (일부는 Prelude를 좋아하기 때문에). 따라서 처음 32 개의 숫자를 인쇄하려면 STDIN에 공백을 두어야합니다. 물론 이것은 유효한 입력에 대한 상한이 있음을 의미하지만이 대답은 어쨌든 승리하지 못하므로 Prelude의 한계 내에서 이것이 좋습니다.

설명

Prelude에서 모든 라인은 병렬로 실행되며,이 라인은 자체 스택을 가지고 무한한 양의 0으로 초기화됩니다. 하나의 명령 포인터 (열을 가리킴) 만 있으므로 한 음색에 루프를 입력하면 다른 모든 음색도 함께 반복됩니다.

다음에서는 열 대신 행에 주석을 달 수 있도록 코드를 전치했습니다.

?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

자바 스크립트 (ES6) 92

문제 정의에 기반한 재귀 함수

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

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

참고 사항 : h-Stöhr 시퀀스 찾기 ( h단지 2가 아닌 최대 숫자 의 합계 확인 ). 이 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

언 볼프 드와 거의 동일 (및 ES5 호환 가능)

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 콘솔에서 테스트하십시오 . 간단한 기능 :

S(20)

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

고급 기능 :

S(10,5)

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


2

> <> (물고기) , 72 65 49 46 자

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

인터프리터에 입력이 제공됩니다.

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

나의 첫 번째> <> 프로그램, 제안에 감사드립니다.


오 좋네! 누군가가 <> 프로그램을 작성하기를 바랐습니다.
Théophile

2

> <>, 31 바이트

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

단일 문자로 읽고 코드 포인트 (예 : space = 32)를 사용하고 각 줄에 하나씩 숫자를 인쇄합니다.


2

Perl6 22/30

Perl6가 시퀀스를 추론 할 수 있는지 살펴 보겠습니다.

이를 위해 Perl6에 내장 된 REPL을 사용했습니다.

$ 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 ...

흠, 나는 펄이 추론 한 패턴을 본다. 4 다음에 다음 값을 얻으려면 3을 추가하십시오.

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

이는 한 문자를 저장하여 13 자 길이의 Stöhr 시퀀스에서 무한한 숫자 목록을 가져옵니다.

이 코드 는 결과 의 요지 를 인쇄하기 때문에 REPL에서 유용한 기능 만 수행합니다 . 달리 인쇄하려면 결과를 인쇄하도록 Perl에 명시 적으로 지시해야합니다.

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

( * + 3단순히 인수에 추가 된 3을 반환하는 코드 참조를 얻는 방법입니다. 다른 방법은 { $_ + 3 }, 또는 -> $i { $i + 3 }, { $^i + 3 }또는 sub ($i){ $i + 3 })입니다.


처음 n 개의 요소 를 생성 하기 위해 Callable 을 생성하는 가장 짧은 방법 은 요소의 슬라이스를 얻는 것입니다.

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

빈 공간에서 첫 번째 $_값을 생성하면 즉시 버립니다.

void 컨텍스트 이외의 것에서는 하나의 인수를 취하는 익명 코드 블록 (name이없는 기본 서브 루틴)을 만듭니다.

# 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;

이 챌린지에 유효한 자격을 갖추려면 이름이 있어야한다고 생각한다면 다음과 같이하십시오.

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

s대체 연산자에도 사용 되기는하지만 이를 호출하는 것은 선택적이지 않습니다. (당신은 내가 생각하는 다른 이름을 줄 수 있습니다)

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

챌린지에 달리 명시되지 않는 한, 코드 골프 챌린지 제출 은 스 니펫뿐만 아니라 전체 프로그램 또는 기능이어야 합니다.
Martin Ender

@ MartinBüttner는 공정해야 1,2,4,*+3...*실제로 필요한 값을 생성하는 객체를 만듭니다. 나는 많은 사람들이 실제로 Perl6에서 이와 같은 것을 중심으로 Callable 무언가를 만들 것이라고 생각하지 않습니다 .
Brad Gilbert b2gills

2

나는 이미 훨씬 더 나은 자바 답변이 있지만 이것에 잠시 시간을 보냈고 게시 할 것입니다. 빨려도

Java 313 자 (화면에 맞추려면 +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);}}}

개선하는 방법에 대한 팁이나 조언을 항상 감사합니다


1

T-SQL 204

입력이 @N이라는 변수에 있다고 가정합니다. 원하는 경우 절차를 만들 수 있지만 실제로 T-SQL에서 STD_IN을 얻는 좋은 방법은 없습니다.

또한, 도덕적 보너스를 원하십시오!

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 @

좋은! SQL에 대해 잘 모릅니다. @N은 어떻게 사용됩니까? 처음에 설정되었지만 나중에 참조되지 않는 것 같습니다.
Théophile

@N"for 루프"의 "i"인 것 같습니다 .
Jacob

야곱이 옳습니다. @N은 for 루프의 "i"이며 SQL의 while 루프입니다. 본질적으로 테이블을 자체적으로 조인하고 @Q에 추가되는 쌍을 찾습니다. 최소한 두 쌍 이상 (즉, 숫자 만있는 것이 아닌)이 있으면 생략합니다. 그렇지 않으면 테이블에 추가합니다. @는 테이블의 이름입니다.
bmarks

1

Mathematica, 27 바이트

흠, 여전히 Mathematica 답변이 없습니까? 다음은 두 가지입니다.

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

둘 다 정수를 수신하고 정수 목록을 리턴하는 명명되지 않은 순수 함수를 정의합니다. 이것은 CJam 제출과 동일한 재발 관계를 기반으로합니다. 점을 유의 Array기반 코드에서 시작 1/2값이 반환되기 전에 점화식이 항상 적용되기 때문에.



1

파이썬-닫히지도 않음 (139)

다른 사람들처럼 쉽게 계산할 수 없다는 가정하에 내가 찾은 가장 짧은 해결책은 다음과 같습니다.

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]))))

골프 용 버전 :

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

공유하고 즐기십시오.


1

루비 -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}

이것은 시퀀스의 정의를 사용합니다.

더 읽기 쉬운 버전 :

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
}

인쇄 q [10]

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


루비 골프 팁 : *k=1대신 k=[1]. foo while bar대신에 while bar;foo;end. [*s..e]대신에 (s..e).to_a. .map대신에 to_a.map. {|a,b|a+b}대신에 {|i|i.inject(:+)}.
histocrat

@histocrat 감사합니다, 매우 도움이됩니다!
Théophile

0

스타 타 51

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

0

TI-BASIC, 41 27 30 바이트

계산기

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

0

GML , 67 바이트

n=argument0;for(i=1;i<=n;i++){t=i;if i>2t=(i-2)*3+1show_message(t)}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.