เพิ่มหมายเลขเดียว


25

บทนำ

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

งาน

ข้อมูลที่คุณป้อนเป็นรายการจำนวนเต็มLซึ่งอาจว่างเปล่า ส่งออกของคุณจะเป็นรายการLที่ว่าจำนวนหนึ่งL ฉันได้รับการแทนที่ด้วยอีกL Jที่L ฉัน <L เจและฉัน <J

กล่าวอีกนัยหนึ่งคุณจะแทนที่หนึ่งหมายเลขด้วยตัวเลขที่สูงกว่าที่เกิดขึ้นหลังจากนั้น

คุณสามารถเลือกiและjได้อย่างอิสระในทุกคู่ที่ถูกต้องและตัวเลือกสามารถเป็นแบบไม่ระบุชื่อได้

หากiและjดังกล่าวไม่มีอยู่ (เช่นLไม่เพิ่มขึ้น) เอาต์พุตของคุณจะไม่เปลี่ยนแปลงL

ตัวอย่าง

พิจารณาการป้อนข้อมูลL = [3, 1, 4, -1, 2] การดำเนินงานที่เป็นไปได้ที่จะมาแทนที่3จาก4แทนที่1จาก4แทนที่1จาก2หรือเปลี่ยน-1โดย2 ดังนั้นผลลัพธ์ที่เป็นไปได้คือ:

 [  3 ,   1 ,   4 ,  -1 ,   2 ]
 ------------------------------
 [( 4),   1 ,(  4),  -1 ,   2 ]
 [  3 ,(  4),(  4),  -1 ,   2 ]
 [  3 ,(  2),   4 ,  -1 ,(  2)]
 [  3 ,   1 ,   4 ,(  2),(  2)]

ถ้าคุณทำซ้ำการดำเนินครั้งพอสิ้นผลจะเป็น[4,4,4,2,2]ซึ่งเป็นรายการได้อย่างแม่นยำสูงสุดหางของL

กฎและการให้คะแนน

คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น ในกรณีหลังคุณสามารถปรับเปลี่ยนอินพุตแทนการส่งคืนอาร์เรย์ใหม่หากภาษาของคุณอนุญาต รูปแบบอินพุตและเอาต์พุตมีความยืดหยุ่นภายในเหตุผล

จำนวนไบต์ต่ำสุดชนะ

กรณีทดสอบ

แสดงผลลัพธ์ที่เป็นไปได้ทั้งหมด

[] -> []
[1] -> [1]
[1,2] -> [2,2]
[2,1] -> [2,1]
[4,4,4,4] -> [4,4,4,4]
[-1,-3,-10] -> [-1,-3,-10]
[1,3,10] -> [3,3,10] [10,3,10] [1,10,10]
[1,1,2,1] -> [2,1,2,1] [1,2,2,1]
[998,64,2,-94,-789] -> [998,64,2,-94,-789]
[998,2,64,-94,-789] -> [998,64,64,-94,-789]
[3,1,4,-1,2] -> [4,1,4,-1,2] [3,4,4,-1,2] [3,2,4,-1,2] [3,1,4,2,2]
[-1,4,0,4,7,2,3] -> [4,4,0,4,7,2,3] [0,4,0,4,7,2,3] [-1,4,4,4,7,2,3] [7,4,0,4,7,2,3] [-1,7,0,4,7,2,3] [-1,4,7,4,7,2,3] [-1,4,0,7,7,2,3] [2,4,0,4,7,2,3] [-1,4,2,4,7,2,3] [3,4,0,4,7,2,3] [-1,4,3,4,7,2,3] [-1,4,0,4,7,3,3]
[3542,-12311,7662,1672,6081] -> [7662,-12311,7662,1672,6081] [3542,7662,7662,1672,6081] [3542,1672,7662,1672,6081] [6081,-12311,7662,1672,6081] [3542,6081,7662,1672,6081] [3542,-12311,7662,6081,6081]

คำตอบ:


9

JavaScript (ES6), 41 40 39 38 ไบต์

บันทึกเป็นไบต์ด้วย @Neil และอีกขอบคุณที่ @ user81655

x=>x.map(c=>c<x[++i]>d?x[d=i]:c,d=i=0)

เมื่อดูเหมือนว่าreduceRightในที่สุดอาจมีโอกาส.mapปรากฏขึ้นอีกครั้ง ...


x=>x.map(c=>c<x[++i]&!d?x[d=i]:c,d=i=0)?
Neil

มีการประเมินเงื่อนไขจากซ้ายไปขวาซึ่งหมายความว่าx=>x.map(c=>c<x[++i]>d?x[d=i]:c,d=i=0)(38 ไบต์) ควรทำงาน
user81655

@ user81655 นั่นน่าทึ่ง :-)
ETHproductions

7

Mathematica ขนาด 37 ไบต์

#/.{a___,b_,c_,d___}/;b<c:>{a,c,c,d}&

ฟังก์ชั่นที่บริสุทธิ์รับรายการตัวเลขจริงและส่งกลับรายการหมายเลขจริง ค้นหาคู่แรกของรายการที่ต่อเนื่องกันในลำดับ "ผิด" และแทนที่คู่แรกของคู่นั้นด้วยลำดับที่สอง พฤติกรรมเริ่มต้นที่ดี/.หมายความว่ามันจะส่งกลับข้อมูลไม่เปลี่ยนแปลงเมื่อเหมาะสม

ข้อสังเกตที่น่าขบขัน: ถ้าเราแทนที่b<cด้วย!OrderedQ[{c,b}]ฟังก์ชันจะทำงานกับสตริง (และประเภทข้อมูลใด ๆ จริง ๆ เมื่อคำสั่งซื้อที่เหมาะสมได้รับการอธิบาย) ตัวอย่างเช่น#/.{a___,b_,c_,d___}/;!OrderedQ[{c,b}]:>{a,c,c,d}&เมื่อ{"programming", "puzzles", "code", "golf"}ผลตอบแทนที่{"puzzles", "puzzles", "code", "golf"}ได้รับ


ข้อแม้สำหรับข้อความด้าน: การเรียงลำดับตามบัญญัติของบัญญัติของ Mathematica นั้นแปลก
Martin Ender

แล้ว Martin Ender ล่ะ
Greg Martin

Sort[FromCharacterCode /@ Range[32, 127]]เพียงแค่พยายาม มันจะแปลกเมื่อคุณมีสตริงที่มีหลายคำเพราะมันจะไม่สนใจช่องว่างและเนื้อหา
Martin Ender

6

JavaScript (ES6), 43 39 38 ไบต์

a=>a[a.some(e=>e<a[++i],i=0)*i-1]=a[i]

ส่งออกโดยการปรับเปลี่ยนอาร์เรย์ในสถานที่ แก้ไข: บันทึกแล้ว 4 ไบต์ด้วย @ETHproductions บันทึกแล้ว 1 ไบต์ขอบคุณ @ user81655


ฉันคิดว่าคุณสามารถทำa=>a[i=0,a.findIndex(e=>e<a[++i])]=a[i]เพื่อ 39
ETHproductions

อีกวิธีสำหรับ 40B:a=>a.map((_,b)=>Math.max(...a.slice(b)))
ลุค

@ ลุคฉันคิดว่าคุณเข้าใจผิดกับความท้าทาย; จุดคือการทำให้หนึ่งในจำนวนเต็มในอาร์เรย์มีขนาดใหญ่กว่า
ETHproductions

@ ETHproductions ขอขอบคุณสำหรับการคืนความโปรดปรานตอนนี้เกียรติยศก็ยิ่ง!
Neil

ฉันคิดว่าคุณสามารถแทนที่findIndexด้วยsome(38 bytes):a=>a[i=0,a.some(e=>e<a[++i])*i-1]=a[i]
user81655

5

Haskell , 36 ไบต์

f(a:r@(b:_))|a<b=b:r|1>0=a:f r
f e=e

ลองออนไลน์!

มองผ่านรายการสำหรับองค์ประกอบติดต่อกันa,bด้วยและการเปลี่ยนแปลงให้พวกเขาa<bb,b

ปรับปรุงจาก 37 ไบต์:

f(a:b:t)|a<b=b:b:t
f(a:t)=a:f t
f e=e

ฉันคิดว่าf(a:r@(b:_))=max(b:r)(a:f r)ใช้ได้ผลและสั้นกว่าสองไบต์
Ørjan Johansen

@ ØrjanJohansenนั่นเป็นวิธีที่สวยงาม! ฉันคิดว่าคุณควรโพสต์มันเป็นคำตอบของคุณเอง ตอนแรกฉันไม่แน่ใจว่ามันจะจัดการความสัมพันธ์ได้อย่างถูกต้อง แต่ฉันเห็นตอนนี้มันทำงานf r >= rได้
xnor

ขอบคุณฉันทำไปแล้ว !
Ørjan Johansen

4

เยลลี่ , 13 11 ไบต์

ṫJṀ€ż¹ŒpQ-ị

แทนที่ขวาสุดของตัวเลขที่เป็นไปได้ทั้งหมด

ลองออนไลน์!

มันทำงานอย่างไร

ṫJṀ€ż¹ŒpQ-ị  Main link. Argument: A (array)

 J           Yield all indices of A, i.e., the array [1, ..., len(A)].
ṫ            Dyadic tail; for index k, take all elements starting with the k-th.
             This constructs the array of suffixes.
  Ṁ€         Maximum each; map the monadic maximum atom over the suffixes.
     ¹       Identity; yield A.
    ż        Zip; construct all pairs of elements of the result to the left and the
             corresponding elements of the result to the right.
      Œp     Cartesian product. Construct all arrays that, for each index, take
             either the left or the right element.
        Q    Unique; deduplicate the resulting arrays.
         -ị  At-index -1; select the second to last result.
             The last result is A itself, the first maxima of suffixes.

3

MATL , 15 ไบต์

tdt0>0whY>d*0h+

ลองออนไลน์!

ฉันไม่ใช่แฟนตัวยงของโซลูชันนี้ ดูเหมือนว่าฉันไม่มีประสิทธิภาพอย่างน่ากลัว โดยเฉพาะอย่างยิ่งwhY>d*และ0h+ส่วน


3

Python 2, 139 134 93 ไบต์

a=input()
for i in range(len(a)):
 for j in a[i+1:]:
    if a[i]<j:a[i]=j;print a;exit()
print a

ยาวชะมัด แต่มันเป็นความพยายามครั้งแรก

-5 ไบต์ขอบคุณ TemporalWolf
-41 (!!) ไบต์ต้องขอบคุณ Value Ink


[1,2]ให้[2,1]แทน[2,2]
TemporalWolf

1
@TemporalWolf ใช่ฉันเข้าใจผิดความท้าทาย ไม่มีการบันทึกหรือสูญหายไบต์จะแก้ไข
HyperNeutrino

คุณสามารถลบผลตอบแทนก่อนข้างในของคุณprintและใช้\tแท็บแทนการเว้นวรรคเพิ่มเติมสำหรับการวนซ้ำภายใน นอกจากนี้คุณสามารถเลื่อน 0 ลงexit()เพื่อเพิ่มได้อีกหนึ่ง ควรนำคุณลงมาที่ 132
TemporalWolf

@TemporalWolf โอเคขอบคุณ!
HyperNeutrino

1
if a[i]<a[j]:a[i]=a[j];print a;exit()สั้นกว่า เฮ้มันจะดีกว่าที่จะทำfor j in a[i+1:]:\n\tif a[i]<j:a[i]=j;print a;exit()
Value Ink

3

MATL , 13 ไบต์

ttd0>fX>Q)2M(

ลองออนไลน์!

คำอธิบาย

เงื่อนไขสองข้อต่อไปนี้เทียบเท่า:

  1. มีตัวเลขที่มีจำนวนที่สูงกว่าทางด้านขวา
  2. มีตัวเลขที่มีจำนวนที่สูงกว่าทางด้านขวาทันที

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

เคล็ดลับนี้ใช้เพื่อจัดการเคสเมื่อไม่สามารถทำการทดแทนได้ โปรดทราบว่าการทำดัชนี MATL นั้นเป็น1พื้นฐาน

ลองใช้อินพุต[3,1,4,-1,2]เป็นตัวอย่าง

tt    % Get input implicitly and duplicate it twice
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], [3,1,4,-1,2]
d     % Consecutive differences
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], [-2  3 -5  3]
0>    % Are they positive?
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], [0 1 0 1]
f     % Find indices of all positive differences. Result may be empty
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], [2 4]
X>    % Maximum index with a positive difference. Empty input remains as empty
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], 4
Q     % Add 1. Since the addition is elementwise, empty input remains as empty
      % STACK: [3,1,4,-1,2], [3,1,4,-1,2], 5
)     % Get the entry of the input at that position
      % STACK: [3,1,4,-1,2], 2
2M    % Push maximum index with a positive difference, again
      % STACK: [3,1,4,-1,2], 2, 4
(     % Assign to that position. Implicitly display
      % STACK: [3,1,4,2,2]

3

Haskell , 34 33 ไบต์

นี้ขึ้นอยู่กับคำตอบโดย xnorใครแนะนำให้ฉันโพสต์ด้วยตัวเอง

แก้ไข: xnor พบไบต์ที่จะบันทึก

f(a:r@(b:_))=max(b:r)$a:f r
f e=e

ลองออนไลน์!

โดยทั่วไปฉันสังเกตว่าการแตกแขนงของวิธีการของ xnor มักจะจบลงด้วยการเลือกว่าการแสดงออกของสาขาใดที่ใหญ่ที่สุดเนื่องจาก Haskell ใช้การเรียงลำดับพจนานุกรมสำหรับรายการ (กรณีเมื่อa==bยังใช้งานได้เพราะf r>=rซึ่งสามารถพิสูจน์ได้แยกจากกันโดยอุปนัย)

ใส่ที่แตกต่างกันเมื่อใดก็ตามที่b:r > a:f rแล้วเป็นคำตอบที่ถูกต้องและมิฉะนั้นเราสามารถที่จะb:r recursea:f r

ดังนั้นแทนที่จะตรวจสอบa<bล่วงหน้าฉันแค่คำนวณทั้งสองนิพจน์และหาค่าสูงสุด สิ่งนี้สามารถทำให้เกิดการระเบิดแบบเลขชี้กำลังแม้ว่าความขี้เกียจของ Haskell จะหลีกเลี่ยงสิ่งนั้นเว้นแต่aและbจะเท่ากัน


1
ดูเหมือนว่าmax(b:r)$a:f rจะบันทึกไบต์
xnor

2

Python 3, 79 ไบต์

def f(x):
 for i,a in enumerate(x):
  m=max(x[i+1:])
  if m>a:x[i]=m;break

กลายพันธุ์อาร์เรย์เดิม (รายการ) ที่กำหนดให้กับมัน ฉันไม่มีความสุขที่นี่ไม่ใช่แลมบ์ดาและฉันแน่ใจว่ามีการเพิ่มประสิทธิภาพที่ดีขึ้น ฉันจะหวังว่าจะอยู่ในภายหลัง

คำอธิบายสั้น ๆ

มันใช้เวลาสูงสุดของอาร์เรย์ที่ผ่านองค์ประกอบปัจจุบัน (เริ่มต้นด้วยศูนย์) จากนั้นจะเปรียบเทียบสิ่งนี้กับองค์ประกอบตัวเอง: ถ้าค่าสูงสุดมากกว่าให้แทนที่องค์ประกอบปัจจุบันด้วยและหยุดมิฉะนั้นเพิ่มทีละรายการและลองต่อไป



2

C, 47 ไบต์

f(p,n)int*p;{n>1?*p<p[1]?*p=p[1]:f(p+1,n-1):0;}

การใช้งานแบบเรียกซ้ำโดยป้อนข้อมูลเป็นตัวชี้ไปยังองค์ประกอบแรกของอาร์เรย์และความยาวของอาร์เรย์ ปรับเปลี่ยนอาร์เรย์ในสถานที่


การส่งคืนรหัสของคุณดูเหมือนว่าไม่ถูกต้องideone.com/83HJqN
Khaled.K

@ Khaled.K มันแสดงผลลัพธ์ "3 4 4 -1 2" ซึ่งเป็นหนึ่งในผลลัพธ์ที่ได้รับอนุญาตในคำถาม คุณคิดว่าอะไรผิดปกติกับมัน?
hvd

ฉันเข้าใจแล้วคำถามยังไม่ชัดเจนว่า
Khaled.K

2

SWI-Prolog, 70 ไบต์

f([H|T],[S|T]):-max_list(T,S),S>H,!.
f([H|T],[H|R]):-f(T,R),!.
f(I,I).

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

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

ตัวอย่าง:

?- f([-1,4,0,4,7,2,3], O).
O = [7, 4, 0, 4, 7, 2, 3]


1

C, 80 ไบต์

i,j;f(l,n)int*l;{for(i=0;i<n;++i)for(j=i;++j<n;)if(l[i]<l[j]){l[i]=l[j];j=i=n;}}

โทรด้วย:

int main()
{
    int a[5]={3,1,4,-1,2};
    f(a,5);
    for(int k=0;k<5;++k)
        printf("%d ", a[k]);
}

1

Python 2, 89 ไบต์

ลองใช้ออนไลน์ -1 ไบต์ด้วย @TemporalWolf
-25 ไบต์ขอบคุณ @ValueInk
-7 ไบต์ขอบคุณ @Cole

ฟังก์ชั่นที่กลายพันธุ์อาร์เรย์อินพุต

def F(A):
 for i in range(len(A)):
    r=[y for y in A[i+1:]if y>A[i]]
    if r:A[i]=r[0];break

หากไม่จำเป็นต้องหยุดหลังจากการทำซ้ำครั้งแรกมันจะสวยขึ้นเล็กน้อย


สิ่งนี้ดูเหมือนจะไม่ทำงาน ลอง[1, 3, 5, 7]; มันกลับ[3, 3, 5, 7]มา
HyperNeutrino

1
A[i]<y and=> y>A[i]andประหยัด 1
TemporalWolf

@HyperNeutrino หากฉันทำตัวถูกต้องงานนั่นเป็น outut ที่ถูกต้อง
Dead Possum

1
พิจารณาที่r=[y for y in A[i+1:]if y>A[i]]\n if r:A[i]=r[0];breakจะลดคะแนนของคุณถึง 96!
หมึกมูลค่า

1
ผมอาจจะแนะนำสิ่งที่ผมแนะนำสำหรับหนึ่งในคำตอบที่งูใหญ่อื่น ๆ : input()แปลงสิ่งที่คุณมีฟังก์ชั่นที่กลายร่างอาร์เรย์ต้นฉบับเพื่อให้คุณสามารถหลีกเลี่ยงการพิมพ์และ
โคล

1

Python 2, 60 ไบต์

f=lambda x:x and[x[:1]+f(x[1:]),[max(x)]+x[1:]][x[0]<max(x)]

ลองออนไลน์!

คำอธิบาย:ตรวจสอบซ้ำว่าองค์ประกอบที่กำหนดนั้นน้อยกว่าmaxองค์ประกอบในส่วนที่เหลือของรายการ ถ้าเป็นเช่นนั้นส่งคืนรายการด้วยการmaxแทนที่องค์ประกอบแรก


1

TI-Basic, 72 ไบต์

Prompt L1
If 2≤dim(L1
Then
For(A,1,dim(L1)-1
For(B,A,dim(L1
If L1(A)<L1(B
Then
L1(B→L1(A
Goto E
End
End
End
End
Lbl E
L1

คำอธิบาย:

Prompt L1          # 4 bytes, input list
If 2≤dim(L1        # 7 bytes, if the list has 2 or 1 element(s), skip this part and return it
Then               # 2 bytes
For(A,1,dim(L1)-1  # 12 bytes, for each element in the list other than the last
For(B,A,dim(L1     # 9 bytes, for each element after that one
If L1(A)<L1(B      # 12 bytes, if the second is larger than the first
Then               # 2 bytes
L1(B→L1(A          # 10 bytes, replace the first with the second
Goto E             # 3 bytes, and exit
End                # 2 bytes
End                # 2 bytes
End                # 2 bytes
End                # 2 bytes
Lbl E              # 3 bytes
L1                 # 2 bytes, implicitly return L1

1

sh, 118 ไบต์

จำนวนเต็มอินพุตถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังสคริปต์

l=("$@");for i in "$@";{ for j in "$@";{(($i<$j))&&{ l[$x]=$j;echo ${l[@]};exit;};};shift;x=`expr $x+1`;};echo ${l[@]}

ทำให้พังถล่ม:

l=("$@");                      #copy original list
for i in "$@";{ for j in "$@"; #check all elements j that follow element i in list
{(($i<$j))&&{ l[$x]=$j;echo ${l[@]};exit;};};   #if i<j, make i=j; print list, done
shift;                         #makes sure that i is compared only to j that occur after it
x=`expr $x+1`;};               #keeps track of i'th position in the list
echo ${l[@]}                   #prints list if it was unchanged

0

PHP, 88 ไบต์

<?for(;$i+1<$c=count($a=$_GET)&&$a[+$i]>=$a[++$i];);$i>=$c?:$a[$i-1]=$a[$i];print_r($a);

ทำให้พังถล่ม

for(;
$i+1<($c=count($a=$_GET))  # first condition end loop if the item before the last is reach 
&&$a[+$i]>=$a[++$i] # second condition end loop if item is greater then before 
;);
$i>=$c?:$a[$i-1]=$a[$i]; # replace if a greater item is found
print_r($a); #Output

0

Haskell, 48 ไบต์

f(b:l)|l>[],m<-maximum l,b<m=m:l|1<2=b:f l
f x=x

ตัวอย่างการใช้งาน: ->f [1,1,2,1] ลองออนไลน์! .[2,1,2,1]

หากรายการอินพุตมีองค์ประกอบอย่างน้อยหนึ่งรายการให้ผูกbกับองค์ประกอบแรกและlกับรายการที่เหลือ ถ้าlไม่ว่างเปล่าและbน้อยกว่าสูงสุดของการlกลับมาสูงสุดตามด้วยlอื่นกลับมาbตามด้วยโทร recursive f lของ หากรายการอินพุตว่างเปล่าให้ส่งคืน


0

แร็กเก็ต 202 ไบต์

(let((g(λ(L i n)(for/list((c(in-naturals))(l L))(if(= c i)n l))))(ol'()))
(for((c(in-naturals))(i L))(for((d(in-range c(length L)))#:when(>(list-ref L d)i))
(set! ol(cons(g L c(list-ref L d))ol))))ol)

Ungolfed:

(define (f L)
  (let ((replace (λ (L i n)   ; sub-function to replace i-th item in list L with n;
                   (for/list ((c (in-naturals))
                              (l L))
                     (if (= c i) n l))))
        (ol '()))             ; outlist initially empty; 
    (for ((c (in-naturals))               ; for each item in list
          (i L))
      (for ((d (in-range c (length L)))   ; check each subsequent item in list
            #:when (> (list-ref L d) i))  ; if greater, replace it in list
        (set! ol (cons (replace L c (list-ref L d)) ol)))) ; and add to outlist.
    ol))          ; return outlist.

การทดสอบ:

(f '(3 1 4 -1 2))

เอาท์พุท:

'((3 1 4 2 2) (3 2 4 -1 2) (3 4 4 -1 2) (4 1 4 -1 2))

0

C, 67 ไบต์

Single Run, 67 ไบต์ Live

j;f(l,i)int*l;{j=i-1;while(i-->0)while(j-->0)l[j]=fmax(l[i],l[j]);}

ขั้นตอนเดียว, 78 ไบต์ สด

j;f(l,i)int*l;{j=i-1;while(i-->0)while(j-->0)if(l[j]<l[i]){l[j]=l[i];return;}}

Tail Maxima, 96 ไบต์ สด

x;i;j;f(l,n)int*l;{do{x=0;for(i=0;i<n;i++)for(j=0;j<i;j++)if(l[j]<l[i])l[j]=l[i],x=1;}while(x);}

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