รับดัชนีของอาร์เรย์หลังจากเรียงลำดับ


14

ความท้าทายของคุณในวันนี้คือการเขียนโปรแกรมหรือฟังก์ชั่นที่รับรายการlและให้ตำแหน่งlที่แต่ละองค์ประกอบlเรียงลำดับตามลำดับปรากฏขึ้น

กล่าวอีกนัยหนึ่งเอาท์พุทดัชนีของค่าที่น้อยที่สุดตามด้วยดัชนีของค่าที่เล็กที่สุดที่สองเป็นต้น

คุณสามารถสมมติว่าอาร์เรย์อินพุตจะมีจำนวนเต็มบวกเท่านั้นและจะมีองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบ

กรณีทดสอบ:

Input                  | Output (1-indexed)
[7, 4, 5]              | [2, 3, 1]
[1, 2, 3]              | [1, 2, 3]
[2, 6, 1, 9, 1, 2, 3]  | [3, 5, 1, 6, 7, 2, 4]
[4]                    | [1]

เมื่อองค์ประกอบสองรายการขึ้นไปที่มีค่าเท่ากันปรากฏขึ้นดัชนีของพวกเขาควรจะปรากฏถัดจากองค์ประกอบที่เล็กที่สุดไปหามากที่สุด

นี่คือไบต์ที่น้อยที่สุดชนะ!


16
-1 สำหรับความท้าทายเล็กน้อยที่สามารถแก้ไขได้ด้วยภาษาที่มีอยู่ทั่วไปในสนามกอล์ฟและสำหรับการรับคำตอบภายในเวลาไม่ถึง 24 ชั่วโมง นี่ไม่ใช่ความท้าทายที่ยุติธรรมและไม่น่าสนใจ
โคดี้เกรย์

3
ฉันเข้าใจว่าทำไมเขาตอบรับคำตอบภายใน 24 ชั่วโมงมันเป็นไปไม่ได้ที่จะเอาชนะ
Zacharý

3
@CodyGray ฉันคิดว่า downvoting เมื่อฉันเห็นคำตอบ 1-2 ไบต์ แต่จริงๆแล้วฉันไม่คิดว่ามันเป็นความท้าทายที่ไม่ดีสำหรับภาษาโปรแกรมมาตรฐานมากขึ้น แน่นอนว่ามันไม่ใช่เรื่องยากแต่ก็ยังมีความเป็นไปได้ในการเล่นกอล์ฟอยู่ แน่นอนว่ามันไม่น่าเป็นไปที่จะเห็นบิวด์อินขนาด 1 ไบต์ แต่ฉันไม่คิดว่ามันยุติธรรมที่จะตำหนิความท้าทายสำหรับสิ่งนั้น
Dada

1
การใช้ตัวละคร 1 ตัวนั้นแทบจะไม่ได้ฝึกฝนเลย ง่ายไม่ได้แปลว่าแก้ได้โดยใช้ builtins เท่านั้น
JAD

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

คำตอบ:


9

เฮ้มันชัดเจนเกินไป ...
Erik the Outgolfer

2
APL สมควรได้รับอันนี้ +1 จากความเร็วของคุณ
Zacharý

@ Zacharýฉันแน่ใจว่า Jelly เลือกหนึ่งตัวนี้จาก J ซึ่งจะสืบทอดมาจาก APL
อดัม

11

Dyalog APL, 1 ไบต์

Dyalog APL มีฟังก์ชั่นการทำงานในตัว (ขอบคุณZacharýสำหรับการล้างข้อมูลนี้) เพื่อทำสิ่งนี้

ตัวอย่าง

⍋11 2 4 15
    2 3 1 4  
{⍵[⍋⍵]}11 4 2 15
    2 4 11 15

นี่ฉันกำลังจัดทำดัชนีลงในรายการโดยดัชนีเรียงลำดับเพื่อส่งคืนรายการตามลำดับจากน้อยไปหามาก


โอ้เพียงเพื่อเตือนคุณถึงคำศัพท์ที่สับสนใน APL ตัวบิวอินเช่นถือว่าเป็นฟังก์ชันในขณะที่สิ่งต่าง ๆ เช่น¨⍨⍣.∘/\⌿⍀⌸⍤โอเปอเรเตอร์
Zacharý


9

Python 2 , 56 ไบต์

โซลูชันนี้มีการจัดทำดัชนี 0 สิ่งนี้เป็นการละเมิดข้อเท็จจริงที่sorted()สร้างสำเนาของรายการดั้งเดิม

l=input()
for k in sorted(l):a=l.index(k);print a;l[a]=0

ลองออนไลน์!


ทำไมคุณถึงเลิกทำอย่างนี้?
Erik the Outgolfer

@EriktheOutgolfer แก้ไขการย้อนกลับ
Mr. Xcoder

9

Javascript (ES6), 39 ไบต์

-2 ไบต์ขอบคุณ @powelles

ใช้งานได้ในเบราว์เซอร์ที่Array.prototype.sortเสถียรเท่านั้น

a=>[...a.keys()].sort((b,c)=>a[b]-a[c])

เวอร์ชันที่มีการจัดทำดัชนี (47 ไบต์):

a=>a.map((_,i)=>i+1).sort((b,c)=>a[b-1]-a[c-1])

ตัวอย่างข้อมูลโค้ด:

f=
a=>[...a.keys()].sort((b,c)=>a[b]-a[c])
console.log("7,4,5 => "+f([7,4,5]))
console.log("1,2,3 => "+f([1,2,3]))
console.log("2,6,1,9,1,2,3 => "+f([2,6,1,9,1,2,3]))
console.log("4 -> "+f([4]))


[...a.keys()]แทนที่จะa.map((_,i)=>i)ช่วยให้คุณประหยัดสองไบต์
powelles

7

Python 2 , 48 ไบต์

lambda x:sorted(range(len(x)),key=x.__getitem__)

ลองออนไลน์!


เยี่ยมมากฉันโดน outgolfed> _ < ฉันเปลี่ยนคำตอบเป็น Python 3 ฉันไม่รู้สึกแย่ขนาดนั้น
Mr. Xcoder

4
@ Mr.Xcoder อืมนั่นเป็นงานของเขา ...
Neil

@ Mr.Xcoder มาเลยคุณไม่ควรรู้สึกแย่ขนาดนั้น! คุณสร้างโปรแกรมเต็มรูปแบบฉันสร้างฟังก์ชั่นและวิธีการของฉันก็แตกต่างกันเล็กน้อย
Erik the Outgolfer

ฉันไม่รู้สึกแย่ฉันรู้ว่าสิ่งนี้จะปรากฏขึ้น (ฉันเกลียด__<blahblah>__ไวยากรณ์) ฉันจะทำวุ้นบางอย่างผมไม่ต้องการที่จะสูญเสียการฝึกอบรมของฉัน :)
นาย Xcoder

1
@ Mr.Xcoder Codegolf ไม่ได้หมายถึงไวยากรณ์และการจัดรูปแบบที่สวยงาม ;)
Erik the Outgolfer



4

Swift 4 , 82 bytes

func f(l:[Int]){var l=l;for k in l.sorted(){let a=l.index(of:k)!;print(a);l[a]=0}}

ชุดทดสอบ

คำอธิบาย

ใน Swift l.sorted()สร้างสำเนาที่เรียงลำดับของ Array ดั้งเดิม เราวนรอบองค์ประกอบที่เรียงลำดับในรายการและหลังจากพิมพ์ดัชนีของแต่ละรายการใน Array ดั้งเดิมด้วยlet a=l.index(of:k)!;print(a)และจากนั้นเพื่อรักษาดัชนีที่ถูกต้องใน Array เราได้กำหนดl[a]ให้0เพราะมันไม่ส่งผลกระทบต่อผลลัพธ์ปกติของเรา


โปรดทราบว่านี่เป็นดัชนี 0 เนื่องจากเป็นพอร์ตของโซลูชัน Python ของฉัน หากคุณต้องการให้มีการจัดทำดัชนี 1 ให้แทนที่print(a)ด้วยprint(a+1)หรือลองออนไลน์! .


4

R , 5 ไบต์

มีฟังก์ชั่น builtin สำหรับสิ่งนี้

order

3
กฎมาตรฐานคือการให้โปรแกรมฟังก์ชั่น มีอยู่แล้วเป็นฟังก์ชั่นเพื่อให้คุณไม่จำเป็นต้องจัดการกับการป้อนข้อมูลโดยใช้order scan()นี่จะเป็น 5 ไบต์
JAD

rank()จะช่วยประหยัด byte
gstats

1
ฉันแน่ใจว่ามีrankคำตอบโดย @JarkoDubbeldam แต่ฉันไม่เห็นอีกต่อไป
djhurio

1
ถูกต้องมันไม่เป็นไปตามข้อกำหนดดังนั้นฉันจึงลบมัน
JAD




3

อ็อกเทฟ 17 ไบต์

@(i)[~,y]=sort(i)

ลองออนไลน์!

อ็อกเทฟเป็นเหมือน MATLAB แต่มีการมอบหมายแบบอินไลน์ทำให้เป็นไปได้ที่จะทำให้คนที่ปวดหัวใน Mathworks HQ มันไม่สำคัญว่าคุณจะเรียกมันว่าอะไรyแต่คุณไม่สามารถทำได้ถ้าไม่มีตัวแปรตัวจำลองเท่าที่ฉันรู้


3

MY , 3 ไบต์

ฉันยังมี builtin สำหรับสิ่งนี้!

⎕⍋↵

ลองออนไลน์!

อย่างไร?

การประเมินผลการป้อนข้อมูลเกรดขึ้นแล้วส่งออกด้วยการขึ้นบรรทัดใหม่

จัดทำดัชนี แต่คุณตั้งค่าดัชนีที่มี/ 0x48(สามารถเป็นจำนวนเต็มแปลก ๆ เช่น-1หรือ2ค่าเริ่มต้นคือ1)


3

Java 8, 128 + 19 = 147 ไบต์

ขึ้นอยู่กับนาย Xcoder ของการแก้ปัญหา 0-based แลมบ์ดาจะเข้าเป็นและผลตอบแทนInteger[] Integer[]จำนวนไบต์รวมถึงการแสดงออกแลมบ์ดาและการนำเข้าที่จำเป็น

import java.util.*;

l->{Integer o[]=l.clone(),s[]=l.clone(),i=0;for(Arrays.sort(s);i<l.length;)l[o[i]=Arrays.asList(l).indexOf(s[i++])]=0;return o;}

ลองออนไลน์

แลมบ์ดา

l -> {
    Integer
        o[] = l.clone(),
        s[] = l.clone(),
        i = 0
    ;
    for (Arrays.sort(s); i < l.length; )
        l[o[i] = Arrays.asList(l).indexOf(s[i++])] = 0;
    return o;
}

หมายเหตุ

ฉันใช้Integer[]แทนint[]การอนุญาตให้ใช้Arrays.asListซึ่งไม่มีรุ่นดั้งเดิม Integerเป็นที่ต้องการLongเนื่องจากค่าที่ใช้เป็นดัชนีอาเรย์

จบลงด้วยการที่สั้นกว่าสไตล์ขั้นตอนที่ดีที่สุดของฉัน Listโซลูชันเนื่องจากราคาของคลาสและชื่อเมธอด

สิ่งนี้ยังเอาชนะโซลูชันที่ฉันพยายามที่สตรีมอินพุตแม็พกับคู่(ค่าดัชนี)เรียงลำดับตามค่าและแมปกับดัชนีส่วนใหญ่เป็นเพราะสัมภาระที่จำเป็นในการรวบรวมสตรีม

กิตติกรรมประกาศ

  • -5 ไบต์ขอบคุณNevay

1
คุณไม่ต้องการj: l->{Integer o[]=l.clone(),s[]=l.clone(),i=0;for(Arrays.sort(s);i<l.length;l[o[i]=Arrays.asList(l).indexOf(s[i++])]=0);return o;}(19 + 128 ไบต์)
Nevay




2

MATLAB / Octave , 29 ไบต์

[~,y]=sort(input(''));disp(y)

ลองออนไลน์!


While your answer is perfect MATLAB, you can actually do inline assignment in anonymous functions in Octave.
Sanchises

Good one! I knew about in-line assignment, but I didn't know you could output directly like that
Luis Mendo

1
To be honest, me neither. I started with something like @(X)([~,y]=sort(X)), and while I was looking of a way to get y from this, I realized y was actually the return value from the assignment, and closer inspection revealed that brackets weren't even needed. MATLAB likes everything explicit; Octave is happy when it's unambiguous.
Sanchises

2

JavaScript (ES6), 69 bytes

0-indexed. Works for lists containing up to 65,536 elements.

a=>[...a=a.map((n,i)=>n<<16|i)].sort((a,b)=>a-b).map(n=>a.indexOf(n))

Test cases


Can you change n=>a.indexOf(n) to just a.indexOf?
Zacharý

@Zacharý Unfortunately not. A method of an instanced object cannot be used as a callback.
Arnauld

@Zacharý Even worse is that Array#map passes 3 arguments to the callback function, and Array#indexOf expects 2, so it will give undesirable results.
kamoroso94



2

Java (OpenJDK 8), 72 bytes

l->l.stream().sorted().map(i->{int j=l.indexOf(i);l.set(j,0);return j;})

Try it online!

Takes a List<Integer>, returns a Stream<Integer> containing the results.

We get a Stream based off the initial list, sort it, then map each number to it's index in the list. In order to accommodate duplicate elements, we set the original element in the list to 0.


2

SmileBASIC, 67 bytes

DEF I(A)DIM B[0]FOR I=1TO LEN(A)PUSH B,I
NEXT
SORT A,B
RETURN B
END

Very simple, all it does is generate a list of numbers from 1 to (length of array) and sort this by the same order as the input.


2

Python 3 with Numpy, 38 26 bytes

12 bytes saved thanks to Jo King (no need to give the function a name)

import numpy
numpy.argsort

Output is 0-based.

Try it online!


The function could just be numpy.argsort without the lambda part
Jo King

@JoKing Thanks for the suggestion. I wrote it that way because with just numpy.argsort;import numpy I get an error (numpy has not been imported yet), and with import numpy;numpy.argsort I need to move f= to the code part. Do you know that the standard procedure is in these cases? Move the f= and not count it?
Luis Mendo

Yeah, I guess. Maybe just redefine f=numpy.argsort in the footer
Jo King

@JoKing Good idea. Done. Thanks!
Luis Mendo




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