เรียงตามการคูณ


34

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

ตัวอย่างเช่นถ้าอินพุตเป็น

5 4 12 1 3

การคูณจะเป็น

5*1=5 4*2=8 12*1=12 1*13=13 3*5=15

และผลลัพธ์จะเป็นรายการที่เพิ่มขึ้น

5 8 12 13 15

อินพุต

  • รายการจำนวนเต็มบวกที่มีองค์ประกอบอย่างน้อย 1 ตัว

เอาท์พุต

  • รายการของจำนวนเต็มบวก

ตัวอย่าง

9 => 9
1 2 => 1 2
2 1 => 2 3
7 3 => 7 9
1 1 1 1 => 1 2 3 4
5 4 12 1 3 => 5 8 12 13 15
3 3 3 8 16 => 3 6 9 16 32
6 5 4 3 2 1 => 6 10 12 15 16 17
9 4 6 6 5 78 12 88 => 9 12 18 24 25 78 84 88
8 9 41 5 12 3 5 6 => 8 9 41 45 48 51 55 60
15 8 12 47 22 15 4 66 72 15 3 4 => 15 16 24 47 66 75 76 132 144 150 153 156

นี่คือรหัสกอล์ฟเพื่อให้โปรแกรมหรือฟังก์ชันที่สั้นที่สุดชนะ

สนุกจริง: องค์ประกอบสุดท้ายของการส่งออกสำหรับการป้อนข้อมูลที่N, N-1, ... ,1น่าจะเป็น(N+1)thองค์ประกอบของลำดับA007952 หากคุณพบหลักฐานคุณยินดีที่จะรวมไว้ในคำตอบกอล์ฟของคุณหรือโพสต์ไว้เป็นความคิดเห็น


มีใครทำให้พื้นดินในการพิสูจน์ว่ายัง?
Connor Clark

คำตอบ:


20

เยลลี่ , 6 5 ไบต์

:‘×µ\

คำตอบแรกของ Jelly ก่อน @Dennis ตื่นขึ้นมา ลองออนไลน์!

คำอธิบาย

:          Integer division, m//n
 ‘         Increment, (m//n+1)
  ×        Multiply, (m//n+1)*n
   µ       Turn the previous links into a new monadic chain
    \      Accumulate on the array

ขอบคุณ @Dennis สำหรับ -1 ไบต์


4
:‘×µ\บันทึกเป็นไบต์
เดนนิส

20
@Dennis Oh อึเขาตื่นขึ้นมา
Dennis van Gils

9

JavaScript (ES6), 28

แก้ไขตามที่แนะนำโดย @Patrick Roberts pสามารถเป็นพารามิเตอร์ที่ไม่มีการกำหนดค่าเริ่มต้น จำนวนไบต์เดียวกัน แต่หลีกเลี่ยงการใช้ตัวแปรโกลบอล

(a,p)=>a.map(n=>p=n*-~(p/n))

ทดสอบ

f=(a,p)=>a.map(n=>p=n*-~(p/n))

console.log=x=>O.textContent+=x+'\n'

;[
[[9], [ 9]],
[[1, 2], [ 1, 2]],
[[2, 1], [ 2, 3]],
[[7, 3], [ 7, 9]],
[[1, 1, 1, 1], [ 1, 2, 3, 4]],
[[5, 4, 12, 1, 3], [ 5, 8, 12, 13, 15]],
[[3, 3, 3, 8, 16], [ 3, 6, 9, 16, 32]],
[[6, 5, 4, 3, 2, 1], [ 6, 10, 12, 15, 16, 17]],
[[9, 4, 6, 6, 5, 78, 12, 88], [ 9, 12, 18, 24, 25, 78, 84, 88]],
[[8, 9, 41, 5, 12, 3, 5, 6], [ 8, 9, 41, 45, 48, 51, 55, 60]],
[[15, 8, 12, 47, 22, 15, 4, 66, 72, 15, 3, 4], [ 15, 16, 24, 47, 66, 75, 76, 132, 144, 150, 153, 156]]
].forEach(t=>{
  var i=t[0],k=t[1],r=f(i),ok=(k+'')==(r+'')
  console.log(i + ' => ' + r + (ok?' OK':'FAIL expecting '+x))
})
<pre id=O></pre>


ฉันคิดว่าคุณสามารถบันทึกไม่กี่ไบต์โดยใช้แบบโมดูโลเช่นเดียวกับฉันได้ในคำตอบของฉัน
aross

คุณไม่สามารถข้าม p = 0 ได้ไหม คุณจำเป็นต้องใช้เพื่อเรียกใช้หลายรายการในหลายรายการ แต่คำถามนี้มีไว้สำหรับรายการเดียว
Charlie Wynn

1
@CharlieWynn หากคุณไม่เริ่มต้นตัวแปรคุณจะได้รับข้อผิดพลาดสำหรับตัวแปรที่ไม่ได้กำหนด หากบังเอิญมีตัวแปรอยู่แล้ว (ซึ่งอาจเกิดขึ้นได้ง่ายในสภาพแวดล้อมของเว็บเพจ) อาจมีค่าผิดพลาด
edc65

@ edc65 นั่นเอง p ถูกกำหนดไว้แล้วในหน้านี้!
Charlie Wynn

1
@PatrickRoberts คิดอีกครั้งฉันยังคงสามารถหลีกเลี่ยง f=a=>a.map(n=>a+=n-a%n,a=0)Globals: แต่มันไม่ใช่อัลกอริธึมของฉัน (ทำให้ฉันโง่) ดังนั้นฉันจะเก็บของฉันไว้เหมือนเดิมและ
กำจัด

6

Python 2, 67 64 ไบต์

ลองเล่นโค้ดโค๊ดเป็นครั้งแรก

def m(l):
 for x in range(1,len(l)):l[x]*=l[x-1]/l[x]+1
 print l

สวัสดีฉันคิดว่าคุณจะนับจำนวนบรรทัดที่ส่งคืนเป็น 2 ไบต์แต่ละรายการ (โดยใช้ Windows?) แต่ในเว็บไซต์นี้คุณนับการส่งคืนแต่ละบรรทัดเป็นไบต์เดียว ดังนั้นคะแนนของคุณคือ 65 ไบต์ (คุณสามารถคัดลอกและวางรหัสของคุณลงในmothereff.in/byte-counterหากคุณไม่แน่ใจ) นอกจากนี้คุณสามารถทำprint lแทนreturn lการบันทึกไบต์อื่นได้ งานที่ดี!
mathmandan

ขอบคุณฉันไม่รู้เกี่ยวกับการคืนสาย นั่นอธิบายว่าทำไมฉันมีจำนวนไบต์ที่แตกต่างกันเสมอ และฉันไม่ได้พิจารณาด้วยว่าการพิมพ์นั้นเพียงพอและไม่จำเป็นต้องส่งคืนรายการ
Taronyu

ไม่มีปัญหา! BTW เนื่องจากคุณบอกว่า "เคล็ดลับที่จะชื่นชม" คุณอาจจะสนใจในการเรียกดูผ่านcodegolf.stackexchange.com/questions/54/... สนุก!
mathmandan

5

PHP, 55 46 42 41 ไบต์

ใช้การเข้ารหัส ISO 8859-1

for(;$a=$argv[++$i];)echo$l+=$a-$l%$a,~ß;

ทำงานแบบนี้ ( -dเพิ่มเพื่อความสวยงามเท่านั้น):

php -d error_reporting=30709 -r 'for(;$a=$argv[++$i];)echo$l+=$a-$l%$a,~ß;' 10 10 8
  • บันทึก 1 ไบต์ขอบคุณ Ismael Miguel
  • บันทึก 8 ไบต์โดยใช้โมดูโลแทนพื้น
  • บันทึก 4 ไบต์ขอบคุณไปยัง Ismael Miguel (แทน foreach)
  • บันทึกไบต์โดยใช้เพื่อให้มีช่องว่าง

ผมคิดว่าคุณสามารถแทนที่ด้วย$a+0 +$aนอกจากนี้คุณยังสามารถสรุปได้ว่าการป้อนข้อมูลที่ไม่เคยจะมี0เพื่อให้คุณสามารถแทนที่ของคุณมีเพียงแค่$a+0&&print +$a&printในความเป็นจริงคุณยังสามารถทำ$a&printตั้งแต่ใน "0" == 0 == 0.0 == falsePHP แต่มันอาจไม่จำเป็นถ้าคุณใช้อันนึงechoฉันคิดว่า
Ismael Miguel

ไบนารีandจะไม่ทำงาน (ตรงข้ามกับตรรกะ) และจะไม่ทำงานในลักษณะนี้ เนื่องจากฉันกำลังรับข้อมูลจาก CLI ข้อแรกคือ-ฉันต้องการจับแทนที่จะพิมพ์เลขศูนย์ ลองphp -r 'print_r($argv);' fooดู บันทึก 1 ไบต์พร้อมกับข้อเสนอแนะแรกของคุณขอบคุณ
aross

1
แล้วไงfor(;$a=$argv[++$i];)echo$l+=$a-$l%$a,' ';ล่ะ มีความยาว 42 ไบต์และข้ามองค์ประกอบแรก
Ismael Miguel

Nice one, ขอบคุณ @IsmaelMiguel
aross

ไม่เป็นไร หากคุณต้องการที่จะประหลาดจริง ๆ คุณสามารถแทนที่ช่องว่างด้วยa^Aแต่นั่นจะรั่วไหลมากเกินไปคำเตือน (คำเตือนจะไม่สนใจ) มันจะไม่เปลี่ยน bytecount แต่อย่างใด
Ismael Miguel

4

แฮสเคลล์ (30 28 25 ไบต์)

scanl1(\x y->y*div x y+y)

รุ่นขยาย

f :: Integral n => [n] -> [n]
f xs = scanl1 increaseOnDemand xs
 where
   increaseOnDemand :: Integral n => n -> n -> n
   increaseOnDemand acc next = next * (1 + acc `div` next)

คำอธิบาย

scanl1ช่วยให้คุณสามารถพับรายการและสะสมค่ากลางทั้งหมดลงในรายการอื่น มันเป็นความเชี่ยวชาญของscanlซึ่งมีประเภทต่อไปนี้:

scanl  :: (acc  -> elem -> acc)  -> acc -> [elem] -> [acc]
scanl1 :: (elem -> elem -> elem) ->        [elem] -> [elem]

scanl1 f (x:xs) = scanl f x xs

ดังนั้นสิ่งที่เราต้องการคือฟังก์ชั่นที่เหมาะสมซึ่งใช้สององค์ประกอบสุดท้ายของรายการของเรา ( accในเวอร์ชันขยาย) และอีกหนึ่งองค์ประกอบที่เราต้องการประมวลผล ( nextในเวอร์ชันขยาย) และส่งคืนหมายเลขที่เหมาะสม

เราสามารถหาจำนวนนี้ได้ง่าย ๆ โดยการหารตัวสะสมผ่านตัวถัดไปและทำการปูพื้นผลลัพธ์ divดูแลสิ่งนั้น หลังจากนั้นเราก็ต้องเพิ่ม1เพื่อให้แน่ใจว่ารายการจะเพิ่มขึ้นจริง (และเราไม่ได้ท้ายด้วย0)


ไม่จำเป็นต้องตั้งชื่อฟังก์ชั่นของคุณ นอกจากนี้คุณยังสามารถแทนที่( ... )ด้วย$ ...และฉันคิดว่าคุณนับบรรทัดใหม่สุดท้ายซึ่งสามารถตัดออกได้: scanl1$\x y->y*div x y+y, 24 ไบต์
nimi

@nimi: จริงเหรอ? มีการนับจำนวนนิพจน์หรือไม่ ที่ถูกกล่าวว่าฉันไม่ได้บันทึกไบต์ใด ๆ กับ(...)vs $ตั้งแต่$\ ได้รับการแยกวิเคราะห์เป็นตัวดำเนินการและฉันจะต้องมีพื้นที่เดียวหลังจาก$นั้น
Zeta

ฟังก์ชั่นที่ไม่มีชื่อได้รับอนุญาตโดยค่าเริ่มต้นและscanl1(...)เป็นฟังก์ชั่นที่ไม่มีชื่อ เกี่ยว$กับ vs. (): คุณพูดถูกผิด
nimi

4

C ++ 63 60 57 ไบต์

void s(int*f,int*e){for(int c=*f;++f!=e;c=*f+=c/ *f**f);}

ธิ inplace [first, last)รับช่วง แต่เดิมเขียนเป็นชุดตัวเลือกเทมเพลต แต่นั่นก็ยาวกว่า:

template<class T>void s(T f,T e){for(auto c=*f;++f!=e;c=*f+=c/ *f**f);}

รุ่นขยาย

template <class ForwardIterator>
void sort(ForwardIterator first, ForwardIterator last){
    auto previous = *first;

    for(++first; first != last; ++first){
        auto & current = *first;
        current += current * (current / previous);
        previous = current;
    }
}

3

CJam, 13 ไบต์

q~{\_p1$/)*}*

ป้อนข้อมูลเป็นรายการสไตล์ CJam เอาต์พุตถูกแยก linefeed

ทดสอบที่นี่

คำอธิบาย

q~    e# Read and evaluate input.
{     e# Fold this block over the list (i.e. "foreach except first")...
  \   e#   Swap with previous value.
  _p  e#   Duplicate and print previous value.
  1$  e#   Copy current value.
  /   e#   Integer division.
  )*  e#   Increment and multiply current value by the result.
}*

ค่าสุดท้ายจะถูกทิ้งไว้บนสแต็กและพิมพ์โดยอัตโนมัติในตอนท้าย


3

มาติกา 36 32 ไบต์

 #2(Floor[#1/#2]+1)&~FoldList~#&

ทดสอบ

#2(Floor[#1/#2]+1)&~FoldList~#& /@ {{5, 4, 12, 1, 3}, 
   {15, 8, 12, 47, 22, 15, 4, 66, 72, 15, 3, 4}}
(* {{5, 8, 12, 13, 15}, {15, 16, 24, 47, 66, 75, 76, 132, 144, 
  150, 153, 156}} *)

3

Perl, 17 + 3 = 20 ไบต์

$p=$_*=$==1+$p/$_

ต้องใช้-pและตั้ง-lค่าสถานะ:

$ perl -ple'$p=$_*=$==1+$p/$_' <<< $'15\n8\n12\n47\n22\n15\n4\n66\n72\n15\n3\n4'
15
16
24
47
66
75
76
132
144
150
153
156

คำอธิบาย:

# '-p' reads each line into $_ and auto print
# '-l' chomp off newline on input and also inserts a new line when printing
# When assigning a number to `$=` it will automatic be truncated to an integer
# * Added newlines for each assignment 
$p=
  $_*=
    $==
      1+$p/$_

3

Python (3.5), 63 62 ไบต์

def f(a):
 r=[0]
 for i in a:r+=i*(r[-1]//i+1),
 return r[1:]

ทดสอบ

>>> print('\n'.join([str(i)+' => '+str(f(i)) for i in [[9],[1,2],[2,1],[7,3],[1,1,1,1],[5,4,12,1,3],[3,3,3,8,16],[6,5,4,3,2,1],[9,4,6,6,5,78,12,88],[8,9,41,5,12,3,5,6],[15,8,12,47,22,15,4,66,72,15,3,4]]]))
[9] => [9]
[1, 2] => [1, 2]
[2, 1] => [2, 3]
[7, 3] => [7, 9]
[1, 1, 1, 1] => [1, 2, 3, 4]
[5, 4, 12, 1, 3] => [5, 8, 12, 13, 15]
[3, 3, 3, 8, 16] => [3, 6, 9, 16, 32]
[6, 5, 4, 3, 2, 1] => [6, 10, 12, 15, 16, 17]
[9, 4, 6, 6, 5, 78, 12, 88] => [9, 12, 18, 24, 25, 78, 84, 88]
[8, 9, 41, 5, 12, 3, 5, 6] => [8, 9, 41, 45, 48, 51, 55, 60]
[15, 8, 12, 47, 22, 15, 4, 66, 72, 15, 3, 4] => [15, 16, 24, 47, 66, 75, 76, 132, 144, 150, 153, 156]

วิธีแก้ไขก่อนหน้า

โซลูชันแบบเรียกซ้ำบางส่วน แต่ใหญ่กว่า

(68 bytes) f=lambda a,i=0:[i,*f(a[1:],a[0]*(i//a[0]+1))][i==0:]if a!=[]else[i]
(64 bytes) f=lambda a,i=0:a>[]and[i,*f(a[1:],a[0]*(i//a[0]+1))][i<1:]or[i]

นอกจากนี้r+=[…]คุณสามารถใช้r+=…,
Cyoce

@Cyoce ฉันทำการเปลี่ยนแปลง แต่เมื่อฉันกำหนดไว้r=[0]ในพารามิเตอร์เริ่มต้นrกลายเป็น nonlocal
Erwan

คุณถูกต้องฉันลืมว่า Python จัดการพารามิเตอร์เริ่มต้นได้อย่างไร เคล็ดลับอื่น ๆ ควรใช้งานได้
Cyoce

@Cyoce ใช่มันทำงานได้ดีขอบคุณสำหรับเคล็ดลับ
Erwan

3

Brachylogขนาด 12 ไบต์

{≤.;?%0∧}ᵐ<₁

การพยายามคูณตัวแปรแต่ละตัวด้วยตัวเลขแปลก ๆ พอจะเริ่มต้นที่พยายามคูณด้วย 2 และไม่ใช่ 0 หรือ 1 ซึ่งดูเหมือนว่าจะทำงานได้และเต้นได้ทั้ง Brachylog

คำอธิบาย

{       }ᵐ          --  Map each number
 ≤.                 --      to a number greater or equal to the original
  .;?%0             --      and a multiple of the original
       ∧            --      no more constraints
          <₁        --  so that the list is strictly increasing

ลองออนไลน์!


2

Brachylogขนาด 54 ไบต์

:_{h_.|[L:T],LhH,(T_,IH;0:$Ie*H=:T>I),Lb:I:1&:[I]rc.}.

คำอธิบาย

:_{...}.                § Call sub-predicate 1 with [Input, []] as input. Unify its output
                        § with the output of the main predicate


§ Sub-predicate 1

h_.                     § If the first element of the input is an empty list, unify the
                        § output with the empty list
|                       § Else
[L:T],LhH,              § Input = [L,T], first element of L is H
    (T_,IH              §     If T is the empty list, I = H
    ;                   §     Else
    0:$Ie*H=:T>I),      §     Enumerate integers between 0 and +inf, stop and unify the
                        §     enumerated integer with I only if I*H > T
Lb:I:1&                 § Call sub-predicate 1 with input [L minus its first element, I]
:[I]rc.                 § Unify the output of the sub-predicate with
                        § [I|Output of the recursive call]

2

Pyth, 11

t.u*Yh/NYQ0

ชุดทดสอบ

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


2

C, 79 ไบต์

p;main(x,v)char**v;{for(;*++v;printf("%d ",p=((x+p-1)/x+!(p%x))*x))x=atoi(*v);}

Ungolfed

p; /* previous value */

main(x,v) char**v;
{
    /* While arguments, print out x such that x[i] > x[i-1] */
    for(;*++v; printf("%d ", p = ((x+p-1)/x + !(p%x)) * x))
        x = atoi(*v);
}

จะไม่p=p/x*x+xทำงานเหรอ
Neil

@ Neil Yeah ที่จะทำงาน แน่นอน overthought นี้ :)
โคลคาเมรอน

2

PowerShell ขนาด 26 ไบต์

$args[0]|%{($l+=$_-$l%$_)}

จะเข้าเป็นอาร์เรย์อย่างชัดเจนเช่นผ่านทาง> .\sort-by-multiplying.ps1 @(6,5,4,3,2,1)$args[0]

จากนั้นเราสำหรับห่วงมากกว่านั้นด้วย|%{...}และแต่ละย้ำดำเนินมายากล ไม่นะล้อเล่นพวกเราใช้เล่ห์เหลี่ยมแบบเดียวกันกับคำตอบอื่น ๆ (อุปกรณ์ประกอบการ @aross เพราะฉันเห็นมันที่นั่นก่อน)

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

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\sort-by-multiplying.ps1 @(8,9,1,5,4)
8
9
10
15
16


1

05AB1E , 11 ไบต์

รหัส:

R`[=sŽDŠ/ò*

ลองออนไลน์!

คำอธิบาย:

R            # Reverse input
 `           # Flatten the list
  [          # While loop
   =         # Print the last item
    s        # Swap the last two items
     Ž       # If the stack is empty, break
      D      # Duplicate top of the stack
       Š     # Pop a,b,c and push c,a,b
        /    # Divide a / b
         ò   # Inclusive round up
          *  # Multiply the last two items

ใช้การเข้ารหัส CP-1252


1

Minkolang 0.15 , 17 ไบต์

nd1+?.z0c:1+*d$zN

ลองที่นี่!

คำอธิบาย

nd                   Take number from input and duplicate it
  1+                 Add 1
    ?.               Stop if top of stack is 0 (i.e., when n => -1 because input is empty).
      z              Push value from register
       0c            Copy first item on stack
         :           Pop b,a and push a//b
          1+         Add 1
            *        Multiply
             d$z     Duplicate and store in register
                N    Output as number

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


1

Brachylogขนาด 21 ไบต์

l~lCℕ₁ᵐ≤ᵛ~+?&;Cz≜×ᵐ<₁

ลองออนไลน์!

ใช้ผลรวมของค่าอินพุตเป็นขอบเขตสูงสุดสำหรับค่าสัมประสิทธิ์ C. ค่อนข้างช้า, หมดเวลาใน TIO สำหรับความยาวของรายการอินพุตเกินกว่า 5 หรือ 6 (ขึ้นอยู่กับผลรวมของค่า) แต่ไม่ช้าเท่ากับรุ่นดั้งเดิมของฉันซึ่งต้องการรายการขนาดเล็กมากถึง 3 องค์ประกอบที่มีค่าเล็ก ๆ เพื่อไม่ให้หมดเวลา:

21 ไบต์

l~l.&+^₂⟦₁⊇.;?z/ᵐℕ₁ᵐ∧

ลองออนไลน์!



1

Python 2 , 53 ไบต์

lambda a:reduce(lambda b,v:b+[b[-1]/v*v+v],a,[0])[1:]

ลองออนไลน์!

k*x>yนัยk>y/x; เพื่อให้มีขนาดเล็กที่สุดสามารถมีk k=floor(y/x)+1เนื่องจากใน Python 2.7 แบ่งจำนวนเต็มถูกใช้ไปแล้วในฐานะfloorที่เราต้องการและk=y/x+1k*x = (y/x+1)*x = y/x*x+x


0

Oracle SQL 11.2, 210 ไบต์

WITH v AS(SELECT TO_NUMBER(COLUMN_VALUE)a,rownum i FROM XMLTABLE(('"'||REPLACE(:1,' ','","')||'"'))),c(p,n)AS(SELECT a,2 FROM v WHERE i=1UNION ALL SELECT a*CEIL((p+.1)/a),n+1 FROM c,v WHERE i=n)SELECT p FROM c;

ยกเลิกแข็งแรงเล่นกอล์ฟ

WITH v AS                                           
(
  SELECT TO_NUMBER(COLUMN_VALUE)a, rownum i            -- Convert the input string into rows 
  FROM   XMLTABLE(('"'||REPLACE(:1,' ','","')||'"'))   -- using space as the separator between elements
)
, c(p,n) AS                        
(
  SELECT a, 2 FROM v WHERE i=1                         -- Initialize the recursive view
  UNION ALL 
  SELECT a*CEIL((p+.1)/a),n+1 FROM c,v WHERE i=n       -- Compute the value for the nth element
)
SELECT p FROM c;

0

Chez Scheme (140 Bytes)

เวอร์ชั่น Golfed:

(define(f l)(define(g l p m)(cond((null? l)l)((<(*(car l)m)(+ p 1))(g l p(+ m 1)))(else(cons(*(car l)m)(g(cdr l)(* m(car l))1)))))(g l 0 1))

เวอร์ชันที่ไม่ถูกปรับแต่ง:

(define(f l)
  (define(g l p m)
    (cond
      ((null? l) l)
      ((< (* (car l) m) (+ p 1)) (g l p (+ m 1)))
      (else (cons (* (car l) m) (g (cdr l) (* m (car l)) 1)))
    )
  )
  (g l 0 1)
)

ลองออนไลน์!


* m(car l)*(car l)mสามารถ
Jonathan Frech

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