YAPC::EU 2018 Glasgow Update!
This commit is contained in:
parent
22f33d4004
commit
4e2d22a71d
1170 changed files with 15042 additions and 3047 deletions
|
|
@ -0,0 +1,48 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public static class LIS
|
||||
{
|
||||
public static IEnumerable<T> FindRec<T>(IList<T> values, IComparer<T> comparer = null) =>
|
||||
values == null ? throw new ArgumentNullException() :
|
||||
FindRecImpl(values, Sequence<T>.Empty, 0, comparer ?? Comparer<T>.Default).Reverse();
|
||||
|
||||
private static Sequence<T> FindRecImpl<T>(IList<T> values, Sequence<T> current, int index, IComparer<T> comparer) {
|
||||
if (index == values.Count) return current;
|
||||
if (current.Length > 0 && comparer.Compare(values[index], current.Value) <= 0)
|
||||
return FindRecImpl(values, current, index + 1, comparer);
|
||||
return Max(
|
||||
FindRecImpl(values, current, index + 1, comparer),
|
||||
FindRecImpl(values, current + values[index], index + 1, comparer)
|
||||
);
|
||||
}
|
||||
|
||||
private static Sequence<T> Max<T>(Sequence<T> a, Sequence<T> b) => a.Length < b.Length ? b : a;
|
||||
|
||||
class Sequence<T> : IEnumerable<T>
|
||||
{
|
||||
public static readonly Sequence<T> Empty = new Sequence<T>(default(T), null);
|
||||
|
||||
public Sequence(T value, Sequence<T> tail)
|
||||
{
|
||||
Value = value;
|
||||
Tail = tail;
|
||||
Length = tail == null ? 0 : tail.Length + 1;
|
||||
}
|
||||
|
||||
public T Value { get; }
|
||||
public Sequence<T> Tail { get; }
|
||||
public int Length { get; }
|
||||
|
||||
public static Sequence<T> operator +(Sequence<T> s, T value) => new Sequence<T>(value, s);
|
||||
|
||||
public IEnumerator<T> GetEnumerator()
|
||||
{
|
||||
for (var s = this; s.Length > 0; s = s.Tail) yield return s.Value;
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
public static class LIS
|
||||
{
|
||||
public static T[] Find<T>(IList<T> values, IComparer<T> comparer = null) {
|
||||
if (values == null) throw new ArgumentNullException();
|
||||
if (comparer == null) comparer = Comparer<T>.Default;
|
||||
var pileTops = new List<T>();
|
||||
var pileAssignments = new int[values.Count];
|
||||
for (int i = 0; i < values.Count; i++) {
|
||||
T element = values[i];
|
||||
int pile = pileTops.BinarySearch(element, comparer);
|
||||
if (pile < 0) pile = ~pile;
|
||||
if (pile == pileTops.Count) pileTops.Add(element);
|
||||
else pileTops[pile] = element;
|
||||
pileAssignments[i] = pile;
|
||||
}
|
||||
T[] result = new T[pileTops.Count];
|
||||
for (int i = pileAssignments.Length - 1, p = pileTops.Count - 1; p >= 0; i--) {
|
||||
if (pileAssignments[i] == p) result[p--] = values[i];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,4 @@
|
|||
# Project : Longest increasing subsequence
|
||||
# Date : 2017/11/23
|
||||
# Author : Gal Zsolt (~ CalmoSoft ~)
|
||||
# Email : <calmosoft@gmail.com>
|
||||
|
||||
tests = [[3, 2, 6, 4, 5, 1], [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]]
|
||||
res = []
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
object LongestIncreasingSubsequence extends App {
|
||||
val tests = Map(
|
||||
"3,2,6,4,5,1" -> Seq("2,4,5", "3,4,5"),
|
||||
"0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15" ->
|
||||
Seq("0,2,6,9,11,15", "0,2,6,9,13,15", "0,4,6,9,13,15", "0,4,6,9,11,15")
|
||||
"0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15" -> Seq("0,2,6,9,11,15", "0,2,6,9,13,15", "0,4,6,9,13,15", "0,4,6,9,11,15")
|
||||
)
|
||||
|
||||
def lis(l: Array[Int]): Seq[Array[Int]] =
|
||||
|
|
@ -28,9 +27,7 @@ object LongestIncreasingSubsequence extends App {
|
|||
val allLongests: Seq[Array[Int]] = lis(asInts(given))
|
||||
println(
|
||||
s"$given has ${allLongests.length} longest increasing subsequences, e.g. ${
|
||||
allLongests.last
|
||||
.mkString(",")
|
||||
}")
|
||||
allLongests.last.mkString(",")}")
|
||||
allLongests.forall(lis => expect.contains(lis.mkString(",")))
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue