Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Sandbox

Post History

60%
+1 −0
Sandbox Generalized Sort

posted 3y ago by Moshi‭  ·  edited 3y ago by Moshi‭

#2: Post edited by user avatar Moshi‭ · 2021-09-01T21:29:17Z (about 3 years ago)
#1: Initial revision by user avatar Moshi‭ · 2021-08-27T20:50:18Z (about 3 years ago)
Generalized Sort
# Challenge

We all know and love the generic sort function, right? However, it only sorts based off one criterion - what if we want more? That's where you come in.

Your task is to sort an array based off an arbitrary number of comparison functions `c1`, `c2`, `c3`, etc.; first sort by comparing using `c1`, if there is a tie then sort by `c2`, if there is still a tie sort by `c3`, etc. Output order is undefined if none of the comparison functions breaks the tie.

## Example

Here is an example in JavaScript:

```javascript
function sort(array, ...comparators) {
	return array.sort((a, b) =>
		comparators.map(c => c(a, b)) // Apply comparisons
		           .find(r => r != 0)  // Find the first non-zero comparison
	);
}
```

[Try it online!](https://tio.run/##dZJNb8IwDIbP9Fd4XGg1CB/XiUmAtAPStAOHSWMcTAhrUEkqJwyxab@9c1sYtLBKTdU3z2s7sTf4iU6STn3H2JXKsvXOSK@tAWfJh0iEhzYIIaTdpkjoLbkIvoMGKb8jAwUgCjbENiwjGD4GjcYFLbaYhpJlkCURQbcLozRNDlBi2lnj2ATnR6y1WYWUuwjuhtCLIHc9sQo@VrDW5DwYazpfiuxFnKARPQQ/meSIHrziZQjzIA/ZnMRMeG0QpjY2zDbb5cbMqz3S6j/5NdZe1cWX1pg0XrGzrfbxSRzrJKkqeYZ6milulatiM0z4cmrcufxndVDkKnpNO5VTVYt6aoW/oYyRDtX8Zcgx2f0VV7OPlktVM5/Iau7i5JWI5SFvWm@d/NiGYFHMk@FLy4cj/wqXJtqHLWhF3PugbL3sc@P/JhJw3l@IxEpM1KSYFRUuWWL@iA9qeO8a7y1O4W2iePcjLMY@H7I25@N3EF0Vxy64B66N1@Kfk4qN1SZsvZu84OwX "JavaScript (Node.js) – Try It Online")

## Test Cases

Here is a test case, sorting first by last name then by first name.[^1]

```
Christina Johnson
Steward Johnson
Steward White
Steward O'Brian
Steward Smith
Bill Smith
John Johnson
James Smith
Sally Johnson
Christina Meyers
Chris Meyers
Steward Meyers
Bill O'Brian
Zachary Smith
Chris Brown
Zachary O'Brian
Abbey Smith
Zachary Meyers
John Brown
Sally Smith
Zachary Johnson
Chris White

=>

Chris Brown
John Brown
Christina Johnson
John Johnson
Sally Johnson
Steward Johnson
Zachary Johnson
Chris Meyers
Christina Meyers
Steward Meyers
Zachary Meyers
Bill O'Brian
Steward O'Brian
Zachary O'Brian
Abbey Smith
Bill Smith
James Smith
Sally Smith
Steward Smith
Zachary Smith
Chris White
Steward White
```

This is <a class="badge is-tag" href="https://codegolf.codidact.com/categories/49/tags/4274">code-golf</a>, so the entry with the lowest bytes wins!

[^1]: Incidentally, I generated this data with a short script