สร้างอาร์เรย์ที่มีตัวเลขซ้ำกัน


19

ท้าทาย

งานของคุณในคำถามนี้คือการเขียนโปรแกรมหรือฟังก์ชั่นที่มีชื่อซึ่งใช้จำนวนเต็มบวกn(มากกว่า 0) เป็นอินพุตผ่าน STDIN, ARGV หรือฟังก์ชั่นการขัดแย้งและส่งออกอาร์เรย์ผ่าน STDOUT หรือฟังก์ชั่นกลับค่า

ฟังดูง่ายพอใช่ไหม ตอนนี้ที่นี่เป็นกฎ

  • อาร์เรย์จะมีจำนวนเต็มตั้งแต่1ถึงn
  • แต่ละจำนวนเต็มตั้งแต่1ถึงnควรซ้ำหลายxครั้งซึ่งxเป็นค่าของจำนวนเต็มแต่ละค่า

ตัวอย่างเช่น:

การป้อนข้อมูล:

5

เอาท์พุท:

[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]

อาเรย์อาจจะเรียงหรือไม่ก็ได้

นี่คือดังนั้นผู้ชนะคือรหัสที่สั้นที่สุดในหน่วยไบต์

โบนัส

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

ตัวอย่างเช่นสำหรับn = 5หนึ่งการกำหนดค่าดังกล่าวจะเป็น

[5, 4, 5, 4, 3, 4, 5, 2, 5, 3, 1, 2, 3, 4, 5]

คำตอบ:


6

APL, 4 ตัวอักษร

/⍨⍳⎕

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

อ่านอินพุตของผู้ใช้ สำหรับเอาต์พุต APL โดยค่าเริ่มต้นจะพิมพ์ผลลัพธ์จากทุกบรรทัด

⍳nเป็นจำนวนเต็มจาก 1 nไป ตัวอย่าง:⍳3←→ 1 2 3

/หมายถึงการทำซ้ำ แต่ละองค์ประกอบจากอาร์กิวเมนต์ที่ถูกต้องจะถูกทำซ้ำหลาย ๆ ครั้งตามที่ระบุโดยองค์ประกอบที่เกี่ยวข้องจากอาร์กิวเมนต์ซ้าย ตัวอย่าง:2 0 3/'ABC'←→ 'AACCC'

คือ ผู้ประกอบการเดินทาง เมื่อมันเกิดขึ้นที่ด้านขวาของฟังก์ชั่นมันจะปรับเปลี่ยนพฤติกรรมของมันดังนั้นจึงสลับการขัดแย้ง ( A f⍨ B ←→ B f Aดังนั้น "การเดินทาง") หรือให้อาร์กิวเมนต์เดียวกันทั้งสองด้าน ( f⍨ A ←→ A f Aเป็น "เซลฟี") แบบฟอร์มหลังถูกใช้ในโซลูชันนี้


โบนัส:

6-∊⌽⍳¨⍳⎕ (8 ตัวอักษร ขอบคุณ @ phil-h )

⍳5( 1 2 3 4 5เล็กน้อยห้า) คือ

⍳¨ ⍳5(ส่วนน้อยหนึ่งส่วนห้าส่วน) คือ(,1)(1 2)(1 2 3)(1 2 3 4)(1 2 3 4 5)เวกเตอร์ของเวกเตอร์ แต่ละตัว ( ¨) เป็นตัวดำเนินการมันใช้ฟังก์ชั่นทางด้านซ้ายและนำไปใช้กับแต่ละรายการจากอาร์เรย์ทางด้านขวา

(1 2 3 4 5)(1 2 3 4)(1 2 3)(1 2)(,1)กลับอาร์เรย์เพื่อให้เราได้รับ

เป็นเกณฑ์ (aka flatten ) วนซ้ำอาร์กิวเมนต์ภายในและส่งคืนสเกลาอย่างง่ายจากมันเป็นเวกเตอร์


วิธีการเกี่ยวกับการแสดงออก 4 ตัวอักษร? /⍨⍳n
ngn

ตามที่คุณต้องการครับผมได้อัพเดทข้อความ แต่แน่นอนว่าการคัดค้านของคุณจะต้องนำไปใช้กับโซลูชั่นอื่น ๆ
ngn

3
Dyalog APL มีสองรสชาติ: "คลาสสิค" และ "Unicode" รุ่นคลาสสิกมีมานานหลายทศวรรษตั้งแต่ก่อนที่มาตรฐาน Unicode จะปรากฏขึ้นและใช้การเข้ารหัสไบต์ต่ออักขระที่กำหนดเองสำหรับชุดอักขระ APL มันยังคงได้รับการสนับสนุนแม้ว่าจะไม่สนับสนุนการใช้งาน ดังนั้นฉันต้องการใช้เป็นข้ออ้าง ในวงกว้างฉันคิดว่าในการตีกอล์ฟเราควรนับจำนวนตัวอักษรไม่ใช่ไบต์ ความจริงที่ว่าคะแนนรหัสต่ำสุดใน Unicode นั้นถูกครอบครองโดย ASCII แบบศูนย์กลางภาษาอังกฤษเป็นอุบัติเหตุทางประวัติศาสตร์ที่ไม่น่าจะมีความสำคัญในวันนี้ น่าสนใจ APL คิดขึ้นมาก่อนที่ ASCII จะออกมา
ngn

3
@ngn การนับตัวอักษรไม่ใช่ความคิดที่ดีเพราะโดยทั่วไปคำตอบจะกลายเป็นการถอดรหัสตัวอักษรซุป ตัวอักษร APL ถูกนับเป็นไบต์เนื่องจากมีการเข้ารหัสอยู่ สิ่งนี้ได้รับการยอมรับอย่างดีในเว็บไซต์นี้ ใช้ได้กับการเข้ารหัสไบต์ใด ๆ ที่มีอยู่ก่อนที่จะถามคำถาม
FryAmTheEggman

1
@ngn: คุณอธิบายคำตอบโบนัสของคุณได้ไหม? เพราะสามารถทำได้ผ่าน: 5 4 3 2 1 5 4 3 2 5 4 3 5 4 5 หรือ 6 ลบแต่ละ 1 2 3 4 5 1 2 3 4 1 2 3 1 2 3 1 2 1 ซึ่งรู้สึกว่ามันไม่ไกล จากคำตอบเริ่มต้นของคุณ
Phil H

11

Ruby (เรียกซ้ำ), 41 ไบต์ * 0.5 = 20.5

def n(n,i=1);i>n ?[]:n(n,i+1)+[*i..n];end

หรือใช้แลมบ์ดา (ตามคำแนะนำของฮิสโทแคตต์และ Ventero): 34 ไบต์ * 0.5 = 17

r=->n,i=n{i>0?[*i..n]+r[n,i-1]:[]}

(โทรโดยใช้r[argument])


2
นั่นเป็นทางออกที่ยอดเยี่ยมจริงๆ คุณสามารถบันทึกไบต์บางส่วนโดยการทำให้มันเป็นแลมบ์ดาแทนวิธีการ ( n=->x,i=1{...n[x,i+1]...) [*i..n]และอีกไม่กี่กับ
ชำนาญวิชาประวัติศาสตร์

1
โดยการย้อนกลับตรรกะคุณสามารถวางช่องว่างในไตรภาค:r=->n,i=n{i>0?[*i..n]+r[n,i-1]:[]}
Ventero


8

Haskell, 31 ตัวอักษร = 15.5 คะแนน

f n=[y|x<-[n,n-1..1],y<-[x..n]]

27 ตัวอักษรโดยไม่มีโบนัส

f n=[x|x<-[1..n],_<-[1..x]]

พ่ายแพ้โดย Proud Haskeller


ทางออกแรกของคุณไม่ถูกต้อง การแก้ไขที่เป็นไปได้คือg n = [y|x<-[n,n-1..1],y<-[x..n]]
karakfa

@karakfa อ๊ะ: - / และขอบคุณสำหรับการแก้ไข
John Dvorak

คำตอบ Haskell ของฉันเป็นเพียงตาดต่ำกว่าของคุณ
ภูมิใจ haskeller

ฉันควรเชื่อมโยงจากโซลูชันของฉันเพื่อโปรโมตหรือไม่
John Dvorak

@JanDvorak ฉันต้องการจริง ๆ ...
ภูมิใจ haskeller

7

C, 22 = 44 ไบต์ * 0.5

ฟังก์ชั่นhใช้สองพารามิเตอร์ ครั้งแรกคือการintระบุn ประการที่สองคือint*ซึ่งเป็นบัฟเฟอร์ผลลัพธ์

h(n,o)int*o;{for(n&&h(~-n,o+=n);*--o=n--;);}

โปรแกรมทดสอบ

main(){
int wow[999],*i;
memset(wow,0,sizeof(wow));
h(6, wow);
for(i=wow;*i;i++)printf("%d ", *i);
}

ฉันไม่เข้าใจ กรุณาอธิบาย?
bacchusbeale

@ bacchusbeale Ok .. มันเขียนวนซ้ำเรียงลำดับจาก n เป็น 0 ซ้ำลำดับที่สั้นกว่านั้นจะถูกเขียนเร็วขึ้นในระดับที่ลึกกว่าของการเรียกซ้ำ หากอาร์กิวเมนต์ n เป็น 0 ดังนั้น n จึงเป็นเท็จดังนั้นจึงไม่มีการเรียกซ้ำและมีการเขียนเฉพาะ 0 ซึ่งทำหน้าที่ทำเครื่องหมายจุดสิ้นสุดของอาร์เรย์
feersum

7

Pyth - 15 10 * .5 = 5

smr-QdhQUQ

ลองออนไลน์

คาดว่าอินพุตใน stdin อัลกอริทึมที่ค้นพบโดยอิสระ ขอบคุณ @ Sp3000 ที่ช่วยฉันติดคำถามสุดท้ายในนั้น: P ยิ่งกว่านั้นประชด? XD

คำอธิบาย:

Q=eval(input())       : implicit
s                     : The sum of...
 m      UQ            : map(...,range(Q))
  r-QdhQ              : range(Q-d,Q+1)

2
ทางออกที่ดี เคยมีสถานการณ์ที่ Pyth จะไม่ชนะการแข่งขันกอล์ฟรหัสหรือไม่? :)
Alex A.

2
@Alex ขึ้นอยู่กับลักษณะของปัญหาภาษาการเล่นกอล์ฟแบบกองซ้อน (Golfscript, CJam) สามารถครีมมันก็สามารถสูญเสียสิ่งห้องสมุด ( ไอทุบตีไอ );
FryAmTheEggman

6

CJam, 12 15 ไบต์ * 0.5 = 7.5

li_,f{),f-W%~}`

นี่เป็นโปรแกรม STDIN-to-STDOUT เต็มรูปแบบ มันเชื่อมต่อส่วนต่อท้ายที่เพิ่มขึ้นของ1 ... nช่วงซึ่งทำให้มั่นใจได้ว่าไม่มีตัวเลขสองตัวที่อยู่ติดกันเหมือนกัน

ทดสอบที่นี่


6

Python 2, 53 ไบต์ * 0.5 = 26.5

i=n=input()
x=[]
while i:x+=range(i,n+1);i-=1
print x

ยืมความคิดของ @ VisualMelon อย่างไร้ยางอาย


6

Haskell, 34 ไบต์ * 0.5 = 17

0%n=[]
i%n=[i..n]++(i-1)%n
g n=n%n

นั่นเป็นครั้งแรกที่ฉันเคยใช้ Haskell เพื่อเล่นกอล์ฟ g <number>โทรหา



5

GolfScript (14 ไบต์ * 0.5 = คะแนน 7)

 ~:x,{~x),>~}%`

การสาธิตออนไลน์

ฉันคิดว่านี่อาจจะคล้ายกับคำตอบที่มีอยู่ในนั้นมันสร้างอาร์เรย์ concat( [n], [n-1, n], [n-2, n-1, n], ..., [1, 2, ..., n] )

น่าเศร้าที่ฉันไม่สามารถเล่นกอล์ฟได้อีกต่อไปสิ่งที่สวยงามกว่านี้ก็คือ:

~:x]{{,{x\-}/}%}2*`

ซึ่งทำให้การป้อนข้อมูลxลงในอาร์เรย์แล้วสองครั้งใช้ซึ่งแผนที่แต่ละองค์ประกอบในอาร์เรย์นับลงจากการที่องค์ประกอบหลายอย่างจาก{,{x\-}/}%x


5

C # - 81 (161bytes * 0.5)

งานง่าย ๆ ใน C # หวังว่าจะได้รับโบนัสที่ไม่มีการนับจำนวน อ่าน int จาก stdin เขียนอาร์เรย์เหมือนตัวอย่างเพื่อ stdout

class P{static void Main(){int n=int.Parse(System.Console.ReadLine()),m=n-1,i;var R="["+n;for(;m-->0;)for(i=m;i++<n;)R+=", "+i;System.Console.WriteLine(R+"]");}}

อ่านเพิ่มเติมได้:

class P
{
    static void Main()
    {
        int n=int.Parse(System.Console.ReadLine()),m=n-1,i;
        var R="["+n;
        for(;m-->0;)
            for(i=m;i++<n;)
                R+=", "+i;
        System.Console.WriteLine(R+"]");
    }
}

ตัวอย่างผลลัพธ์:

n = 5
[5, 4, 5, 3, 4, 5, 2, 3, 4, 5, 1, 2, 3, 4, 5]

ฉันกำลังพยายามหาวิธีแก้ปัญหา C # ที่สั้นกว่า แต่ฉันก็ดูเหมือนจะไม่เข้าใจ ... ทำได้ดีมาก
Brandon

1
@ MarkKnol System.Consoleเป็นแบบสแตติกคุณไม่สามารถกำหนดให้ตัวแปร แต่ใน C # 6 หรืออะไรก็ตามที่อยู่ถัดไปคุณจะสามารถทำได้using System.Console;( using System;ไม่จ่ายในอินสแตนซ์นี้) ไม่แน่ใจว่าฉันรู้สึกอย่างไรเกี่ยวกับคุณลักษณะนี้จะ ส่งผลต่อคำถามกอล์ฟเก่า ๆ ด้วยเหตุผลนี้อย่างแม่นยำ;)
VisualMelon

1
@Ichabod เล่นได้แย่ลงusing C=System.Consoleประหยัด 3 ไบต์และอาจเป็นสิ่งที่ @ MarkKnol หมายถึง (ขออภัย!) ประมาทเลินเล่อในส่วนของฉัน
VisualMelon

1
นอกจากนี้ตามกฎคุณสามารถมีวิธีการแทนการสร้างโปรแกรมที่สมบูรณ์ สิ่งที่ต้องการ ... นี้ (114 bytes with whitespaces และถูกลบออกไป 57 bytes พร้อมโบนัส)
Ichabod Clay

1
@IchabodClay แน่นอน; ฉันชอบการส่งโปรแกรมเต็มรูปแบบไปยังฟังก์ชั่นไม่มีเหตุผลที่ดี IO ดูเหมือนว่าเป็นส่วนหนึ่งของความสนุก (ฉันไม่ได้ใช้ argv เช่นกัน) อย่าลังเลที่จะโพสต์คำตอบให้คะแนนที่ดีขึ้นโดยไม่มีข้อ จำกัด daft เหล่านี้!
VisualMelon

4

JavaScript, ES6, 41 ไบต์

f=i=>[...Array(i).fill(i),...i?f(--i):[]]

สิ่งนี้จะสร้างฟังก์ชั่นfที่สามารถเรียกได้ว่าชอบf(6)และมันจะคืนค่าอาเรย์ที่ต้องการ

วิธีนี้ใช้วิธีแบบเรียกซ้ำโดยที่การวนซ้ำแต่ละครั้งจะสร้างอาร์เรย์ของiองค์ประกอบทั้งหมดที่มีค่าiและต่ออาร์เรย์ที่ส่งคืนโดยเชื่อมโยงf(i-1)กับเงื่อนไขการหยุดi==0มีเงื่อนไขของการหยุด

ใช้งานได้กับ Firefox ล่าสุด


4

Haskell, 14 = 28 ไบต์ / 2

f n=n:[1..n-1]>>= \r->[r..n]

เอาท์พุทตัวอย่าง:

>f 5
[5,1,2,3,4,5,2,3,4,5,3,4,5,4,5]

24 ไบต์โดยไม่มีโบนัส:

f n=[1..n]>>= \r->[r..n]

สามารถ=<<ช่วยหลีกเลี่ยงช่องว่างหรือไม่ ฉันรู้สึกว่ามันเป็นไปได้ แต่ฉันจะแปลกใจถ้าคุณไม่ได้พิจารณาเรื่องนั้น
John Dvorak

@JanDvorak ถ้าฉันจะใช้=<<ฉันจะต้องใช้วงเล็บสำหรับแลมบ์ดา
hask haskeller ภูมิใจ

ฉันสับสนเมื่อ lambdas ต้องการวงเล็บ ส่วนหัวแลมบ์ดามีสิ่งที่เหมือนกัน>>=หรือไม่?
John Dvorak

@JanDvorak พวกเขาไม่มีความแน่นอน ผมไม่แน่ใจว่าวิธีที่ถูกต้องกฎนี้เป็น แต่เพียง lambdas สามารถปรากฏที่ผู้ประกอบการไม่สามารถ (ไม่คำนึงถึงส่วน): หลัง(, [, =, ,หลังจากที่ผู้ประกอบการใด ๆ และไม่ชอบ
ความภาคภูมิใจ haskeller

ฉันเดาว่า lambdas และตัวดำเนินการไม่สามารถปรากฏเป็นลวดลายได้ let \x->y = (2+) in (x,y)ดูเหมือนจะเป็นไปไม่ได้นะ
John Dvorak


3

vba, 76 * 0.5 = 38

Sub i(q)
For Z=1 To q:For x=q To Z Step -1:Debug.?x;",";:Next:Next
End Sub

คุณสามารถเสีย 1 (0.5, เทคนิค) ไบต์โดยกลั่นตัวFor Z=1 ToถึงFor Z=1To
Taylor Scott

คุณยังสามารถควบรวมNext:NextไปถึงNext x,Z
Taylor Scott


2

JavaScript, ES6, 66 ไบต์ * 0.5 = 33

f=i=>(g=n=>[...Array(n).fill().map((v,x)=>i-x),...n?g(n-1):[]])(i)

ด้วยวิธีการวนซ้ำของเครื่องมือเพิ่มประสิทธิภาพเราสามารถสร้างการวิ่งลดหลั่นจากความยาวลดลงเช่น[4,3,2,1, 4,3,2, 4,3, 4]เราสามารถสร้างลดหลั่นวิ่งการลดลงของความยาวเช่น

แทนที่จะทำให้ subarrays เดียวกันคุ้มค่ากับArray(i).fill(i)ที่เราทำundefinedsubarrays -filled ของความยาวที่เหมาะสมกับแล้วเปลี่ยนค่าที่จะวิ่งไปหาน้อยใช้Array(n).fill() .map((v,x)=>i-x)นอกจากนี้เรายังกำหนดและรับฟังก์ชั่นภายในg; ฟังก์ชั่นด้านนอกfมีอยู่เพียงเพื่อเก็บค่าของiในขณะที่เกิดgซ้ำ


2

T-SQL, 176 * 0.5 = 88

เนื่องจากคุณดูเหมือนจะพลาด T-SQL @Optimizer ที่นี่มันอยู่ในทั้งหมดมันเป็นความรุ่งโรจน์ verbose :)

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

ฟังก์ชันมูลค่าในตารางแบบอินไลน์, 176 * .5

CREATE FUNCTION F(@ INT)RETURNS TABLE RETURN WITH R AS(SELECT @ N UNION ALL SELECT N-1FROM R WHERE N>0)SELECT B.N FROM R CROSS APPLY(SELECT TOP(R.N)N FROM R A ORDER BY N DESC)B

เรียกได้ว่าดังนี้

SELECT * FROM dbo.F(5)

ตัวอย่างSQLFiddle

ฟังก์ชั่นเกลา, 220 * .5

CREATE FUNCTION G(@ INT)RETURNS VARCHAR(MAX)AS BEGIN DECLARE @S VARCHAR(MAX),@N INT=1,@I INT,@C INT WHILE @N<=@ BEGIN SELECT @I=@N,@C=@ WHILE @C>=@I BEGIN SELECT @S=CONCAT(@S+',',@C),@C-=1 END SET @N+=1 END RETURN @S END

เรียกได้ว่าดังนี้

SELECT dbo.G(5)

ตัวอย่างSQLFiddle



2

perl, 26 ไบต์

for(1..$n){print"$_ "x$_;}

1
กรุณาโพสต์คะแนนของคุณ $nนอกจากนี้ตั้งแต่นี้เป็นกอล์ฟรหัสคุณสามารถบันทึกไบต์โดยการลบช่องว่างพิเศษและความหมายของ
Alex A.

สิ่งนี้ไม่ทำงานสำหรับฉันภายใต้ Perl 6
Alex A.

@Alex ข้อผิดพลาดคืออะไรทำงานภายใต้ 5.10
michael501

Unable to parse postcircumfix:sym<{ }>, couldn't find final '}' at line 3. พยายามใน ideone.com
Alex A.

@Alex ลองทำสิ่งนี้: C: \ Windows \ system32> perl -e "$ n = 5; สำหรับ (1 .. $ n) {print qq ($ _) x $ _;};" 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
michael501

2

JavaScript (อ่านได้), 131 ไบต์

ฉันใหม่กับ Code Golf ดังนั้นนี่ไม่ใช่สิ่งที่ดีที่สุด

function f(n) {
    var arr = [];
    for(var i = 1; i <= n; i++) {
        for(var j = 0; j < i; j++) {
            arr.push(i);
        }
    }
    return arr;
}

JavaScript (อ่านน้อยกว่า), 87 ไบต์

ลดการใช้ jscompress.com

function f(e){var t=[];for(var n=1;n<=e;n++){for(var r=0;r<n;r++){t.push(n)}}return t}

2

TECO 25 ไบต์ * 0.5 = 12.5

a\+1%a%b<qauc-1%b<-1%c=>>

ด้านบนแทบจะไม่ชนะรุ่นที่ไม่ใช่โบนัสที่ 13 ไบต์:

a\%a<%b<qb=>>

2

C #, 114 99 * 0.5 = 49.5 ไบต์

(ด้วยความช่วยเหลือเล็กน้อยจากคำตอบของ VisualMelon) แก้ไข: และความคิดเห็นของ James Webster

int[]A(int n){int m=n,i,c=0;var a=new int[n*(n+1)/2];while(m-->0)for(i=m;i++<n;)a[c++]=i;return a;}

Ungolfed:

int[] FooBar(int n)
{
    int altCounter = n, i, arrayCounter = 0;
    var returnArray = new int[n * (n + 1) / 2];
    while(m-->0)
        for(i = altCounter; i++ < n; )
            returnArray[arrayCounter++]=i;
    return returnArray;
}

มีรุ่นที่ไม่ปลอดภัยที่ฉันเอามาจากคำตอบ C ของ feersum อย่างไร้ยางอาย แต่ฉันไม่แน่ใจ 100% ว่าเหมาะกับกฎเนื่องจากคุณต้องจัดสรรหน่วยความจำก่อนที่จะเรียกใช้เมธอด

C # (ไม่ปลอดภัย), 82 * 0.5 = 41 ไบต์

unsafe void A(int n,int*p){int*z=p;int m=n,i;while(m-->0)for(i=m;i++<n;)z++[0]=i;}

เรียกว่าดังนี้:

int n = 5, length = (int)((n / 2f) * (n + 1));
int* stuff = stackalloc int[length];
int[] stuffArray = new int[length];
A(n, stuff);
System.Runtime.InteropServices.Marshal.Copy(new IntPtr(stuffArray), stuffArray, 0, stuffArray.Length);
//stuffArray == { 5, 4, 5, 3, 4, 5, 2, 3, 4, 5, 1, 2, 3, 4, 5 }

ตามคำแนะนำของ VisualMelon (ขอบคุณ!) รหัสที่ไม่ปลอดภัยสามารถทำซ้ำได้ด้วยรหัสที่ปลอดภัยซึ่งจะช่วยลดขนาดลงอีก ยังคงตั้งคำถามหากการสร้างอาร์เรย์ผลลัพธ์สุดท้ายได้รับอนุญาตให้ทำนอกวิธีการ

C #, 72 * 0.5 = 36 ไบต์

void A(int n,int[]p){int z=0,m=n,i;while(m-->0)for(i=m;i++<n;)p[z++]=i;}

เยี่ยมมาก! สำหรับรุ่นที่จัดสรรต่อมาจะถูกกว่ามากที่จะไปอย่างปลอดภัยและผ่านมันint[]ไปในทันทีvoid A(int n,int[]p){int z=0,m=n,i;while(m-->0)for(i=m;i++<n;)p[z++]=i;}- ฉันยอมรับว่าอาจเป็นเรื่องเล็กน้อยที่เกี่ยวข้องกับกฎ;)
VisualMelon

คุณไม่จำเป็นต้องสร้างตัวชี้โลคัลสำหรับเวอร์ชันที่ไม่ปลอดภัยซึ่งจะลดขนาด 8bytes ได้ดี นอกจากนี้ฉันอาจพลาดจุด แต่บรรทัดสุดท้ายของรหัสการโทรที่ไม่ปลอดภัยควรเป็นSystem.Runtime.InteropServices.Marshal.Copy(new IntPtr(stuff), stuffArray, 0, length);อย่างไร
VisualMelon

@VisualMelon นั่นคือสิ่งที่ฉันได้รับจากการไม่ตรวจสอบชื่อตัวแปรอีกครั้งหลังจากเปลี่ยนชื่อพวกเขา ขอบคุณสำหรับหัวขึ้น: D แก้ไขคำตอบสำหรับบัญชีรุ่นที่สั้นกว่าในความคิดเห็นของคุณ
Ichabod Clay

คุณสามารถตัดรุ่นที่ปลอดภัยออกได้นิดหน่อยโดยฝังความยาวvar a=new int[(int)((n/2f)*(n+1))];ลงไปที่ 109
James Webster

อีกหนึ่งการปิดการคำนวณใหม่โดย:(n*(n+1)/2)
James Webster


1

C #, 116 115 + 33 = 148 ไบต์

ไม่ใช่รหัสที่สั้นที่สุด แต่ ... ก็ใช้งานได้: P

int[]l(int m){List<int>i=new List<int>();for(int j=1;j<=m;j++){for(int x=0;x<j;x++){i.Add(j);}}return i.ToArray();}

ต้องการสิ่งนี้ที่ด้านบนของไฟล์ (33 ไบต์):

using System.Collections.Generic;

รุ่นที่ไม่ตีกอล์ฟ:

int[] RepatedNumberList(int m)
{
    List<int> intList = new List<int>();
    for (int j = 1; j <= m; j++)
    {
        for (int x = 0; x < j; x++)
        {
            intList.Add(j);
        }
    }
    return initList.ToArray();
}

1

J, 23 * 0.5 = 11.5

   f=.-;@(<@|.@i."0@>:@i.)
   f 5
5 4 5 3 4 5 2 3 4 5 1 2 3 4 5

J, 11

   f=.#~@i.@>:
   f 5
1 2 2 3 3 3 4 4 4 4 5 5 5 5 5

1
23 * 0.5คือไม่11.5 10.5
ProgramFOX

@ProgramFOX จับที่ดี คุณจะแก้ไขหรือควรฉัน ไม่ใช่เหตุผลที่ดีในการลงคะแนน IMO
John Dvorak

@JanDvorak เพิ่งแก้ไขได้ และฉันไม่ได้ลงคะแนนฉันลงคะแนนก่อนที่ฉันจะเห็นข้อผิดพลาด
ProgramFOX

ขณะนี้ความผิดพลาดได้รับการแก้ไขแล้วควรย้ายโบนัสโซลูชันไปที่ด้านล่างหรือไม่
John Dvorak

-1Byte: f=.-[:;<@|.@i."0@>:@i.ทำให้คะแนนเท่ากัน!
Bolce Bussiere

1

JavaScript (ES6) 29 (58 * 0.5)

แก้ไขลบ ขอบคุณ @Optimizer

Q=o=>(m=>{for(n=o,r=[];n>m||++m<(n=o);)r.push(n--)})(0)||r

ทดสอบในคอนโซล FireFox / FireBug

Q(9)

เอาท์พุต

[9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 8, 7, 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 9, 8, 7, 6, 5, 4, 9, 8, 7, 6, 5, 9, 8, 7, 6, 9, 8, 7, 9, 8, 9]

Ungolfed

Q=o=>{
  for(m=0,r=[];m<o;++m)
    for(n=o;n>m;)
      r.push(n--);
  return r
}

1

ECMAScript6, 67 * 0.5 = 33.5 ไบต์

f=n=>{a=[],b=0;while(c=n+b,n--){while(c-b)a.push(c--);b++}return a}

ค่อนข้างมีความสุขกับอันนี้ ... มันประมาณหนึ่งในสี่ของขนาดดั้งเดิมของฉัน

f(4) ผลตอบแทน:

[ 4, 3, 2, 1, 4, 3, 2, 4, 3, 4 ]

คำตอบเก่า:

f=i=>{a=b=Array;while(i)a=a.concat(b.apply(null,b(i)).map(e=>i)),i--;return a}

นี่เป็นช็อตแรกที่โค้ดกอล์ฟ ... ฉันยังต้องการรับโบนัส 0.5 เท่า ข้อเสนอแนะใด ๆ ยินดี!

เรียกว่าด้วย f (n)


คุณต้องใหม่กับ JavaScript ด้วยตนเอง :) (1) ลบวงเล็บเหลี่ยมรอบอาร์กิวเมนต์d(2) a=b=c=[]ในส่วนการประกาศ (3) c[a].map(e=>a)(4)b.push(...c)
เครื่องมือเพิ่มประสิทธิภาพ

ฉันทำรุ่นสั้นลงก่อนที่จะอ่านความคิดเห็นของคุณซึ่งฉันจะใส่ไว้ในโพสต์ของฉัน ประสบการณ์ของฉันกับ JS นั้น จำกัด อยู่ที่การจัดการ DOM / รูปแบบส่วนใหญ่สำหรับเว็บแอปง่าย ๆ ... และฉันแทบจะไม่เคยใช้คุณสมบัติใหม่ของ ES6 มาจนถึงทุกวันนี้
binormal

1

C #, 108 ไบต์ * 0.5 = 54

List<int> f(int n){var r=new List<int>();int m=n-1,i;r.Add(n);for(;m-->0;)for(i=m;i++<n;)r.Add(i);return r;}

ขอบคุณ VisualMelon สำหรับการทำงานหนัก! ฉันคิดว่าฉันพยายามบีบมันให้มากที่สุด

(114 bytes * 0.5 = 57 หากคุณยืนยันที่จะใช้. ToArray () เพื่อส่งคืน int [])

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