Update all new Tasks

This commit is contained in:
Ingy döt Net 2015-02-20 09:02:09 -05:00
parent 00a190b0a6
commit 91df62d461
5697 changed files with 93386 additions and 804 deletions

View file

@ -0,0 +1,27 @@
Given <code>M</code> as a list of items and another list <code>N</code> of items chosen from <code>M</code>, create <code>M'</code> as a list with the ''first'' occurrences of items from N sorted to be in one of the set of indices of their original occurrence in <code>M</code> but in the order given by their order in <code>N</code>. That is, items in <code>N</code> are taken from <code>M</code> without replacement, then the corresponding positions in <code>M'</code> are filled by successive items from <code>N</code>.
For example:
:if <code>M</code> is <code>'the cat sat on the mat'</code>
:And <code>N</code> is <code>'mat cat'</code>
:Then the result <code>M'</code> is <code>'the mat sat on the cat'</code>.
The words not in <code>N</code> are left in their original positions.
If there are duplications then only the first instances in <code>M</code> up to as many as are mentioned in <code>N</code> are potentially re-ordered.
For example:
:<code>M = 'A B C A B C A B C'</code>
:<code>N = 'C A C A'</code>
Is ordered as:
:<code>M' = 'C B A C B A A B C'</code>
Show the output, here, for at least the following inputs:
<pre>Data M: 'the cat sat on the mat' Order N: 'mat cat'
Data M: 'the cat sat on the mat' Order N: 'cat mat'
Data M: 'A B C A B C A B C' Order N: 'C A C A'
Data M: 'A B C A B D A B E' Order N: 'E A D A'
Data M: 'A B' Order N: 'B'
Data M: 'A B' Order N: 'B A'
Data M: 'A B B A' Order N: 'B A'</pre>
;Cf:
* [[Sort disjoint sublist]]

View file

@ -0,0 +1,21 @@
Data := [ {M: "the cat sat on the mat", N: "mat cat"}
, {M: "the cat sat on the mat", N: "cat mat"}
, {M: "A B C A B C A B C", N: "C A C A"}
, {M: "A B C A B D A B E", N: "E A D A"}
, {M: "A B", N: "B"}
, {M: "A B", N: "B A"}
, {M: "A B B A", N: "B A"} ]
for Key, Val in Data
Output .= Val.M " :: " Val.N " -> " OrderDisjointList(Val.M, Val.N) "`n"
MsgBox, % RTrim(Output, "`n")
OrderDisjointList(M, N) {
ItemsN := []
Loop, Parse, N, % A_Space
ItemsN[A_LoopField] := ItemsN[A_LoopField] ? ItemsN[A_LoopField] + 1 : 1
N := StrSplit(N, A_Space)
Loop, Parse, M, % A_Space
Result .= (ItemsN[A_LoopField]-- > 0 ? N.Remove(1) : A_LoopField) " "
return RTrim(Result)
}

View file

@ -0,0 +1,35 @@
( ( odli
= M N NN item A Z R
. !arg:(?M.?N)
& :?NN
& whl
' ( !N:%?item ?N
& ( !M:?A !item ?Z
& !A (.) !Z:?M
& !NN !item:?NN
|
)
)
& :?R
& whl
' ( !M:?A (.) ?M
& !NN:%?item ?NN
& !R !A !item:?R
)
& !R !M
)
& (the cat sat on the mat.mat cat)
(the cat sat on the mat.cat mat)
(A B C A B C A B C.C A C A)
(A B C A B D A B E.E A D A)
(A B.B)
(A B.B A)
(A B B A.B A)
: ?tests
& whl
' ( !tests:(?M.?N) ?tests
& put$("Data M:" !M)
& put$("\tOrder N:" !N)
& out$(\t odli$(!M.!N))
)
);

View file

@ -0,0 +1,51 @@
import std.stdio, std.string, std.algorithm, std.array, std.range,
std.conv;
T[] orderDisjointArrayItems(T)(in T[] data, in T[] items)
pure /*nothrow*/ @safe {
int[] itemIndices;
foreach (item; items.dup.sort().uniq) {
immutable int itemCount = items.count(item);
assert(data.count(item) >= itemCount,
text("More of ", item, " than in data"));
auto lastIndex = [-1];
foreach (immutable _; 0 .. itemCount) {
immutable start = lastIndex.back + 1;
lastIndex ~= data[start .. $].countUntil(item) + start;
}
itemIndices ~= lastIndex.dropOne;
}
itemIndices.sort();
auto result = data.dup;
foreach (index, item; zip(itemIndices, items))
result[index] = item;
return result;
}
void main() {
immutable problems =
"the cat sat on the mat | mat cat
the cat sat on the mat | cat mat
A B C A B C A B C | C A C A
A B C A B D A B E | E A D A
A B | B
A B | B A
A B B A | B A
|
A | A
A B |
A B B A | A B
A B A B | A B
A B A B | B A B A
A B C C B A | A C A C
A B C C B A | C A C A"
.splitLines.map!(r => r.split("|")).array;
foreach (immutable p; problems) {
immutable a = p[0].split;
immutable b = p[1].split;
writefln("%s | %s -> %-(%s %)", p[0].strip, p[1].strip,
orderDisjointArrayItems(a, b));
}
}

View file

@ -0,0 +1,57 @@
package main
import (
"fmt"
"sort"
"strings"
)
type indexSort struct {
val sort.Interface
ind []int
}
func (s indexSort) Len() int { return len(s.ind) }
func (s indexSort) Less(i, j int) bool { return s.ind[i] < s.ind[j] }
func (s indexSort) Swap(i, j int) {
s.val.Swap(s.ind[i], s.ind[j])
s.ind[i], s.ind[j] = s.ind[j], s.ind[i]
}
func disjointSliceSort(m, n []string) []string {
s := indexSort{sort.StringSlice(m), make([]int, 0, len(n))}
used := make(map[int]bool)
for _, nw := range n {
for i, mw := range m {
if used[i] || mw != nw {
continue
}
used[i] = true
s.ind = append(s.ind, i)
break
}
}
sort.Sort(s)
return s.val.(sort.StringSlice)
}
func disjointStringSort(m, n string) string {
return strings.Join(
disjointSliceSort(strings.Fields(m), strings.Fields(n)), " ")
}
func main() {
for _, data := range []struct{ m, n string }{
{"the cat sat on the mat", "mat cat"},
{"the cat sat on the mat", "cat mat"},
{"A B C A B C A B C", "C A C A"},
{"A B C A B D A B E", "E A D A"},
{"A B", "B"},
{"A B", "B A"},
{"A B B A", "B A"},
} {
mp := disjointStringSort(data.m, data.n)
fmt.Printf("%s → %s » %s\n", data.m, data.n, mp)
}
}

View file

@ -0,0 +1,23 @@
procedure main(A)
every write(" -> ",odli("the cat sat on the mat","mat cat"))
every write(" -> ",odli("the cat sat on the mat","cat mat"))
every write(" -> ",odli("A B C A B C A B C","C A C A"))
every write(" -> ",odli("A B C A B D A B E","E A D A"))
every write(" -> ",odli("A B","B"))
every write(" -> ",odli("A B","B A"))
every write(" -> ",odli("A B B A","B A"))
end
procedure odli(M,N)
writes(M," :: ",N)
Mp := ""
P := N ||:= " "
(M||" ") ? while item := tab(upto(' '))||move(1) do {
if find(item,P) then {
P ?:= 1(tab(find(item)),move(*item))||tab(0)
N ?:= (item := tab(upto(' '))||move(1), tab(0))
}
Mp ||:= item
}
return Mp
end

View file

@ -0,0 +1,9 @@
disjorder=:3 :0&.;:
:
clusters=. (</. i.@#) x
order=. x i.&~. y
need=. #/.~ y
from=. ;need (#{.)each (/:~order){clusters
to=. ;need {.!._ each order{clusters
(from{x) to} x
)

View file

@ -0,0 +1,14 @@
'the cat sat on the mat' disjorder 'mat cat'
the mat sat on the cat
'the cat sat on the mat' disjorder 'cat mat'
the cat sat on the mat
'A B C A B C A B C' disjorder 'C A C A'
C B A C B A A B C
'A B C A B D A B E' disjorder 'E A D A'
D B C D B E A B A
'A B' disjorder 'B'
A B
'A B' disjorder 'B A'
B A
'A B B A' disjorder 'B A'
B A B A

View file

@ -0,0 +1,50 @@
import java.util.Arrays;
import java.util.BitSet;
import org.apache.commons.lang3.ArrayUtils;
public class OrderDisjointItems {
public static void main(String[] args) {
final String[][] MNs = {{"the cat sat on the mat", "mat cat"},
{"the cat sat on the mat", "cat mat"},
{"A B C A B C A B C", "C A C A"}, {"A B C A B D A B E", "E A D A"},
{"A B", "B"}, {"A B", "B A"}, {"A B B A", "B A"}, {"X X Y", "X"}};
for (String[] a : MNs) {
String[] r = orderDisjointItems(a[0].split(" "), a[1].split(" "));
System.out.printf("%s | %s -> %s%n", a[0], a[1], Arrays.toString(r));
}
}
// if input items cannot be null
static String[] orderDisjointItems(String[] m, String[] n) {
for (String e : n) {
int idx = ArrayUtils.indexOf(m, e);
if (idx != -1)
m[idx] = null;
}
for (int i = 0, j = 0; i < m.length; i++) {
if (m[i] == null)
m[i] = n[j++];
}
return m;
}
// otherwise
static String[] orderDisjointItems2(String[] m, String[] n) {
BitSet bitSet = new BitSet(m.length);
for (String e : n) {
int idx = -1;
do {
idx = ArrayUtils.indexOf(m, e, idx + 1);
} while (idx != -1 && bitSet.get(idx));
if (idx != -1)
bitSet.set(idx);
}
for (int i = 0, j = 0; i < m.length; i++) {
if (bitSet.get(i))
m[i] = n[j++];
}
return m;
}
}

View file

@ -0,0 +1,4 @@
sub order-disjoint-list-items(\M, \N) {
my \bag = N.BagHash;
M.map: { bag{$_}-- ?? N.shift !! $_ }
}

View file

@ -0,0 +1,12 @@
for q:to/---/.comb(/ [\S+]+ % ' ' /).map({[.words]})
the cat sat on the mat mat cat
the cat sat on the mat cat mat
A B C A B C A B C C A C A
A B C A B D A B E E A D A
A B B
A B B A
A B B A B A
X X Y X
A X Y A
---
-> $m, $n { say "\n$m ==> $n\n", order-disjoint-list-items($m, $n) }

View file

@ -0,0 +1,21 @@
sub dsort {
my ($m, $n) = @_;
my %h;
$h{$_}++ for @$n;
map $h{$_}-- > 0 ? shift @$n : $_, @$m;
}
for (split "\n", <<"IN")
the cat sat on the mat | mat cat
the cat sat on the mat | cat mat
A B C A B C A B C | C A C A
A B C A B D A B E | E A D A
A B | B
A B | B A
A B B A | B A
IN
{
my ($a, $b) = map([split], split '\|');
print "@$a | @$b -> @{[dsort($a, $b)]}\n";
}

View file

@ -0,0 +1,37 @@
from __future__ import print_function
def order_disjoint_list_items(data, items):
#Modifies data list in-place
itemindices = []
for item in set(items):
itemcount = items.count(item)
#assert data.count(item) >= itemcount, 'More of %r than in data' % item
lastindex = [-1]
for i in range(itemcount):
lastindex.append(data.index(item, lastindex[-1] + 1))
itemindices += lastindex[1:]
itemindices.sort()
for index, item in zip(itemindices, items):
data[index] = item
if __name__ == '__main__':
tostring = ' '.join
for data, items in [ (str.split('the cat sat on the mat'), str.split('mat cat')),
(str.split('the cat sat on the mat'), str.split('cat mat')),
(list('ABCABCABC'), list('CACA')),
(list('ABCABDABE'), list('EADA')),
(list('AB'), list('B')),
(list('AB'), list('BA')),
(list('ABBA'), list('BA')),
(list(''), list('')),
(list('A'), list('A')),
(list('AB'), list('')),
(list('ABBA'), list('AB')),
(list('ABAB'), list('AB')),
(list('ABAB'), list('BABA')),
(list('ABCCBA'), list('ACAC')),
(list('ABCCBA'), list('CACA')),
]:
print('Data M: %-24r Order N: %-9r' % (tostring(data), tostring(items)), end=' ')
order_disjoint_list_items(data, items)
print("-> M' %r" % tostring(data))

View file

@ -0,0 +1 @@
Data source: http://rosettacode.org/wiki/Order_disjoint_list_items

View file

@ -0,0 +1,40 @@
/*REXX program orders a disjoint list of M items with a list of N items.*/
used = '0'x /*indicates word has been parsed.*/
@. = /*placeholder indicates e─o─array*/
@.1 = " the cat sat on the mat | mat cat " /*string.*/
@.2 = " the cat sat on the mat | cat mat " /*string.*/
@.3 = " A B C A B C A B C | C A C A " /*string.*/
@.4 = " A B C A B D A B E | E A D A " /*string.*/
@.5 = " A B | B " /*string.*/
@.6 = " A B | B A " /*string.*/
@.7 = " A B B A | B A " /*string.*/
@.8 = " | " /*string.*/
@.9 = " A | A " /*string.*/
@.10 = " A B | " /*string.*/
@.11 = " A B B A | A B " /*string.*/
@.12 = " A B A B | A B " /*string.*/
@.13 = " A B A B | B A B A " /*string.*/
@.14 = " A B C C B A | A C A C " /*string.*/
@.15 = " A B C C B A | C A C A " /*string.*/
/* [↓] process each input string*/
do j=1 while @.j\==''; r.= /*nullify the replacement string.*/
parse var @.j m '|' n /*parse input string into M & N.*/
mw=words(m); do i=mw for mw by -1; x=word(m,i); !.i=x; $.x=i; end
/* [↑] build ! and $ arrays. */
do k=1 for words(n)%2 by 2 /* [↓] process the N array. */
_=word(n,k); v=word(n,k+1) /*get an order word & replacement*/
p1=wordpos(_,m); p2=wordpos(v,m) /*positions of word & replacement*/
if p1==0 | p2==0 then iterate /*if either not found, skip 'em. */
if $._>>$.v then do; r.p2=!.p1; r.p1=!.p2; end /*switch words.*/
else do; r.p1=!.p1; r.p2=!.p2; end /*don't switch.*/
!.p1=used; !.p2=used; m= /*mark as used.*/
do i=1 for mw; m=m !.i; x=word(m,i); !.i=x; $.x=i; end
end /*k*/ /* [↑] rebuild the ! & $ arrays.*/
mp= /*the MP (M') string (so far).*/
do q=1 for mw; if !.q==used then mp=mp r.q /*use original. */
else mp=mp !.q /*use substitute*/
end /*q*/ /* [↑] re-build the (output) str*/
/*═══════════════════════════════*/
say @.j '' space(mp) /*display the new text reordered.*/
end /*j*/ /* [↑] end of processing N words*/
/*stick a fork in it, we're done.*/

View file

@ -0,0 +1,37 @@
#lang racket
(define disjorder
(match-lambda**
(((list) n) '())
((m (list)) m)
(((list h m-tail ...) (list h n-tail ...))
(list* h (disjorder m-tail n-tail)))
;; the (not g/h) below stop greedy matching of the list which
;; would pick out orderings from the right first.
(((list h (and (not g) m-tail-left) ... g m-tail-right ...)
(list g (and (not h) n-tail-left) ... h n-tail-right ...))
(disjorder `(,g ,@m-tail-left ,h ,@m-tail-right)
`(,g ,@n-tail-left ,h ,@n-tail-right)))
(((list h m-tail ...) n)
(list* h (disjorder m-tail n)))))
(define (report-disjorder m n)
(printf "Data M: ~a Order N: ~a -> ~a~%"
(~a #:min-width 25 m) (~a #:min-width 10 n) (disjorder m n)))
;; Do the task tests
(report-disjorder '(the cat sat on the mat) '(mat cat))
(report-disjorder '(the cat sat on the mat) '(cat mat))
(report-disjorder '(A B C A B C A B C) '(C A C A))
(report-disjorder '(A B C A B D A B E) '(E A D A))
(report-disjorder '(A B) '(B))
(report-disjorder '(A B) '(B A))
(report-disjorder '(A B B A) '(B A))
;; Do all of the other python tests
(report-disjorder '() '())
(report-disjorder '(A) '(A))
(report-disjorder '(A B) '())
(report-disjorder '(A B B A) '(A B))
(report-disjorder '(A B A B) '(A B))
(report-disjorder '(A B A B) '(B A B A))
(report-disjorder '(A B C C B A) '(A C A C))
(report-disjorder '(A B C C B A) '(C A C A))

View file

@ -0,0 +1,17 @@
test_data = [
'the cat sat on the mat', 'mat cat',
'the cat sat on the mat', 'cat mat',
'A B C A B C A B C' , 'C A C A',
'A B C A B D A B E' , 'E A D A',
'A B' , 'B',
'A B' , 'B A',
'A B B A' , 'B A',
'the cat sat on the chair', 'chair cat']
test_data.each_slice(2) do |str, order|
result, order_items = str.dup, order.split
re = Regexp.union(order_items.uniq)
offsets = str.enum_for(:scan, re).map{ ($~.begin(0) ... $~.end(0)) } # $~ is last MatchData object
order_items.zip(offsets).reverse_each{|item, offset| result[offset] = item}
puts "Data M: %-24s Order N: %-10s-> M' %-12s" % [str, order, result]
end

View file

@ -0,0 +1,5 @@
def order[T](input: Seq[T], using: Seq[T], used: Seq[T] = Seq()): Seq[T] =
if (input.isEmpty || used.size >= using.size) input
else if (using diff used contains input.head)
using(used.size) +: order(input.tail, using, used :+ input.head)
else input.head +: order(input.tail, using, used)

View file

@ -0,0 +1,14 @@
val tests = List(
"the cat sat on the mat" -> "mat cat",
"the cat sat on the mat" -> "cat mat",
"A B C A B C A B C" -> "C A C A",
"A B C A B D A B E" -> "E A D A",
"A B" -> "B",
"A B" -> "B A",
"A B B A" -> "B A"
)
tests.foreach{case (input, using) =>
val done = order(input.split(" "), using.split(" "))
println(f"""Data M: $input%-24s Order N: $using%-9s -> Result M': ${done mkString " "}""")
}

View file

@ -0,0 +1,13 @@
proc orderDisjoint {theList theOrderList} {
foreach item $theOrderList {incr n($item)}
set is {}
set i 0
foreach item $theList {
if {[info exist n($item)] && [incr n($item) -1] >= 0} {
lappend is $i
}
incr i
}
foreach item $theOrderList i $is {lset theList $i $item}
return $theList
}

View file

@ -0,0 +1,18 @@
proc orderDisjoint {theList theOrderList} {
foreach item $theOrderList {incr n($item)}
set is -
set i 0
foreach item $theList {
if {[info exist n($item)] && [incr n($item) -1] >= 0} {
lappend is $i
}
incr i
}
set i 0
foreach item $theOrderList {
if {[incr n($item)] <= 1} {
lset theList [lindex $is [incr i]] $item
}
}
return $theList
}

View file

@ -0,0 +1,11 @@
foreach {items order} {
"the cat sat on the mat" "mat cat"
"the cat sat on the mat" "cat mat"
"A B C A B C A B C" "C A C A"
"A B C A B D A B E" "E A D A"
"A B" "B"
"A B" "B A"
"A B B A" "B A"
} {
puts "'$items' with '$order' => '[orderDisjoint $items $order]'"
}