Reorder a Master List Based on a Reordered SubsetEpcot World ReorderN-chotomize a listRandom subset...
Why do I get two different answers for this counting problem?
Does detail obscure or enhance action?
I'm flying to France today and my passport expires in less than 2 months
Can an x86 CPU running in real mode be considered to be basically an 8086 CPU?
RSA: Danger of using p to create q
Alternative to sending password over mail?
Arrow those variables!
Watching something be written to a file live with tail
How do I draw and define two right triangles next to each other?
What is the word for reserving something for yourself before others do?
dbcc cleantable batch size explanation
LWC SFDX source push error TypeError: LWC1009: decl.moveTo is not a function
Client team has low performances and low technical skills: we always fix their work and now they stop collaborate with us. How to solve?
Languages that we cannot (dis)prove to be Context-Free
Paid for article while in US on F-1 visa?
How to draw a waving flag in TikZ
Why doesn't H₄O²⁺ exist?
Did Shadowfax go to Valinor?
Definite integral giving negative value as a result?
Character reincarnated...as a snail
Can you really stack all of this on an Opportunity Attack?
How to format long polynomial?
Why can't I see bouncing of a switch on an oscilloscope?
Was any UN Security Council vote triple-vetoed?
Reorder a Master List Based on a Reordered Subset
Epcot World ReorderN-chotomize a listRandom subset generatorFind Subset FactorsSort a difference listThe Three 'R's: Reverse, Reorder, RepeatDeep Search a ListN-bit Variation on Subset-SumFind unique elements based on a given keySubset Sum Orderings
$begingroup$
I recently had a problem to solve at work where I had two lists: a master list, and a smaller list that contains a subset of the items in the master list potentially in a different order. I needed to reorder the master list in such a way that the items in the subset would appear in the same order without changing the order of the items not found in the list and keeping items in the same location whenever possible. Okay, that probably sounds confusing, so I'll break it down:
- The master list defines the default order of items.
- The subset list defines relative order of certain items.
- Where the master list has two elements out of order according to the subset list, the item that is earlier in the master list should be moved to the earliest index where it is in the correct location relative to other items within the subset list. (i.e. immediately after the later item)
Your task is to implement this reordering algorithm.
Example Test Cases
Master: [1, 2, 3]
Subset: []
Result: [1, 2, 3]
Master: [9001, 42, 69, 1337, 420]
Subset: [69]
Result: [9001, 42, 69, 1337, 420]
Master: [9001, 42, 69, 1337, 420, 99, 255]
Subset: [69, 9001, 1337]
Result: [42, 69, 9001, 1337, 420, 99, 255]
Master: [1, 2, 3, 4, 5]
Subset: [2, 5]
Result: [1, 2, 3, 4, 5]
Master: [apple, banana, carrot, duck, elephant]
Subset: [duck, apple]
Result: [banana, carrot, duck, apple, elephant]
Master: [Alice, Betty, Carol, Debbie, Elaine, Felicia, Georgia, Helen, Ilene, Julia]
Subset: [Betty, Felicia, Carol, Julia]
Result: [Alice, Betty, Debbie, Elaine, Felicia, Carol, Georgia, Helen, Ilene, Julia]
Master: [snake, lizard, frog, werewolf, vulture, dog, human]
Subset: [snake, werewolf, lizard, human, dog]
Result: [snake, frog, werewolf, lizard, vulture, human, dog]
Master: [Pete, Rob, Jeff, Stan, Chris, Doug, Reggie, Paul, Alex]
Subset: [Jeff, Stan, Pete, Paul]
Result: [Rob, Jeff, Stan, Pete, Chris, Doug, Reggie, Paul, Alex]
Master: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Subset: [8, 1, 2, 12, 11, 10]
Result: [3, 4, 5, 6, 7, 8, 1, 2, 9, 12, 11, 10]
Master: [lol, rofl, lmao, roflmao, lqtm, smh, jk, wat]
Subset: [wat, lmao, rofl]
Result: [lol, roflmao, lqtm, smh, jk, wat, lmao, rofl]
Rules
- Standard loopholes, yadda yadda, convenient I/O, blah blah.
- Even though the examples use numbers and strings, you only need to support one element type, whether that's integers, strings, or anything else with well-defined equality semantics, including heterogeneous lists if that's convenient in your language.
- You may assume both the master list and the subset list contain no duplicates
- You may assume that all items found in the subset list are found in the master list
- Either list may be empty
- You must, at minimum, support arrays up to 100 elements long.
- Reordering may be implemented in-place or through the creation of a new list/array.
Happy Golfing!
code-golf array-manipulation
$endgroup$
add a comment |
$begingroup$
I recently had a problem to solve at work where I had two lists: a master list, and a smaller list that contains a subset of the items in the master list potentially in a different order. I needed to reorder the master list in such a way that the items in the subset would appear in the same order without changing the order of the items not found in the list and keeping items in the same location whenever possible. Okay, that probably sounds confusing, so I'll break it down:
- The master list defines the default order of items.
- The subset list defines relative order of certain items.
- Where the master list has two elements out of order according to the subset list, the item that is earlier in the master list should be moved to the earliest index where it is in the correct location relative to other items within the subset list. (i.e. immediately after the later item)
Your task is to implement this reordering algorithm.
Example Test Cases
Master: [1, 2, 3]
Subset: []
Result: [1, 2, 3]
Master: [9001, 42, 69, 1337, 420]
Subset: [69]
Result: [9001, 42, 69, 1337, 420]
Master: [9001, 42, 69, 1337, 420, 99, 255]
Subset: [69, 9001, 1337]
Result: [42, 69, 9001, 1337, 420, 99, 255]
Master: [1, 2, 3, 4, 5]
Subset: [2, 5]
Result: [1, 2, 3, 4, 5]
Master: [apple, banana, carrot, duck, elephant]
Subset: [duck, apple]
Result: [banana, carrot, duck, apple, elephant]
Master: [Alice, Betty, Carol, Debbie, Elaine, Felicia, Georgia, Helen, Ilene, Julia]
Subset: [Betty, Felicia, Carol, Julia]
Result: [Alice, Betty, Debbie, Elaine, Felicia, Carol, Georgia, Helen, Ilene, Julia]
Master: [snake, lizard, frog, werewolf, vulture, dog, human]
Subset: [snake, werewolf, lizard, human, dog]
Result: [snake, frog, werewolf, lizard, vulture, human, dog]
Master: [Pete, Rob, Jeff, Stan, Chris, Doug, Reggie, Paul, Alex]
Subset: [Jeff, Stan, Pete, Paul]
Result: [Rob, Jeff, Stan, Pete, Chris, Doug, Reggie, Paul, Alex]
Master: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Subset: [8, 1, 2, 12, 11, 10]
Result: [3, 4, 5, 6, 7, 8, 1, 2, 9, 12, 11, 10]
Master: [lol, rofl, lmao, roflmao, lqtm, smh, jk, wat]
Subset: [wat, lmao, rofl]
Result: [lol, roflmao, lqtm, smh, jk, wat, lmao, rofl]
Rules
- Standard loopholes, yadda yadda, convenient I/O, blah blah.
- Even though the examples use numbers and strings, you only need to support one element type, whether that's integers, strings, or anything else with well-defined equality semantics, including heterogeneous lists if that's convenient in your language.
- You may assume both the master list and the subset list contain no duplicates
- You may assume that all items found in the subset list are found in the master list
- Either list may be empty
- You must, at minimum, support arrays up to 100 elements long.
- Reordering may be implemented in-place or through the creation of a new list/array.
Happy Golfing!
code-golf array-manipulation
$endgroup$
$begingroup$
A nice, beefy problem.
$endgroup$
– Jonah
yesterday
$begingroup$
Is8 1 3 4 5 6 7 2 9 12 11 10
a valid solution to the second-to-last one?
$endgroup$
– Ven
15 hours ago
$begingroup$
@Ven No. Even though that fits within the constraints of keeping the subset items in the same relative order, I wanted to make sure there was only one correct answer, so the earlier out-of-order item should be moved to be after the later out-of-order item.
$endgroup$
– Beefster
13 hours ago
add a comment |
$begingroup$
I recently had a problem to solve at work where I had two lists: a master list, and a smaller list that contains a subset of the items in the master list potentially in a different order. I needed to reorder the master list in such a way that the items in the subset would appear in the same order without changing the order of the items not found in the list and keeping items in the same location whenever possible. Okay, that probably sounds confusing, so I'll break it down:
- The master list defines the default order of items.
- The subset list defines relative order of certain items.
- Where the master list has two elements out of order according to the subset list, the item that is earlier in the master list should be moved to the earliest index where it is in the correct location relative to other items within the subset list. (i.e. immediately after the later item)
Your task is to implement this reordering algorithm.
Example Test Cases
Master: [1, 2, 3]
Subset: []
Result: [1, 2, 3]
Master: [9001, 42, 69, 1337, 420]
Subset: [69]
Result: [9001, 42, 69, 1337, 420]
Master: [9001, 42, 69, 1337, 420, 99, 255]
Subset: [69, 9001, 1337]
Result: [42, 69, 9001, 1337, 420, 99, 255]
Master: [1, 2, 3, 4, 5]
Subset: [2, 5]
Result: [1, 2, 3, 4, 5]
Master: [apple, banana, carrot, duck, elephant]
Subset: [duck, apple]
Result: [banana, carrot, duck, apple, elephant]
Master: [Alice, Betty, Carol, Debbie, Elaine, Felicia, Georgia, Helen, Ilene, Julia]
Subset: [Betty, Felicia, Carol, Julia]
Result: [Alice, Betty, Debbie, Elaine, Felicia, Carol, Georgia, Helen, Ilene, Julia]
Master: [snake, lizard, frog, werewolf, vulture, dog, human]
Subset: [snake, werewolf, lizard, human, dog]
Result: [snake, frog, werewolf, lizard, vulture, human, dog]
Master: [Pete, Rob, Jeff, Stan, Chris, Doug, Reggie, Paul, Alex]
Subset: [Jeff, Stan, Pete, Paul]
Result: [Rob, Jeff, Stan, Pete, Chris, Doug, Reggie, Paul, Alex]
Master: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Subset: [8, 1, 2, 12, 11, 10]
Result: [3, 4, 5, 6, 7, 8, 1, 2, 9, 12, 11, 10]
Master: [lol, rofl, lmao, roflmao, lqtm, smh, jk, wat]
Subset: [wat, lmao, rofl]
Result: [lol, roflmao, lqtm, smh, jk, wat, lmao, rofl]
Rules
- Standard loopholes, yadda yadda, convenient I/O, blah blah.
- Even though the examples use numbers and strings, you only need to support one element type, whether that's integers, strings, or anything else with well-defined equality semantics, including heterogeneous lists if that's convenient in your language.
- You may assume both the master list and the subset list contain no duplicates
- You may assume that all items found in the subset list are found in the master list
- Either list may be empty
- You must, at minimum, support arrays up to 100 elements long.
- Reordering may be implemented in-place or through the creation of a new list/array.
Happy Golfing!
code-golf array-manipulation
$endgroup$
I recently had a problem to solve at work where I had two lists: a master list, and a smaller list that contains a subset of the items in the master list potentially in a different order. I needed to reorder the master list in such a way that the items in the subset would appear in the same order without changing the order of the items not found in the list and keeping items in the same location whenever possible. Okay, that probably sounds confusing, so I'll break it down:
- The master list defines the default order of items.
- The subset list defines relative order of certain items.
- Where the master list has two elements out of order according to the subset list, the item that is earlier in the master list should be moved to the earliest index where it is in the correct location relative to other items within the subset list. (i.e. immediately after the later item)
Your task is to implement this reordering algorithm.
Example Test Cases
Master: [1, 2, 3]
Subset: []
Result: [1, 2, 3]
Master: [9001, 42, 69, 1337, 420]
Subset: [69]
Result: [9001, 42, 69, 1337, 420]
Master: [9001, 42, 69, 1337, 420, 99, 255]
Subset: [69, 9001, 1337]
Result: [42, 69, 9001, 1337, 420, 99, 255]
Master: [1, 2, 3, 4, 5]
Subset: [2, 5]
Result: [1, 2, 3, 4, 5]
Master: [apple, banana, carrot, duck, elephant]
Subset: [duck, apple]
Result: [banana, carrot, duck, apple, elephant]
Master: [Alice, Betty, Carol, Debbie, Elaine, Felicia, Georgia, Helen, Ilene, Julia]
Subset: [Betty, Felicia, Carol, Julia]
Result: [Alice, Betty, Debbie, Elaine, Felicia, Carol, Georgia, Helen, Ilene, Julia]
Master: [snake, lizard, frog, werewolf, vulture, dog, human]
Subset: [snake, werewolf, lizard, human, dog]
Result: [snake, frog, werewolf, lizard, vulture, human, dog]
Master: [Pete, Rob, Jeff, Stan, Chris, Doug, Reggie, Paul, Alex]
Subset: [Jeff, Stan, Pete, Paul]
Result: [Rob, Jeff, Stan, Pete, Chris, Doug, Reggie, Paul, Alex]
Master: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Subset: [8, 1, 2, 12, 11, 10]
Result: [3, 4, 5, 6, 7, 8, 1, 2, 9, 12, 11, 10]
Master: [lol, rofl, lmao, roflmao, lqtm, smh, jk, wat]
Subset: [wat, lmao, rofl]
Result: [lol, roflmao, lqtm, smh, jk, wat, lmao, rofl]
Rules
- Standard loopholes, yadda yadda, convenient I/O, blah blah.
- Even though the examples use numbers and strings, you only need to support one element type, whether that's integers, strings, or anything else with well-defined equality semantics, including heterogeneous lists if that's convenient in your language.
- You may assume both the master list and the subset list contain no duplicates
- You may assume that all items found in the subset list are found in the master list
- Either list may be empty
- You must, at minimum, support arrays up to 100 elements long.
- Reordering may be implemented in-place or through the creation of a new list/array.
Happy Golfing!
code-golf array-manipulation
code-golf array-manipulation
asked yesterday
BeefsterBeefster
2,4321141
2,4321141
$begingroup$
A nice, beefy problem.
$endgroup$
– Jonah
yesterday
$begingroup$
Is8 1 3 4 5 6 7 2 9 12 11 10
a valid solution to the second-to-last one?
$endgroup$
– Ven
15 hours ago
$begingroup$
@Ven No. Even though that fits within the constraints of keeping the subset items in the same relative order, I wanted to make sure there was only one correct answer, so the earlier out-of-order item should be moved to be after the later out-of-order item.
$endgroup$
– Beefster
13 hours ago
add a comment |
$begingroup$
A nice, beefy problem.
$endgroup$
– Jonah
yesterday
$begingroup$
Is8 1 3 4 5 6 7 2 9 12 11 10
a valid solution to the second-to-last one?
$endgroup$
– Ven
15 hours ago
$begingroup$
@Ven No. Even though that fits within the constraints of keeping the subset items in the same relative order, I wanted to make sure there was only one correct answer, so the earlier out-of-order item should be moved to be after the later out-of-order item.
$endgroup$
– Beefster
13 hours ago
$begingroup$
A nice, beefy problem.
$endgroup$
– Jonah
yesterday
$begingroup$
A nice, beefy problem.
$endgroup$
– Jonah
yesterday
$begingroup$
Is
8 1 3 4 5 6 7 2 9 12 11 10
a valid solution to the second-to-last one?$endgroup$
– Ven
15 hours ago
$begingroup$
Is
8 1 3 4 5 6 7 2 9 12 11 10
a valid solution to the second-to-last one?$endgroup$
– Ven
15 hours ago
$begingroup$
@Ven No. Even though that fits within the constraints of keeping the subset items in the same relative order, I wanted to make sure there was only one correct answer, so the earlier out-of-order item should be moved to be after the later out-of-order item.
$endgroup$
– Beefster
13 hours ago
$begingroup$
@Ven No. Even though that fits within the constraints of keeping the subset items in the same relative order, I wanted to make sure there was only one correct answer, so the earlier out-of-order item should be moved to be after the later out-of-order item.
$endgroup$
– Beefster
13 hours ago
add a comment |
9 Answers
9
active
oldest
votes
$begingroup$
Retina 0.8.2, 51 bytes
+`(b(w+),(w+)b.*¶.*b)3,(.*b2b)
$1$4,$3
1A`
Try it online! Takes input as a comma-separated list of subwords on the first line and a comma-separated master list of words on the second line. Explanation:
(b(w+),(w+)b.*¶.*b)3,(.*b2b)
Find two adjacent subwords where the second word precedes the first on the master list.
$1$4,$3
Move the second word to appear after the first word in the master list.
+`
Repeat until no words appear out of order.
1A`
Delete the subwords.
$endgroup$
add a comment |
$begingroup$
JavaScript (ES6), 96 89 74 71 bytes
This started as a bulky mess and was eventually shrunk to a rather concise and elegant form. I'd like to thank the .splice() method for its fruitful collaboration on that one. ;)
Takes input as (master)(subset)
. Outputs by updating the master list.
m=>s=>s.map(p=x=>m.splice(p,0,...m.splice(i=m.indexOf(x),p>i||!(p=i))))
Try it online!
How?
We are using two nested .splice() methods on the same array to conditionally move an element from position $i$ to position $p$:
m.splice(p, 0, ...m.splice(i, condition))
If the condition is truthy (coerced to $1$):
- the inner .splice() removes and returns the element at position $i$ as a singleton array $[element]$
- thanks to the spread syntax, this element is expanded as a 3rd argument for the outer .splice(), which causes it to be inserted back at position $p$
If the condition is falsy (coerced to $0$):
- the inner .splice() removes nothing and returns an empty array
- as a result, the outer .splice() receives undefined as its 3rd argument and nothing is inserted either
Commented
m => s => // m[] = master list, s[] = subset list
s.map( //
p = // p = position in the master list of the last element from
// the subset list (initialized to a non-numeric value)
x => // for each element x in the subset list:
m.splice( // insert in the master list:
p, // at position p
0, // without removing any element
...m.splice( // remove from the master list and flatten:
i = m.indexOf(x), // i = position of x in the master list
p > i // if p is greater than i, remove x from its current
// position and insert it at position p
|| !(p = i) // otherwise, set p to i and don't remove/insert anything
) // end of inner splice()
) // end of outer splice()
) // end of map()
$endgroup$
1
$begingroup$
"I'd like to thank the .splice() method for ..." Cue PPCG Oscar's Music... :)
$endgroup$
– Chas Brown
yesterday
add a comment |
$begingroup$
Haskell, 79 bytes
(m:n)#u@(s:t)|m==s=m:n#t|all(/=m)u=m:n#u|(x,_:z)<-span(/=s)n=(x++s:m:z)#u
m#_=m
Try it online!
(m:n)#u@(s:t) -- m: head of master list
-- n: tail of master list
-- s: head of subset
-- t: tail of subset
-- u: whole subset
|m==s -- if m==s
=m:n#t -- return 'm' and append a recursive call with 'n' and 't'
|all(/=m)u -- if 'm' is not in 'u'
=m:n#u -- return 'm' and append a recursive call with 'n' and 'u'
| -- else (note: 's' is element of 'n')
(x,_:z)<-span(/=s)n -- split 'n' into a list 'x' before element 's' and
-- a list 'z' after element 's' and
= (x++s:m:z)#u -- make a recursive call with
-- x++s:m:z as the new master list (i.e. 'm' inserted into 'n' after 's')
-- and 'u'
m # _ = m -- if either list is emtpy, return the master list
$endgroup$
add a comment |
$begingroup$
J, 49 bytes
[:(<@({:+i.@>:@-/)@i.~C.])^:(>/@i.~)&.>/]|.@;2<[
Try it online!
Will golf further and add explanation tomorrow
$endgroup$
add a comment |
$begingroup$
Ruby, 73 68 bytes
->a,b{0while b.zip(a&b).find{|m,n|m!=n&&a=a[0..a.index(m)]-[n]|a};a}
Try it online!
How?
- The intersection between
a
andb
contains all elements ofb
, but in the same order as we would find them ina
- So, if we iterate on
b
and on the intersection in parallel, as soon as we find a difference, we can relocate a single element. - Relocation is done by cutting
a
on the position of the element we found inb
, then removing the element we found in the intersection, and then adding the remainder of a. - Repeat from the beginning, until all elements of
b
are in the right order ina
$endgroup$
$begingroup$
what is the 0 doing in0while
?
$endgroup$
– Jonah
14 hours ago
$begingroup$
It's just a NOP.
$endgroup$
– G B
13 hours ago
$begingroup$
why is it needed?
$endgroup$
– Jonah
12 hours ago
add a comment |
$begingroup$
Python 2, 124 109 106 99 96 bytes
def f(a,b,i=0):
while b[i+1:]:x,y=map(a.index,b)[i:i+2];i+=1;x>y>a.insert(x,a.pop(y))
return a
Try it online!
$endgroup$
add a comment |
$begingroup$
Perl 6, 40 bytes
{*.permutations.first(*.grep(.any)eq$_)}
Try it online!
Anonymous code block that takes the input curried (like f(subList)(masterList)
, and finds the first lexographical permutation of the indexes of the master list where the elements from the sub list are in the correct order.
Intuitively, the first satisfying permutation will leave the correctly ordered elements in the original order, while moving the incorrectly placed ones the minimum needed distance forward in order to have them in the correct order, which places them directly after the previous element in the subset.
Explanation:
{* } # Anonymous code block that returns a lambda
.permutations # In all permutations of the master list
.first( ) # Find the first permutation
(*.grep(.any) # Where the order of the subset
eq$_ # Is the same as the given order
$endgroup$
add a comment |
$begingroup$
Jelly, 9 bytes
Œ!iⱮṢƑ¥ƇḢ
Try it online! or Test suite
Inefficient, particularly with large master lists. Generates all possible permutations, filters out those where the subset is in the wrong order, and then returns the first.
Alternatively, a faster approach is:
Jelly, 24 bytes
i@€MƤFṬœṗƲḊ;JḟF}W€ʋ@¥ṢFị
Try it online!
$endgroup$
$begingroup$
This doesn't seem like it would conform to the rule "Where the master list has two elements out of order according to the subset list, the item that is earlier in the master list should be moved to the earliest index where it is in the correct location relative to other items within the subset list. (i.e. immediately after the later item)"
$endgroup$
– Beefster
9 hours ago
$begingroup$
@Beefster it works on the ones I’ve tried so far. I think the ordering of the permutations is such that this is the correct result. Happy to be proved wrong if there’s a counterexample.
$endgroup$
– Nick Kennedy
9 hours ago
$begingroup$
@Beefster I’ve now tried all of your examples except the female names and the 1..12 and the ordering of the result is correct.
$endgroup$
– Nick Kennedy
8 hours ago
$begingroup$
@Beefster My answer has a partial explanation for why this works
$endgroup$
– Jo King
3 hours ago
add a comment |
$begingroup$
C# (Visual C# Interactive Compiler), 136 bytes
a=>b=>{for(int i=0,j;i<b.Count;)foreach(var e in a.Take(j=a.IndexOf(b[i++])).Intersect(b.Skip(i)).ToList()){a.Remove(e);a.Insert(j,e);}}
Try it online!
$endgroup$
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "200"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f182677%2freorder-a-master-list-based-on-a-reordered-subset%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
9 Answers
9
active
oldest
votes
9 Answers
9
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
Retina 0.8.2, 51 bytes
+`(b(w+),(w+)b.*¶.*b)3,(.*b2b)
$1$4,$3
1A`
Try it online! Takes input as a comma-separated list of subwords on the first line and a comma-separated master list of words on the second line. Explanation:
(b(w+),(w+)b.*¶.*b)3,(.*b2b)
Find two adjacent subwords where the second word precedes the first on the master list.
$1$4,$3
Move the second word to appear after the first word in the master list.
+`
Repeat until no words appear out of order.
1A`
Delete the subwords.
$endgroup$
add a comment |
$begingroup$
Retina 0.8.2, 51 bytes
+`(b(w+),(w+)b.*¶.*b)3,(.*b2b)
$1$4,$3
1A`
Try it online! Takes input as a comma-separated list of subwords on the first line and a comma-separated master list of words on the second line. Explanation:
(b(w+),(w+)b.*¶.*b)3,(.*b2b)
Find two adjacent subwords where the second word precedes the first on the master list.
$1$4,$3
Move the second word to appear after the first word in the master list.
+`
Repeat until no words appear out of order.
1A`
Delete the subwords.
$endgroup$
add a comment |
$begingroup$
Retina 0.8.2, 51 bytes
+`(b(w+),(w+)b.*¶.*b)3,(.*b2b)
$1$4,$3
1A`
Try it online! Takes input as a comma-separated list of subwords on the first line and a comma-separated master list of words on the second line. Explanation:
(b(w+),(w+)b.*¶.*b)3,(.*b2b)
Find two adjacent subwords where the second word precedes the first on the master list.
$1$4,$3
Move the second word to appear after the first word in the master list.
+`
Repeat until no words appear out of order.
1A`
Delete the subwords.
$endgroup$
Retina 0.8.2, 51 bytes
+`(b(w+),(w+)b.*¶.*b)3,(.*b2b)
$1$4,$3
1A`
Try it online! Takes input as a comma-separated list of subwords on the first line and a comma-separated master list of words on the second line. Explanation:
(b(w+),(w+)b.*¶.*b)3,(.*b2b)
Find two adjacent subwords where the second word precedes the first on the master list.
$1$4,$3
Move the second word to appear after the first word in the master list.
+`
Repeat until no words appear out of order.
1A`
Delete the subwords.
answered yesterday
NeilNeil
82.5k745179
82.5k745179
add a comment |
add a comment |
$begingroup$
JavaScript (ES6), 96 89 74 71 bytes
This started as a bulky mess and was eventually shrunk to a rather concise and elegant form. I'd like to thank the .splice() method for its fruitful collaboration on that one. ;)
Takes input as (master)(subset)
. Outputs by updating the master list.
m=>s=>s.map(p=x=>m.splice(p,0,...m.splice(i=m.indexOf(x),p>i||!(p=i))))
Try it online!
How?
We are using two nested .splice() methods on the same array to conditionally move an element from position $i$ to position $p$:
m.splice(p, 0, ...m.splice(i, condition))
If the condition is truthy (coerced to $1$):
- the inner .splice() removes and returns the element at position $i$ as a singleton array $[element]$
- thanks to the spread syntax, this element is expanded as a 3rd argument for the outer .splice(), which causes it to be inserted back at position $p$
If the condition is falsy (coerced to $0$):
- the inner .splice() removes nothing and returns an empty array
- as a result, the outer .splice() receives undefined as its 3rd argument and nothing is inserted either
Commented
m => s => // m[] = master list, s[] = subset list
s.map( //
p = // p = position in the master list of the last element from
// the subset list (initialized to a non-numeric value)
x => // for each element x in the subset list:
m.splice( // insert in the master list:
p, // at position p
0, // without removing any element
...m.splice( // remove from the master list and flatten:
i = m.indexOf(x), // i = position of x in the master list
p > i // if p is greater than i, remove x from its current
// position and insert it at position p
|| !(p = i) // otherwise, set p to i and don't remove/insert anything
) // end of inner splice()
) // end of outer splice()
) // end of map()
$endgroup$
1
$begingroup$
"I'd like to thank the .splice() method for ..." Cue PPCG Oscar's Music... :)
$endgroup$
– Chas Brown
yesterday
add a comment |
$begingroup$
JavaScript (ES6), 96 89 74 71 bytes
This started as a bulky mess and was eventually shrunk to a rather concise and elegant form. I'd like to thank the .splice() method for its fruitful collaboration on that one. ;)
Takes input as (master)(subset)
. Outputs by updating the master list.
m=>s=>s.map(p=x=>m.splice(p,0,...m.splice(i=m.indexOf(x),p>i||!(p=i))))
Try it online!
How?
We are using two nested .splice() methods on the same array to conditionally move an element from position $i$ to position $p$:
m.splice(p, 0, ...m.splice(i, condition))
If the condition is truthy (coerced to $1$):
- the inner .splice() removes and returns the element at position $i$ as a singleton array $[element]$
- thanks to the spread syntax, this element is expanded as a 3rd argument for the outer .splice(), which causes it to be inserted back at position $p$
If the condition is falsy (coerced to $0$):
- the inner .splice() removes nothing and returns an empty array
- as a result, the outer .splice() receives undefined as its 3rd argument and nothing is inserted either
Commented
m => s => // m[] = master list, s[] = subset list
s.map( //
p = // p = position in the master list of the last element from
// the subset list (initialized to a non-numeric value)
x => // for each element x in the subset list:
m.splice( // insert in the master list:
p, // at position p
0, // without removing any element
...m.splice( // remove from the master list and flatten:
i = m.indexOf(x), // i = position of x in the master list
p > i // if p is greater than i, remove x from its current
// position and insert it at position p
|| !(p = i) // otherwise, set p to i and don't remove/insert anything
) // end of inner splice()
) // end of outer splice()
) // end of map()
$endgroup$
1
$begingroup$
"I'd like to thank the .splice() method for ..." Cue PPCG Oscar's Music... :)
$endgroup$
– Chas Brown
yesterday
add a comment |
$begingroup$
JavaScript (ES6), 96 89 74 71 bytes
This started as a bulky mess and was eventually shrunk to a rather concise and elegant form. I'd like to thank the .splice() method for its fruitful collaboration on that one. ;)
Takes input as (master)(subset)
. Outputs by updating the master list.
m=>s=>s.map(p=x=>m.splice(p,0,...m.splice(i=m.indexOf(x),p>i||!(p=i))))
Try it online!
How?
We are using two nested .splice() methods on the same array to conditionally move an element from position $i$ to position $p$:
m.splice(p, 0, ...m.splice(i, condition))
If the condition is truthy (coerced to $1$):
- the inner .splice() removes and returns the element at position $i$ as a singleton array $[element]$
- thanks to the spread syntax, this element is expanded as a 3rd argument for the outer .splice(), which causes it to be inserted back at position $p$
If the condition is falsy (coerced to $0$):
- the inner .splice() removes nothing and returns an empty array
- as a result, the outer .splice() receives undefined as its 3rd argument and nothing is inserted either
Commented
m => s => // m[] = master list, s[] = subset list
s.map( //
p = // p = position in the master list of the last element from
// the subset list (initialized to a non-numeric value)
x => // for each element x in the subset list:
m.splice( // insert in the master list:
p, // at position p
0, // without removing any element
...m.splice( // remove from the master list and flatten:
i = m.indexOf(x), // i = position of x in the master list
p > i // if p is greater than i, remove x from its current
// position and insert it at position p
|| !(p = i) // otherwise, set p to i and don't remove/insert anything
) // end of inner splice()
) // end of outer splice()
) // end of map()
$endgroup$
JavaScript (ES6), 96 89 74 71 bytes
This started as a bulky mess and was eventually shrunk to a rather concise and elegant form. I'd like to thank the .splice() method for its fruitful collaboration on that one. ;)
Takes input as (master)(subset)
. Outputs by updating the master list.
m=>s=>s.map(p=x=>m.splice(p,0,...m.splice(i=m.indexOf(x),p>i||!(p=i))))
Try it online!
How?
We are using two nested .splice() methods on the same array to conditionally move an element from position $i$ to position $p$:
m.splice(p, 0, ...m.splice(i, condition))
If the condition is truthy (coerced to $1$):
- the inner .splice() removes and returns the element at position $i$ as a singleton array $[element]$
- thanks to the spread syntax, this element is expanded as a 3rd argument for the outer .splice(), which causes it to be inserted back at position $p$
If the condition is falsy (coerced to $0$):
- the inner .splice() removes nothing and returns an empty array
- as a result, the outer .splice() receives undefined as its 3rd argument and nothing is inserted either
Commented
m => s => // m[] = master list, s[] = subset list
s.map( //
p = // p = position in the master list of the last element from
// the subset list (initialized to a non-numeric value)
x => // for each element x in the subset list:
m.splice( // insert in the master list:
p, // at position p
0, // without removing any element
...m.splice( // remove from the master list and flatten:
i = m.indexOf(x), // i = position of x in the master list
p > i // if p is greater than i, remove x from its current
// position and insert it at position p
|| !(p = i) // otherwise, set p to i and don't remove/insert anything
) // end of inner splice()
) // end of outer splice()
) // end of map()
edited 20 hours ago
answered yesterday
ArnauldArnauld
80.4k797333
80.4k797333
1
$begingroup$
"I'd like to thank the .splice() method for ..." Cue PPCG Oscar's Music... :)
$endgroup$
– Chas Brown
yesterday
add a comment |
1
$begingroup$
"I'd like to thank the .splice() method for ..." Cue PPCG Oscar's Music... :)
$endgroup$
– Chas Brown
yesterday
1
1
$begingroup$
"I'd like to thank the .splice() method for ..." Cue PPCG Oscar's Music... :)
$endgroup$
– Chas Brown
yesterday
$begingroup$
"I'd like to thank the .splice() method for ..." Cue PPCG Oscar's Music... :)
$endgroup$
– Chas Brown
yesterday
add a comment |
$begingroup$
Haskell, 79 bytes
(m:n)#u@(s:t)|m==s=m:n#t|all(/=m)u=m:n#u|(x,_:z)<-span(/=s)n=(x++s:m:z)#u
m#_=m
Try it online!
(m:n)#u@(s:t) -- m: head of master list
-- n: tail of master list
-- s: head of subset
-- t: tail of subset
-- u: whole subset
|m==s -- if m==s
=m:n#t -- return 'm' and append a recursive call with 'n' and 't'
|all(/=m)u -- if 'm' is not in 'u'
=m:n#u -- return 'm' and append a recursive call with 'n' and 'u'
| -- else (note: 's' is element of 'n')
(x,_:z)<-span(/=s)n -- split 'n' into a list 'x' before element 's' and
-- a list 'z' after element 's' and
= (x++s:m:z)#u -- make a recursive call with
-- x++s:m:z as the new master list (i.e. 'm' inserted into 'n' after 's')
-- and 'u'
m # _ = m -- if either list is emtpy, return the master list
$endgroup$
add a comment |
$begingroup$
Haskell, 79 bytes
(m:n)#u@(s:t)|m==s=m:n#t|all(/=m)u=m:n#u|(x,_:z)<-span(/=s)n=(x++s:m:z)#u
m#_=m
Try it online!
(m:n)#u@(s:t) -- m: head of master list
-- n: tail of master list
-- s: head of subset
-- t: tail of subset
-- u: whole subset
|m==s -- if m==s
=m:n#t -- return 'm' and append a recursive call with 'n' and 't'
|all(/=m)u -- if 'm' is not in 'u'
=m:n#u -- return 'm' and append a recursive call with 'n' and 'u'
| -- else (note: 's' is element of 'n')
(x,_:z)<-span(/=s)n -- split 'n' into a list 'x' before element 's' and
-- a list 'z' after element 's' and
= (x++s:m:z)#u -- make a recursive call with
-- x++s:m:z as the new master list (i.e. 'm' inserted into 'n' after 's')
-- and 'u'
m # _ = m -- if either list is emtpy, return the master list
$endgroup$
add a comment |
$begingroup$
Haskell, 79 bytes
(m:n)#u@(s:t)|m==s=m:n#t|all(/=m)u=m:n#u|(x,_:z)<-span(/=s)n=(x++s:m:z)#u
m#_=m
Try it online!
(m:n)#u@(s:t) -- m: head of master list
-- n: tail of master list
-- s: head of subset
-- t: tail of subset
-- u: whole subset
|m==s -- if m==s
=m:n#t -- return 'm' and append a recursive call with 'n' and 't'
|all(/=m)u -- if 'm' is not in 'u'
=m:n#u -- return 'm' and append a recursive call with 'n' and 'u'
| -- else (note: 's' is element of 'n')
(x,_:z)<-span(/=s)n -- split 'n' into a list 'x' before element 's' and
-- a list 'z' after element 's' and
= (x++s:m:z)#u -- make a recursive call with
-- x++s:m:z as the new master list (i.e. 'm' inserted into 'n' after 's')
-- and 'u'
m # _ = m -- if either list is emtpy, return the master list
$endgroup$
Haskell, 79 bytes
(m:n)#u@(s:t)|m==s=m:n#t|all(/=m)u=m:n#u|(x,_:z)<-span(/=s)n=(x++s:m:z)#u
m#_=m
Try it online!
(m:n)#u@(s:t) -- m: head of master list
-- n: tail of master list
-- s: head of subset
-- t: tail of subset
-- u: whole subset
|m==s -- if m==s
=m:n#t -- return 'm' and append a recursive call with 'n' and 't'
|all(/=m)u -- if 'm' is not in 'u'
=m:n#u -- return 'm' and append a recursive call with 'n' and 'u'
| -- else (note: 's' is element of 'n')
(x,_:z)<-span(/=s)n -- split 'n' into a list 'x' before element 's' and
-- a list 'z' after element 's' and
= (x++s:m:z)#u -- make a recursive call with
-- x++s:m:z as the new master list (i.e. 'm' inserted into 'n' after 's')
-- and 'u'
m # _ = m -- if either list is emtpy, return the master list
edited yesterday
answered yesterday
niminimi
32.6k32489
32.6k32489
add a comment |
add a comment |
$begingroup$
J, 49 bytes
[:(<@({:+i.@>:@-/)@i.~C.])^:(>/@i.~)&.>/]|.@;2<[
Try it online!
Will golf further and add explanation tomorrow
$endgroup$
add a comment |
$begingroup$
J, 49 bytes
[:(<@({:+i.@>:@-/)@i.~C.])^:(>/@i.~)&.>/]|.@;2<[
Try it online!
Will golf further and add explanation tomorrow
$endgroup$
add a comment |
$begingroup$
J, 49 bytes
[:(<@({:+i.@>:@-/)@i.~C.])^:(>/@i.~)&.>/]|.@;2<[
Try it online!
Will golf further and add explanation tomorrow
$endgroup$
J, 49 bytes
[:(<@({:+i.@>:@-/)@i.~C.])^:(>/@i.~)&.>/]|.@;2<[
Try it online!
Will golf further and add explanation tomorrow
edited 23 hours ago
answered 23 hours ago
JonahJonah
2,5611017
2,5611017
add a comment |
add a comment |
$begingroup$
Ruby, 73 68 bytes
->a,b{0while b.zip(a&b).find{|m,n|m!=n&&a=a[0..a.index(m)]-[n]|a};a}
Try it online!
How?
- The intersection between
a
andb
contains all elements ofb
, but in the same order as we would find them ina
- So, if we iterate on
b
and on the intersection in parallel, as soon as we find a difference, we can relocate a single element. - Relocation is done by cutting
a
on the position of the element we found inb
, then removing the element we found in the intersection, and then adding the remainder of a. - Repeat from the beginning, until all elements of
b
are in the right order ina
$endgroup$
$begingroup$
what is the 0 doing in0while
?
$endgroup$
– Jonah
14 hours ago
$begingroup$
It's just a NOP.
$endgroup$
– G B
13 hours ago
$begingroup$
why is it needed?
$endgroup$
– Jonah
12 hours ago
add a comment |
$begingroup$
Ruby, 73 68 bytes
->a,b{0while b.zip(a&b).find{|m,n|m!=n&&a=a[0..a.index(m)]-[n]|a};a}
Try it online!
How?
- The intersection between
a
andb
contains all elements ofb
, but in the same order as we would find them ina
- So, if we iterate on
b
and on the intersection in parallel, as soon as we find a difference, we can relocate a single element. - Relocation is done by cutting
a
on the position of the element we found inb
, then removing the element we found in the intersection, and then adding the remainder of a. - Repeat from the beginning, until all elements of
b
are in the right order ina
$endgroup$
$begingroup$
what is the 0 doing in0while
?
$endgroup$
– Jonah
14 hours ago
$begingroup$
It's just a NOP.
$endgroup$
– G B
13 hours ago
$begingroup$
why is it needed?
$endgroup$
– Jonah
12 hours ago
add a comment |
$begingroup$
Ruby, 73 68 bytes
->a,b{0while b.zip(a&b).find{|m,n|m!=n&&a=a[0..a.index(m)]-[n]|a};a}
Try it online!
How?
- The intersection between
a
andb
contains all elements ofb
, but in the same order as we would find them ina
- So, if we iterate on
b
and on the intersection in parallel, as soon as we find a difference, we can relocate a single element. - Relocation is done by cutting
a
on the position of the element we found inb
, then removing the element we found in the intersection, and then adding the remainder of a. - Repeat from the beginning, until all elements of
b
are in the right order ina
$endgroup$
Ruby, 73 68 bytes
->a,b{0while b.zip(a&b).find{|m,n|m!=n&&a=a[0..a.index(m)]-[n]|a};a}
Try it online!
How?
- The intersection between
a
andb
contains all elements ofb
, but in the same order as we would find them ina
- So, if we iterate on
b
and on the intersection in parallel, as soon as we find a difference, we can relocate a single element. - Relocation is done by cutting
a
on the position of the element we found inb
, then removing the element we found in the intersection, and then adding the remainder of a. - Repeat from the beginning, until all elements of
b
are in the right order ina
edited 21 hours ago
answered 22 hours ago
G BG B
8,1961429
8,1961429
$begingroup$
what is the 0 doing in0while
?
$endgroup$
– Jonah
14 hours ago
$begingroup$
It's just a NOP.
$endgroup$
– G B
13 hours ago
$begingroup$
why is it needed?
$endgroup$
– Jonah
12 hours ago
add a comment |
$begingroup$
what is the 0 doing in0while
?
$endgroup$
– Jonah
14 hours ago
$begingroup$
It's just a NOP.
$endgroup$
– G B
13 hours ago
$begingroup$
why is it needed?
$endgroup$
– Jonah
12 hours ago
$begingroup$
what is the 0 doing in
0while
?$endgroup$
– Jonah
14 hours ago
$begingroup$
what is the 0 doing in
0while
?$endgroup$
– Jonah
14 hours ago
$begingroup$
It's just a NOP.
$endgroup$
– G B
13 hours ago
$begingroup$
It's just a NOP.
$endgroup$
– G B
13 hours ago
$begingroup$
why is it needed?
$endgroup$
– Jonah
12 hours ago
$begingroup$
why is it needed?
$endgroup$
– Jonah
12 hours ago
add a comment |
$begingroup$
Python 2, 124 109 106 99 96 bytes
def f(a,b,i=0):
while b[i+1:]:x,y=map(a.index,b)[i:i+2];i+=1;x>y>a.insert(x,a.pop(y))
return a
Try it online!
$endgroup$
add a comment |
$begingroup$
Python 2, 124 109 106 99 96 bytes
def f(a,b,i=0):
while b[i+1:]:x,y=map(a.index,b)[i:i+2];i+=1;x>y>a.insert(x,a.pop(y))
return a
Try it online!
$endgroup$
add a comment |
$begingroup$
Python 2, 124 109 106 99 96 bytes
def f(a,b,i=0):
while b[i+1:]:x,y=map(a.index,b)[i:i+2];i+=1;x>y>a.insert(x,a.pop(y))
return a
Try it online!
$endgroup$
Python 2, 124 109 106 99 96 bytes
def f(a,b,i=0):
while b[i+1:]:x,y=map(a.index,b)[i:i+2];i+=1;x>y>a.insert(x,a.pop(y))
return a
Try it online!
edited 4 hours ago
answered yesterday
Chas BrownChas Brown
5,1291523
5,1291523
add a comment |
add a comment |
$begingroup$
Perl 6, 40 bytes
{*.permutations.first(*.grep(.any)eq$_)}
Try it online!
Anonymous code block that takes the input curried (like f(subList)(masterList)
, and finds the first lexographical permutation of the indexes of the master list where the elements from the sub list are in the correct order.
Intuitively, the first satisfying permutation will leave the correctly ordered elements in the original order, while moving the incorrectly placed ones the minimum needed distance forward in order to have them in the correct order, which places them directly after the previous element in the subset.
Explanation:
{* } # Anonymous code block that returns a lambda
.permutations # In all permutations of the master list
.first( ) # Find the first permutation
(*.grep(.any) # Where the order of the subset
eq$_ # Is the same as the given order
$endgroup$
add a comment |
$begingroup$
Perl 6, 40 bytes
{*.permutations.first(*.grep(.any)eq$_)}
Try it online!
Anonymous code block that takes the input curried (like f(subList)(masterList)
, and finds the first lexographical permutation of the indexes of the master list where the elements from the sub list are in the correct order.
Intuitively, the first satisfying permutation will leave the correctly ordered elements in the original order, while moving the incorrectly placed ones the minimum needed distance forward in order to have them in the correct order, which places them directly after the previous element in the subset.
Explanation:
{* } # Anonymous code block that returns a lambda
.permutations # In all permutations of the master list
.first( ) # Find the first permutation
(*.grep(.any) # Where the order of the subset
eq$_ # Is the same as the given order
$endgroup$
add a comment |
$begingroup$
Perl 6, 40 bytes
{*.permutations.first(*.grep(.any)eq$_)}
Try it online!
Anonymous code block that takes the input curried (like f(subList)(masterList)
, and finds the first lexographical permutation of the indexes of the master list where the elements from the sub list are in the correct order.
Intuitively, the first satisfying permutation will leave the correctly ordered elements in the original order, while moving the incorrectly placed ones the minimum needed distance forward in order to have them in the correct order, which places them directly after the previous element in the subset.
Explanation:
{* } # Anonymous code block that returns a lambda
.permutations # In all permutations of the master list
.first( ) # Find the first permutation
(*.grep(.any) # Where the order of the subset
eq$_ # Is the same as the given order
$endgroup$
Perl 6, 40 bytes
{*.permutations.first(*.grep(.any)eq$_)}
Try it online!
Anonymous code block that takes the input curried (like f(subList)(masterList)
, and finds the first lexographical permutation of the indexes of the master list where the elements from the sub list are in the correct order.
Intuitively, the first satisfying permutation will leave the correctly ordered elements in the original order, while moving the incorrectly placed ones the minimum needed distance forward in order to have them in the correct order, which places them directly after the previous element in the subset.
Explanation:
{* } # Anonymous code block that returns a lambda
.permutations # In all permutations of the master list
.first( ) # Find the first permutation
(*.grep(.any) # Where the order of the subset
eq$_ # Is the same as the given order
edited 3 hours ago
answered 16 hours ago
Jo KingJo King
26.4k364130
26.4k364130
add a comment |
add a comment |
$begingroup$
Jelly, 9 bytes
Œ!iⱮṢƑ¥ƇḢ
Try it online! or Test suite
Inefficient, particularly with large master lists. Generates all possible permutations, filters out those where the subset is in the wrong order, and then returns the first.
Alternatively, a faster approach is:
Jelly, 24 bytes
i@€MƤFṬœṗƲḊ;JḟF}W€ʋ@¥ṢFị
Try it online!
$endgroup$
$begingroup$
This doesn't seem like it would conform to the rule "Where the master list has two elements out of order according to the subset list, the item that is earlier in the master list should be moved to the earliest index where it is in the correct location relative to other items within the subset list. (i.e. immediately after the later item)"
$endgroup$
– Beefster
9 hours ago
$begingroup$
@Beefster it works on the ones I’ve tried so far. I think the ordering of the permutations is such that this is the correct result. Happy to be proved wrong if there’s a counterexample.
$endgroup$
– Nick Kennedy
9 hours ago
$begingroup$
@Beefster I’ve now tried all of your examples except the female names and the 1..12 and the ordering of the result is correct.
$endgroup$
– Nick Kennedy
8 hours ago
$begingroup$
@Beefster My answer has a partial explanation for why this works
$endgroup$
– Jo King
3 hours ago
add a comment |
$begingroup$
Jelly, 9 bytes
Œ!iⱮṢƑ¥ƇḢ
Try it online! or Test suite
Inefficient, particularly with large master lists. Generates all possible permutations, filters out those where the subset is in the wrong order, and then returns the first.
Alternatively, a faster approach is:
Jelly, 24 bytes
i@€MƤFṬœṗƲḊ;JḟF}W€ʋ@¥ṢFị
Try it online!
$endgroup$
$begingroup$
This doesn't seem like it would conform to the rule "Where the master list has two elements out of order according to the subset list, the item that is earlier in the master list should be moved to the earliest index where it is in the correct location relative to other items within the subset list. (i.e. immediately after the later item)"
$endgroup$
– Beefster
9 hours ago
$begingroup$
@Beefster it works on the ones I’ve tried so far. I think the ordering of the permutations is such that this is the correct result. Happy to be proved wrong if there’s a counterexample.
$endgroup$
– Nick Kennedy
9 hours ago
$begingroup$
@Beefster I’ve now tried all of your examples except the female names and the 1..12 and the ordering of the result is correct.
$endgroup$
– Nick Kennedy
8 hours ago
$begingroup$
@Beefster My answer has a partial explanation for why this works
$endgroup$
– Jo King
3 hours ago
add a comment |
$begingroup$
Jelly, 9 bytes
Œ!iⱮṢƑ¥ƇḢ
Try it online! or Test suite
Inefficient, particularly with large master lists. Generates all possible permutations, filters out those where the subset is in the wrong order, and then returns the first.
Alternatively, a faster approach is:
Jelly, 24 bytes
i@€MƤFṬœṗƲḊ;JḟF}W€ʋ@¥ṢFị
Try it online!
$endgroup$
Jelly, 9 bytes
Œ!iⱮṢƑ¥ƇḢ
Try it online! or Test suite
Inefficient, particularly with large master lists. Generates all possible permutations, filters out those where the subset is in the wrong order, and then returns the first.
Alternatively, a faster approach is:
Jelly, 24 bytes
i@€MƤFṬœṗƲḊ;JḟF}W€ʋ@¥ṢFị
Try it online!
edited 8 hours ago
answered 9 hours ago
Nick KennedyNick Kennedy
1,31649
1,31649
$begingroup$
This doesn't seem like it would conform to the rule "Where the master list has two elements out of order according to the subset list, the item that is earlier in the master list should be moved to the earliest index where it is in the correct location relative to other items within the subset list. (i.e. immediately after the later item)"
$endgroup$
– Beefster
9 hours ago
$begingroup$
@Beefster it works on the ones I’ve tried so far. I think the ordering of the permutations is such that this is the correct result. Happy to be proved wrong if there’s a counterexample.
$endgroup$
– Nick Kennedy
9 hours ago
$begingroup$
@Beefster I’ve now tried all of your examples except the female names and the 1..12 and the ordering of the result is correct.
$endgroup$
– Nick Kennedy
8 hours ago
$begingroup$
@Beefster My answer has a partial explanation for why this works
$endgroup$
– Jo King
3 hours ago
add a comment |
$begingroup$
This doesn't seem like it would conform to the rule "Where the master list has two elements out of order according to the subset list, the item that is earlier in the master list should be moved to the earliest index where it is in the correct location relative to other items within the subset list. (i.e. immediately after the later item)"
$endgroup$
– Beefster
9 hours ago
$begingroup$
@Beefster it works on the ones I’ve tried so far. I think the ordering of the permutations is such that this is the correct result. Happy to be proved wrong if there’s a counterexample.
$endgroup$
– Nick Kennedy
9 hours ago
$begingroup$
@Beefster I’ve now tried all of your examples except the female names and the 1..12 and the ordering of the result is correct.
$endgroup$
– Nick Kennedy
8 hours ago
$begingroup$
@Beefster My answer has a partial explanation for why this works
$endgroup$
– Jo King
3 hours ago
$begingroup$
This doesn't seem like it would conform to the rule "Where the master list has two elements out of order according to the subset list, the item that is earlier in the master list should be moved to the earliest index where it is in the correct location relative to other items within the subset list. (i.e. immediately after the later item)"
$endgroup$
– Beefster
9 hours ago
$begingroup$
This doesn't seem like it would conform to the rule "Where the master list has two elements out of order according to the subset list, the item that is earlier in the master list should be moved to the earliest index where it is in the correct location relative to other items within the subset list. (i.e. immediately after the later item)"
$endgroup$
– Beefster
9 hours ago
$begingroup$
@Beefster it works on the ones I’ve tried so far. I think the ordering of the permutations is such that this is the correct result. Happy to be proved wrong if there’s a counterexample.
$endgroup$
– Nick Kennedy
9 hours ago
$begingroup$
@Beefster it works on the ones I’ve tried so far. I think the ordering of the permutations is such that this is the correct result. Happy to be proved wrong if there’s a counterexample.
$endgroup$
– Nick Kennedy
9 hours ago
$begingroup$
@Beefster I’ve now tried all of your examples except the female names and the 1..12 and the ordering of the result is correct.
$endgroup$
– Nick Kennedy
8 hours ago
$begingroup$
@Beefster I’ve now tried all of your examples except the female names and the 1..12 and the ordering of the result is correct.
$endgroup$
– Nick Kennedy
8 hours ago
$begingroup$
@Beefster My answer has a partial explanation for why this works
$endgroup$
– Jo King
3 hours ago
$begingroup$
@Beefster My answer has a partial explanation for why this works
$endgroup$
– Jo King
3 hours ago
add a comment |
$begingroup$
C# (Visual C# Interactive Compiler), 136 bytes
a=>b=>{for(int i=0,j;i<b.Count;)foreach(var e in a.Take(j=a.IndexOf(b[i++])).Intersect(b.Skip(i)).ToList()){a.Remove(e);a.Insert(j,e);}}
Try it online!
$endgroup$
add a comment |
$begingroup$
C# (Visual C# Interactive Compiler), 136 bytes
a=>b=>{for(int i=0,j;i<b.Count;)foreach(var e in a.Take(j=a.IndexOf(b[i++])).Intersect(b.Skip(i)).ToList()){a.Remove(e);a.Insert(j,e);}}
Try it online!
$endgroup$
add a comment |
$begingroup$
C# (Visual C# Interactive Compiler), 136 bytes
a=>b=>{for(int i=0,j;i<b.Count;)foreach(var e in a.Take(j=a.IndexOf(b[i++])).Intersect(b.Skip(i)).ToList()){a.Remove(e);a.Insert(j,e);}}
Try it online!
$endgroup$
C# (Visual C# Interactive Compiler), 136 bytes
a=>b=>{for(int i=0,j;i<b.Count;)foreach(var e in a.Take(j=a.IndexOf(b[i++])).Intersect(b.Skip(i)).ToList()){a.Remove(e);a.Insert(j,e);}}
Try it online!
edited 3 hours ago
answered 3 hours ago
danadana
1,921167
1,921167
add a comment |
add a comment |
If this is an answer to a challenge…
…Be sure to follow the challenge specification. However, please refrain from exploiting obvious loopholes. Answers abusing any of the standard loopholes are considered invalid. If you think a specification is unclear or underspecified, comment on the question instead.
…Try to optimize your score. For instance, answers to code-golf challenges should attempt to be as short as possible. You can always include a readable version of the code in addition to the competitive one.
Explanations of your answer make it more interesting to read and are very much encouraged.…Include a short header which indicates the language(s) of your code and its score, as defined by the challenge.
More generally…
…Please make sure to answer the question and provide sufficient detail.
…Avoid asking for help, clarification or responding to other answers (use comments instead).
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f182677%2freorder-a-master-list-based-on-a-reordered-subset%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
A nice, beefy problem.
$endgroup$
– Jonah
yesterday
$begingroup$
Is
8 1 3 4 5 6 7 2 9 12 11 10
a valid solution to the second-to-last one?$endgroup$
– Ven
15 hours ago
$begingroup$
@Ven No. Even though that fits within the constraints of keeping the subset items in the same relative order, I wanted to make sure there was only one correct answer, so the earlier out-of-order item should be moved to be after the later out-of-order item.
$endgroup$
– Beefster
13 hours ago