สร้างลำดับStöhr


12

ฉันกำลังเรียนรู้ทับทิมและเขียนรหัสที่ไม่น่าสนใจครั้งแรกของฉันเพื่อแก้ปัญหานี้

ความท้าทายคือการสร้างองค์ประกอบแรกnของลำดับStöhr , Sซึ่งกำหนดไว้ดังนี้

S [0] = 1

S [n] เป็นจำนวนที่น้อยที่สุดที่ไม่สามารถแสดงเป็นผลรวมขององค์ประกอบก่อนหน้านี้สองที่แตกต่างกันในลำดับ

ดังนั้นลำดับเริ่มต้นด้วย 1, 2, 4, 7 และ 10 องค์ประกอบถัดไปคือ 13 เพราะ 11 (= 1 + 10) และ 12 (= 2 + 10) เป็นผลรวมขององค์ประกอบก่อนหน้า แต่ 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 อีกหรือไม่ ถ้าสามารถทำได้มันสั้นลงไหม?
เครื่องมือเพิ่มประสิทธิภาพ

รหัสที่ฉันได้รับนั้นยาวกว่า นี่คือรหัสของฉันสำหรับดัชนี 1, 10 ตัวอักษร: + \ 3⌊1, ⍳¯1 + นอกจากนี้รุ่นดัชนี -0 ยังทำงานกับอาร์กิวเมนต์ 0 ด้วยในขณะที่อันนี้ไม่ได้
Moris Zucca

อา. ใช่แล้ว APL ฉายแสงผ่านที่นี่จริงๆ ..
เครื่องมือเพิ่มประสิทธิภาพ

9

Haskell - 11 21

Lazy ลำดับที่ไม่มีที่สิ้นสุด

1:2:[4,7..]

ฟังก์ชั่นที่ส่งกลับจำนวนสมาชิกที่ให้มา (ถอนหายใจ)

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

คุณต้องป้อนข้อมูลและพิมพ์เฉพาะnตัวเลขแรก
เครื่องมือเพิ่มประสิทธิภาพ

4
@Optimizer ดีในทางเทคนิคคุณมีการ "สร้างคนแรกที่nองค์ประกอบของลำดับ STOHR" -IT ไม่ได้บอกว่าคุณไม่สามารถสร้างส่วนที่เหลือของพวกเขาเช่นกัน! ไม่ได้บอกว่าคุณต้องป้อนข้อมูลด้วยเช่นกัน หวดรหัสต้นฉบับจริงไม่สร้างครั้งแรกnข้อตกลงสำหรับการใด ๆn
wchargin

1
@WChargin พยายามเป็น oversmart ไม่ใช่เรื่องใหม่ การใช้ถ้อยคำของ OP อย่างแท้จริงและสร้างผลผลิตเพิ่มเติมเกินความจำเป็นทั้งสองถือว่าเป็นช่องโหว่มาตรฐาน
เครื่องมือเพิ่มประสิทธิภาพ

2
@Optimizer ที่จริงแล้วการขี้เกียจหมายความว่าจะไม่มีการสร้างเอาต์พุตพิเศษจนกว่าคุณจะขอมันและคุณสามารถถามเงื่อนไขใด ๆ ที่คุณต้องการ
หวด

1
@ หวังว่าฉันไม่เข้าใจ ที่นี่ขี้เกียจอะไร
เครื่องมือเพิ่มประสิทธิภาพ


6

CJam, 14 ไบต์

1l~{_p_3e<+}*;

ทดสอบที่นี่

เริ่มต้นที่ 1 จากนั้นS [N] = S [n-1] + นาที (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.";

generalises นี้ได้อย่างง่ายดายเพื่อชมลำดับ-Stöhrถ้าเราแทนที่3โดย2 ชั่วโมง -1


6

Brainfuck, 13 ตัวอักษร

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

หรือ 30 ตัวอักษรหากเราต้องการ จำกัด ไว้ที่ n เอาท์พุท:

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

1
ฉันคิดว่าคุณต้องพิมพ์nองค์ประกอบแรกไม่ใช่สตรีมที่ไม่มีที่สิ้นสุดของมัน ...
Sp3000

@ Sp3000 ใช้ charcodes เป็นอินพุตและเอาต์พุตที่เป็นตัวเลขซึ่งเป็นที่ยอมรับโดยทั่วไปหรือไม่? ไม่พบเมตา เนื่องจากว่ามันจะค่อนข้างง่ายต่อการแก้ไขรหัส BF
Randomra

โดยส่วนตัวฉันไม่แน่ใจว่าสิ่งที่ฉันทามติทั่วไปสำหรับเรื่องนี้ขอโทษ ฉันมีปัญหาเล็กน้อยกับเรื่องนี้เช่นกัน
Sp3000

สำหรับองค์ประกอบแรกที่ฉันคิดว่าฉันสามารถทำได้ -> +. <[-> +. <[-> ++. <[-> +++. <]]] (29 ตัวอักษร) แต่นั่นไม่ได้สง่างาม . และฉันไม่คิดว่าภาษานั้น จำกัด เฉพาะการใช้รหัส ASCII สำหรับอินพุตและเอาต์พุต
jgosar

1
รหัสของคุณต้องตอบคำถามแม้ว่ามันจะไม่สวยงาม ,->+.<[->+.<[->++.<[->+++.<]]]ผมจะแนะนำในการแก้ไขการโพสต์และแก้ไขคำตอบ (คุณพลาดการป้อนข้อมูลที่อ่านจุลภาคที่จุดเริ่มต้น.)
randomra

4

Python ขนาด 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 ตัวอักษร

เพียงแค่นี้ก็ hardcodes ลำดับและใช้เวลาแรก[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 คำตอบนี้อนุมานว่าการป้อนข้อมูลจะได้รับในรูปแบบของจุดรหัส นี่เป็นส่วนหนึ่งที่จะได้รับความสนใจมากขึ้นสำหรับการสนทนาเมตานี้ (และอีกส่วนหนึ่งเพราะฉันรักพรีลูด) ดังนั้นหากคุณต้องการพิมพ์ตัวเลข 32 ตัวแรกคุณต้องใส่ช่องว่างใน STDIN แน่นอนนี่หมายความว่ามีข้อ จำกัด สูงสุดสำหรับอินพุตที่ถูกต้อง แต่คำตอบนี้ยังไม่ชนะดังนั้นฉันคิดว่าภายในข้อ จำกัด ของ Prelude นี่ใช้ได้

คำอธิบาย

ในโหมโรงบรรทัดทั้งหมดจะถูกดำเนินการในแบบคู่ขนานซึ่งบรรทัดที่มีสแต็กของตัวเองเริ่มต้นเป็นศูนย์จำนวน มีเพียงตัวชี้คำสั่งเดียว (ชี้ไปที่คอลัมน์) ดังนั้นหากคุณป้อนลูปในหนึ่งเสียงเสียงอื่น ๆ ทั้งหมดจะวนซ้ำไปพร้อมกัน

ในรายการต่อไปนี้ฉันได้แปลงรหัสเพื่อให้ฉันสามารถใส่คำอธิบายประกอบบรรทัดแทนคอลัมน์:

?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

เป็นฟังก์ชั่นวนซ้ำตามนิยามปัญหา

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ฟังก์ชั่นพยายามเงินก้อน possibile ทั้งหมดถึงจำนวนที่กำหนดขององค์ประกอบของรายการ

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เทียบเท่าประมาณ (และรองรับ 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 สามารถอนุมานลำดับสำหรับฉัน

เมื่อต้องการทำเช่นนั้นฉันใช้ REPL ที่สร้างขึ้นใน Perl6

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

อืมฉันเห็นรูปแบบที่ Perl อนุมาน หลังจาก 4 เพื่อให้ได้ค่าถัดไปคุณก็บวก 3

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

ซึ่งจะช่วยให้ตัวละครตัวหนึ่งสร้างรหัสเพื่อรับรายการที่ไม่มีที่สิ้นสุดของตัวเลขในลำดับStöhr 13 ตัวอักษร

รหัสนี้ทำสิ่งที่มีประโยชน์ใน REPL เท่านั้นเนื่องจากจะพิมพ์ส่วนสำคัญของผลลัพธ์สำหรับเรา เพื่อให้มันพิมพ์มิฉะนั้นคุณจะต้องบอก Perl อย่างชัดเจนเพื่อพิมพ์ผลลัพธ์

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

( * + 3เป็นเพียงวิธีหนึ่งในการรับการอ้างอิงโค้ดซึ่งส่งคืน 3 ที่เพิ่มเข้ากับอาร์กิวเมนต์เท่านั้นวิธีอื่น ๆ ในการเขียนจะเป็น{ $_ + 3 }หรือ-> $i { $i + 3 }หรือ{ $^i + 3 }หรือsub ($i){ $i + 3 })


วิธีที่สั้นที่สุดในการสร้างบางสิ่งบางอย่างCallableเพื่อสร้างองค์ประกอบแรกที่nคือการได้รับชิ้นส่วน

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

ในบริบทที่เป็นโมฆะที่จะสร้าง$_ค่าแรกจากนั้นให้โยนทิ้งทันที

ในสิ่งอื่นที่ไม่ใช่โมฆะบริบทมันสร้างบล็อกรหัสที่ไม่ระบุชื่อ (รูทีนย่อยพื้นฐานโดยไม่มีชื่อ) ซึ่งใช้เวลาหนึ่งอาร์กิวเมนต์

# 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ถูกใช้สำหรับโอเปอเรเตอร์การทดแทนการเรียกสิ่งนี้ว่า parens ไม่ใช่ทางเลือก (คุณอาจตั้งชื่ออื่นให้ฉันได้)

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

ยกเว้นที่ระบุไว้เป็นอย่างอื่นในความท้าทายที่ส่งผลต่อความท้าทายรหัสกอล์ฟจะต้องมีโปรแกรมเต็มหรือฟังก์ชั่นไม่ได้เป็นเพียงเกร็ดเล็กเกร็ดน้อย
Martin Ender

@ MartinBüttnerให้ความเป็นธรรม1,2,4,*+3...*สร้างวัตถุที่จะสร้างค่าที่ต้องการ ฉันไม่คิดว่าหลาย ๆ คนจะสร้างสิ่งที่เรียกได้ว่าเป็นสิ่งที่เรียกได้ใน Perl6
แบรดกิลเบิร์ต 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 ฉันสามารถทำขั้นตอนได้หากคุณต้องการ แต่ไม่มีวิธีที่ดีในการรับ STD_IN ใน T-SQL

นอกจากนี้ใช่สำหรับโบนัสคุณธรรม!

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 มากเพียงใด - @ มีการใช้ที่นี่อย่างไร ฉันเห็นว่ามันใกล้จะถึงจุดเริ่มต้นแล้ว แต่ดูเหมือนจะไม่ถูกอ้างอิงในภายหลัง
Théophile

ดูเหมือนว่า@N"i" ของ "for loop"
จาค็อบ

จาค็อบถูกต้อง @N คือ "i" ของ for for loop ซึ่งเป็น while loop ใน SQL เป็นหลักมันข้ามเข้าร่วมตารางด้วยตัวเองและหาคู่ที่เพิ่มไปยัง @Q หากมีอย่างน้อยสองคู่ (เช่นไม่ใช่ตัวเลขด้วยตัวเอง) จากนั้นจะข้ามมัน มิฉะนั้นจะเพิ่มลงในตาราง @ คือชื่อของตาราง
bmarks

1

Mathematica ขนาด 27 ไบต์

อืมยังไม่มีคำตอบจาก Mathematica เหรอ? นี่คือสอง:

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

ทั้งสองกำหนดฟังก์ชันบริสุทธิ์ที่ไม่มีชื่อซึ่งได้รับจำนวนเต็มและส่งกลับรายการจำนวนเต็ม สิ่งนี้ขึ้นอยู่กับความสัมพันธ์ที่เกิดซ้ำเช่นเดียวกับการส่ง CJam ของฉัน โปรดทราบว่าArrayรหัส -based เริ่มต้น1/2เนื่องจากความสัมพันธ์ที่เกิดซ้ำจะใช้เสมอก่อนที่จะส่งคืนค่า



1

Python - ไม่ปิด (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 barwhile bar;foo;end[*s..e](s..e).to_a.mapto_a.map{|a,b|a+b}{|i|i.inject(:+)}
ชำนาญวิชาประวัติศาสตร์

@histocrat ขอบคุณมันมีประโยชน์มาก!
Théophile


0

TI-BASIC, 41 27 30 ไบต์

สำหรับเครื่องคิดเลขของคุณ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.