정렬 된 두 목록을 병합


14

정렬 병합

이 과제에서는 병합 정렬의 병합 서브 루틴을 구현합니다. 특히 함수 또는 프로그램 또는 동사 또는 유사 항목을 작성해야합니다. 두 개의 목록 (각각 증가하는 순서로 정렬 됨)을 증가하는 순서로 정렬 된 하나의 목록으로 결합해야합니다. 요구 사항 :

-알고리즘은 입력 크기에서 점진적으로 선형 시간을 가져야합니다. O (n ^ 2) 솔루션 제공을 중단하십시오.

  • 리스트를 정렬하거나리스트를 병합 할 수있는 내장 함수를 사용할 수 없습니다. 저자의 재량.
  • 코드는 반복되는 요소를 처리 할 수 ​​있어야합니다.
  • 빈 목록에 대해 걱정하지 마십시오.

예 :

merge([1],[0,2,3,4])
[0,1,2,3,4]

merge([1,5,10,17,19],[2,5,9,11,13,20])
[1, 2, 5, 5, 9, 10, 11, 13, 17, 19, 20]

이것은 이므로 가장 짧은 코드가 이길 수 있습니다!


목록 내에서 또는 두 목록 사이에서만 반복되는 요소를 처리해야합니까?
Keith Randall

둘 다 말해 봅시다. 아이디어는 이것을 사용하여 병합 정렬을 수행 할 수 있어야한다는 것입니다.
isaacg

입력 배열을 깔끔하게 정리해야합니까?
skibrianski

3
알고리즘 을 해석하는 방법이 점진적으로 선형 시간을 가져야 하는지 잘 모르겠습니다 . 알고리즘에는 시간이 걸리지 않으며 구현에는 시간이 걸립니다. 내 Golfscript 답변의 실행 시간은 Ruby 인터프리터와 함께 O (무서운)이지만 온라인 골프 스크립트 테스터는 훨씬 더 잘 작동하며 실제로 선형 적 일 수 있습니다 (소스 코드 없이는 실제로 말할 수있는 방법은 없습니다). 내 요점은 b=a;b=b.length전체 배열을 복제하고 a(모든 요소에 대해 실행될 경우 O (n ^ 2) 시간을 초래할 수 있음) 또는 배열에 대한 참조 만 복제 할 수 있습니다 (O (n) 시간). 어느 것이 중요합니까?
데니스

1
이러한 경우에는 최선을 다해 알아낼 수 있지만 솔직히 말할 수 없다면 언급 한 두 번째 대안과 같이 잘 작동한다고 가정 할 수 있습니다. 귀하의 언어에 표준 통역사가없는 경우 통역사가 잘 작동한다고 가정 할 수 있습니다.
isaacg

답변:


8

레브 무 ( 35 32 문자)

u[iG^aNXa[rvA]apGtkFaM?fA]apGscA

테스트

>> rebmu/args [u[iG^aNXa[rvA]apGtkFaM?fA]apGscA] [[1 5 10 17 19] [2 5 9 11 13 20]] 
== [1 2 5 5 9 10 11 13 17 19 20]

>> rebmu/args [u[iG^aNXa[rvA]apGtkFaM?fA]apGscA] [[2 5 9 11 13 20] [1 5 10 17 19]] 
== [1 2 5 5 9 10 11 13 17 19 20]

RebmuRebol 의 방언으로, 간결성이 필요한 상황에서 일반 코드를 '머시'할 수 있습니다. 잘 풀리지 않은 코드는 다음과 같이 작동합니다.

u [                     ; until
    i g^ a nx a [       ; if greater? args next args
       rv a             ; reverse args
    ]                   ; (we want the block containing the next value first)

    ap g tk f a         ; append output take first args
    m? f a              ; empty? first args
]                       ; (first block is now empty)

ap g sc a               ; append output second args
                        ; (add the remainder of the second)

필자는 블록이 입력 길이의 최대 횟수만큼 루프되기 때문에 O (n) 요구 사항을 충족한다고 생각합니다 (그리고 reverse블록 자체가 아닌 입력 블록의 컨테이너 순서 만 전환합니다). 사용 take은 아마도 자유이지만 여전히 미미한 효율성입니다.

리볼 ( 83 75 자)

약간의 차이가 있습니다. Rebol에서 경로는 first또는 보다 짧은 표현 second입니다. a두 블록을 포함하는 입력 블록입니다.

until[if a/2/1 < a/1/1[reverse a]append o:[]take a/1 tail? a/1]append o a/2

5

OP의 솔루션 :

하스켈 49 44 40

k@(p:r)%l@(q:s)|p>=q=q:k%s|0<1=l%k
a%_=a

파이썬 131 105 101 99 93

@Evpok 덕분에 :

f=lambda u,v:v and(v[-1]<u[-1]and f(v,u)or[b.append(a)for a,b in[(v.pop(),f(u,v))]]and b)or u

1
a%b=a++b빈 패턴을 처리하기 위해 기본 패턴 일치 후에 쓸 수 있으므로 몇 개의 문자가 제거됩니다.
swish

첫 번째 목록에 먼저 내용이 없으면 Haskell 솔루션이 실패하지 않습니까?
John Dvorak

첫 번째 함수를 보면 짧은 목록을 두 번째 인수로, 긴 목록을 첫 번째 인수로 사용하여 함수를 재귀 적으로 호출하거나 인수를 바꿉니다. 따라서 첫 번째 주장은 결코 짧아지지 않습니다. OP에 의해 비우기 시작하지 않기 때문에 절대 비워지지 않습니다.
isaacg

4

파이썬 (79)

from itertools import*
def m(*a):
 while any(a):yield min(compress(a,a)).pop(0)

파이썬 (95, 우리가 발전기를 반환 할 수없는 경우)

from itertools import*
def m(*a):
 r=[]
 while any(a):r+=[min(compress(a,a)).pop(0)]
 return r

Itertools는 모든 세계적 문제에 대한 솔루션입니다.

보너스 :이 두 가지는 임의의 수의 목록에서 작동하며 빈 목록에 대해 걱정하지 마십시오 (빈 목록 2 개를 가져 와서 빈 목록을 반환하거나 비어있는 목록 1 개 또는 비어 있지 않은 목록 1 개를 가져옵니다). 비어 있지 않은 것을 반환합니다. 양보되지 않은 두 가지 기능의 또 다른 추가 기능 : 인수없이 실행되며 빈 목록 만 반환합니다.)

언 골프 드 :

from itertools import *  # Import all items from itertools
def m(*a):               # Define the function m, that takes any number of arguments, 
                         #  and stores those arguments in list a
    r=[]                 # Create an empty list r                         
    while any(a):        # While any element in a returns True as value:
        b=compress(a,a)  # Remove any element from a that isn't True (empty lists)
                         #  The example in the official documentation is this one:
                         #  compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F
        c=min(b)         # Sort the lists by first value, and take the first one of these.
        d=c.pop(0)       # Take the first element from c
        r.append(d)      # Append this first element to r
    return r             # Gives back r

발전기가없는 솔루션에서는 r+=[...]대신 사용 r.append(...)(매번 4 문자 절약)
hlt

나는 이것에 대한 어떤 위반도 의미하지 않지만, 귀하의 답변에 골프 용으로 특별히 수정 된 다른 언어 인 언어의 코드가 포함되어 있다면, 그것을 하향 투표 할 것입니다. 부끄러운 일이지만 실제 파이썬 답변이 좋습니다.
undergroundmonorail

당신이 그들을 다른 게시물로 나누면 나는 파이썬을 올리려고합니다.
undergroundmonorail

4
@undergroundmonorail 당신은 모든 GolfScript 답변을 downvote합니까?
Evpok

1
@Evpok 이제 언급 했으므로 메타에 던져서 그들이 무엇을 말해야하는지 볼 수 있습니다.
ɐɔıʇǝɥʇuʎs

3

C-75

이것은에서 작동 NULL의 종료 배열 int *이에 대한 적절한 비교 함수를 대체하여 다른 유형에 대한 포인터를 위해 동등하게 잘 작동하지만, **b < **a(예를 strcmp(*b, *a) < 0).

void m(int**a,int**b,int**c){while(*a||*b)*c++=!*a||*b&&**b<**a?*b++:*a++;}

언 골프 드 :

void merge(int **a, int **b, int **c)
{
    while(*a || *b)
        *c++ = !*a || *b && **b < **a
            ? *b++
            : *a++;
}

3

골프 스크립트, 29 27 30 29 26 바이트

~{.0=@.0=@<{}{\}if(@@.}do;~]p

또는

~{.0=@.0=@>{\}*(@@.}do;~]p

작동 원리

명령

golfscript merge.gs <<< '[2 3] [1 4]'

다음과 같이 처리됩니다.

~            # Interpret the input string.
             #
             # STACK: [2 3] [1 4]
{            #
    .@=0.@=0 # Duplicate the two topmost arrays of the stack and extract their first 
             # elements. This reverses the original order of the first copy.
             #
             # STACK: [1 4] [2 3] 2 1
             #
    >        # Check if the respective first elements of the arrays are ordered.
             #
             # STACK: [1 4] [2 3] 1
             #
    {\}*     # If they are not, swap the arrays. This brings the array with the smallest
             # element to the top of the stack.
             #
             # STACK: [2 3] [1 4]
             #
    (@@      # Shift the first element of the array on top of the stack and rotate it
             # behind the arrays.
             #
             # STACK: 1 [2 3] [4]
             #
    .        # Duplicate the topmost array.
             #
             # STACK: 1 [2 3] [4] [4]
             #
}do          # Repeat this process if the array is non-empty.
             #
             # STACK: 1 [2 3] [4] -> 1 2 [4] [3] -> 1 2 3 [4] []
             #
;~           # Delete the empty array from the stack and dump the non-empty array.
             #
             # STACK: 1 2 3 4
             #
]p           # Combine all elements on the stack into a single array, the to a string and
             # print.

출력은 다음과 같습니다.

[1 2 3 4]

Does duplication of arrays in stack makes it O(n^2)?
swish

@swish: I'm no computer scientist, but I'd say it depends on the implementation. If the interpreter actually duplicates the entire arrays, I guess it does.
Dennis

이전 버전은 매우 유사한 배열 (예 : [1 1 1 ... 2][1 1 1 ... 3])의 경우 O (n ^ 2)였습니다 .이 경우 첫 번째 요소가 아닌 배열을 비교하는 것이 매우 느리기 때문입니다.
Dennis

새 버전에서 수행되는 유일한 배열 작업은 스택에서 복제, 스왑 및 회전입니다. 복제 된 배열은 단일 요소를 추출하고 골프 공에서 파괴적인 작업이 아닌 배열에 대해 배열을 테스트하는 데만 사용되므로 위의 코드는 O (n) 시간에 실행될 수 있습니다. 배열). 실제 성능은 통역사에 따라 다릅니다.
Dennis

2

제이 - 42 33

Modified version from here + the comment of @algorithmshark

k=:(m}.),~0{]
m=:k~`k@.(>&{.) ::,

k prepends the head of the right array to the merged tails of both arrays. k~ is the same, but with arrays flipped. (>&{.) is comparing the heads. The code will throw an error if one of the arrays is empty, in that case we return just their concatenation ,.


I'm presuming that since /:~ a,b is the forbidden answer (along with [:/:~,), that you're shooting for the shortest answer that does not include /:, right?
Dane

I will point out that the question states, "Don't worry about empty lists."
Dane

@Dane The test for emptiness required for recursion to stop.
swish

m=:k~`k@.(>&{.)`,@.(0=*&#) saves 2 char.
algorithmshark

In fact, you can get the whole thing down to 33 char: k=:(m}.),~0{] and m=:k~`k@.(>&{.) ::,. We use 0{ to throw an error when the list is empty, and then catch that error and exit with ,.
algorithmshark

2

JavaScript (ES6), 69 79 bytes

f=(a,b,c=[])=>(x=a[0]<b[0]?a:b).length?f(a,b,c.concat(x.shift())):c.concat(a,b)

How it works

f = (a, b, c = []) =>          // `f' is a function that takes arguments `a', `b' and `c' -
                               // `c' defaults to `[]' - which returns the following
                               // expression:
                               //
 (x = a[0] < b[0] ? a : b)     // Store the array among `a' and `b' with the smaller first 
                               // element in `x'.
                               //
 .length ?                     // If it's non-empty,
                               //
  f(a, b, c.concat(x.shift())) // append the first element of array `x' to array `c' and run
                               // `f' again;
                               //
  : c.concat(a,b)              // otherwise, append the arrays `a' and `b' to `c'.
                               //
)

Comparing the arrays with the < operator isn't valid as it does a string comparison: f([123, 456, 789], [1, 2, 3, 4, 5]) => [1, 123, 2, 3, 4, 456, 5, 789]
nderscore

@nderscore: Right. It wouldn't have worked anyway, since comparing the whole arrays might not be O(n). The same seems to be true for the non-emptiness test, which has to convert the entire array to a string.
Dennis

Yeah, I'm not sure what the big-o for array->string type conversion is.
nderscore

1
Concatenating an array with [] and then converting it into a string requires O(n) time. Doing so once for all n elements of the array takes O(n^2) time.
Dennis

Makes sense. Got it.
nderscore

2

Python (63)(69)(71)

def m(a,b):
 if a[0]>b[0]:a,b=b,a
 return[a.pop(0)]+(m(a,b)if a else b)

I wrote this before seeing OP's comments on runtimes of other answers, so this is another solution that's O(n) in algorithm but not implementation.


What algorithms have extracts from the front of arrays as O(1)? What algorithms have list comparisons take O(1)? Also, you can golf it further by changing ... if ... else ... to ... and ... or ...
isaacg

@isaacg Shoot, I'd forgotten about repetitions possibly making the list comparison O(n). So, I've taken out that optimization for 6 more characters. You can extract from and append to the front in O(1) in a linked list. I don't see how you can make ...and...or... play nice with returning the value.
xnor

OK, I see now how to do ...and...or..., but it doesn't save chars due to the parens needed. return[a.pop(0)]+(a and m(a,b)or b)
xnor

@isaacg: To extract the front of an array in O(1), just increase the array pointer such that it points to the second element and release the memory consumed by the first element.
Wrzlprmft

@Wrzlprmft I couldn't get the array trick to work because both elements of the array are evaluated regardless of the boolean value, which throws an error when a is the empty list. Is there a short way to make a "lazy array"?
xnor

2

Haskell, 35 bytes

a#b@(c:d)|a<[c]=b#a|0<1=c:a#d
a#_=a

Haskell, 30 bytes (non-competing)

This non-competing version only guarantees linear runtime if a and b have disjoint elements; otherwise it still runs correctly but may use quadratic time.

a#b|a<b=b#a|c:d<-b=c:a#d
a#_=a

2

PHP 91 98 91 bytes

edit #1: Empty $b requires an addional condition in the curly braces (+7).
edit #2: minor golfings
edit #3: added second version

pretty straight forward. The nicest part is the ternary inside the array_shift
(which fails if you try it without the curlys)

function m($a,$b){for($c=[];$a|$b;)$c[]=array_shift(${$a&(!$b|$a[0]<$b[0])?a:b});return$c;}

or

function m($a,$b){for($c=[];$a|$b;)$c[]=array_shift(${$a?!$b|$a[0]<$b[0]?a:b:b});return$c;}

ungolfed

function m($a,$b)
{
    $c=[];
    while($a||$b)
    {
        $c[] = array_shift(${
            $a&&(!$b||$a[0]<$b[0])
                ?a
                :b
        });
#       echo '<br>', outA($a), ' / ', outA($b) , ' -> ', outA($c);
    }
    return $c;
}

test

$cases = array (
    [1],[0,2,3,4], [0,1,2,3,4],
    [1,5,10,17,19],[2,5,9,11,13,20], [1, 2, 5, 5, 9, 10, 11, 13, 17, 19, 20],
    [1,2,3],[], [1,2,3],
    [],[4,5,6], [4,5,6],
);
function outA($a) { return '['. implode(',',$a). ']'; }
echo '<table border=1><tr><th>A</th><th>B</th><th>expected</th><th>actual result</th></tr>';
while ($cases)
{
    $a = array_shift($cases);
    $b = array_shift($cases);
#   echo '<hr>', outA($a), ' / ', outA($b) , ' -> ', outA($c);
    $expect = array_shift($cases);
    $result=m($a,$b);
    echo '<tr><td>',outA($a),'</td><td>',outA($b),'</td><td>', outA($expect), '</td><td>', outA($result),'</td></tr>';
}
echo '</table>';

I could not understand why you make it not simple $a&(!$b|$a[0]<$b[0])?$a:$binstead of ${$a&(!$b|$a[0]<$b[0])?a:b}
Jörg Hülsermann

1
@JörgHülsermann The array_shift parameter is used by reference. It has to be a variable; an expression won´t work.
Titus

1

Go, 124 chars

func m(a,b[]int)(r[]int){for len(a)>0{if len(b)==0||a[0]>b[0]{a,b=b,a}else{r=append(r,a[0]);a=a[1:]}};return append(r,b...)}

1

JavaScript - 133

function m(a,b){c=[];for(i=j=0;i<a.length&j<b.length;)c.push(a[i]<b[j]?a[i++]:b[j++]);return c.concat(a.slice(i)).concat(b.slice(j))}

Same sort of approach as OP's.


1

perl, 87 chars / perl 5.14, 78+1=79 chars

This implementation clobbers the input array references. Other than that, it's pretty straight-forward: while both arrays have something, shift off the lower of the two. Then return the merged bit joined with any remaining bits (only one of @$x or @$y will remain). Straight-up perl5, 87 chars:

sub M{($x,$y,@o)=@_;push@o,$$x[0]>$$y[0]?shift@$y:shift@$x while@$x&&@$y;@o,@$x,@$y}

Using perl 5.14.0 and its newfangled arrayref shift: 78 chars + 1 char penalty = 79 chars:

sub M{($x,$y,@o)=@_;push@o,shift($$x[0]>$$y[0]?$y:$x)while@$x&&@$y;@o,@$x,@$y}

* instead of && will save a byte. And even more if sub M{map{shift(!@$x+@$y*($$y[0]<$$x[0])?$y:$x)}map@$_,($x,$y)=@_}
user2846289

@VadimR, wow. nice work. Go ahead and post that if you like - I never would have thought to do the double map trick instead of pushing on an array.
skibrianski

1

Java: 144

This is pretty straightforward. A function that takes two arrays and returns one, the merged version, golfed and without compilation wrapper:

int[]m(int[]a,int[]b){int A=a.length,B=b.length,i,j;int[]c=new int[A+B];for(i=j=0;i+j<A+B;c[i+j]=j==B||i<A&&a[i]<b[j]?a[i++]:b[j++]);return c;}

Ungolfed (with compile-able and runnable wrapper):

class M{
    public static void main(String[]args){
        int[]a=new int[args[0].split(",").length];
        int i=0;
        for(String arg:args[0].split(","))
            a[i++]=Integer.valueOf(arg);
        int[]b=new int[args[1].split(",").length];
        int j=0;
        for(String arg:args[1].split(","))
            b[j++]=Integer.valueOf(arg);
        int[]c=(new M()).m(a,b);
        for(int d:c)
            System.out.printf(" %d",d);
        System.out.println();
    }
    int[]m(int[]a,int[]b){
        int A=a.length,B=b.length,i,j;
        int[]c=new int[A+B];
        for(i=j=0;i+j<A+B;c[i+j]=j==B||i<A&&a[i]<b[j]?a[i++]:b[j++]);
        return c;
    }
}

Example executions:

$ javac M.java
$ java M 10,11,12 0,1,2,20,30
 0 1 2 10 11 12 20 30
$ java M 10,11,12,25,26 0,1,2,20,30
 0 1 2 10 11 12 20 25 26 30

Any tips to shorten would be appreciated.


1

Scala, 97 bytes

Recursive solution with O(n). To shorten the code, sometimes an operation is done by switching the 2 interchangeable parameters, i.e. f(a,b) calls f(b,a).

type L=List[Int];def f(a:L,b:L):L=if(a==Nil)b else if(a(0)<=b(0))a(0)::f(a.drop(1),b) else f(b,a)

Ungolfed:

type L=List[Int]

def f(a:L, b:L) : L =
  if (a == Nil)
    b 
  else 
    if (a(0) <= b(0))
      a(0) :: f(a.drop(1), b) 
    else
      f(b,a)

Exception if a is non empty, but b is empty
Dan Osipov

1

APL (32)

{⍺⍵∊⍨⊂⍬:⍺,⍵⋄g[⍋g←⊃¨⍺⍵],⊃∇/1↓¨⍺⍵}

Explanation:

{⍺⍵∊⍨⊂⍬                               if one or both of the arrays are empty
        :⍺,⍵                           then return the concatenation of the arrays
             ⋄g[⍋g←⊃¨⍺⍵]              otherwise return the sorted first elements of both arrays
                          ,⊃∇/        followed by the result of running the function with
                               1↓¨⍺⍵}  both arrays minus their first element

1

LISP, 117 bytes

The algorithm ends in n + 1 iterations, where n is the length of the shortest list in input.

(defun o(a b)(let((c(car a))(d(car b)))(if(null a)b(if(null b)a(if(< c d)(cons c(o(cdr a)b))(cons d(o a(cdr b))))))))


0

Python – 69 bytes

def m(A,B):
    C=[]
    while A and B:C+=[[A,B][A>B].pop(0)]
    return C+A+B

If the order of input and output were descending, this could be shortened to 61 bytes:

def m(A,B):
    C=[]
    while A+B:C+=[[A,B][A<B].pop(0)]
    return C

And further down to 45 bytes if generators are allowed:

def m(A,B):
    while A+B:yield[A,B][A<B].pop(0)

This is definitely not O(n). .pop(0) and += are both O(n) operations you do O(n) times.
isaacg

I didn’t even know until now that lists aren’t implemented as lists in Python and even then pop(0) can be implemented in O(1) and += can at least be implemented better than O(n) (see the link). By the way, your solution uses += (i.e., append and extend) as often as mine. Anyway, all that is an implementation question (as far as I know), so in a (fictional) Python implementation, where lists are implemented as lists, my function is O(n). Finally your question required the algorithm to be O(n), and mine is.
Wrzlprmft

Actually, append and extend are implemented differently in python than += is. += creates a new list, while .append and .extend modify an existing one.
isaacg

0

Perl 6: 53 characters

sub M(\a,\b){{shift a[0]>b[0]??b!!a}...{a^b},a[],b[]}

Shift from whichever of a or b has the smaller value, until a XOR b (a^b) is true. Then return whatever is left, flattening ([]) the arrays into the list (a[],b[]).

Assuming shifting from the start of an array is O(n), the worst case is two comparisons and one shift per element, so the algorithm is O(n).


0

JavaScript (ES5) 90 86 90 bytes

function f(a,b){for(o=[];(x=a[0]<b[0]?a:b).length;)o.push(x.shift());return o.concat(a,b)}

edit: (90 - >86) Moved the ternary into the for loop condition. Idea stolen from Dennis.

edit: (86 -> 90) Removed Array to String cast, as it breaks the O(n) requirement.


0

Mathematica, 137 135

m[a_,b_]:=(l=a;Do[Do[If[b[[f]]<=l[[s]],(l=Insert[l,b[[f]],s];Break[]),If[s==Length@l,l=l~Append~b[[f]]]],{s,Length@l}],{f,Length@b}];l)

Input:

m[{2,2,4,6,7,11},{1,2,3,3,3,3,7}]

Output:

{1, 2, 2, 2, 3, 3, 3, 3, 4, 6, 7, 7, 11}

Ungolfed:

mergeList[a_, b_] := (
    list = a;
    Do[
        Do[(
            If[
                b[[f]] <= list[[s]],
                (list = Insert[list, b[[f]], s]; Break[]),
                If[
                    s == Length@list,
                    list = list~Append~b[[f]]
                ]
        ]),
        {s, Length@list}
    ],
    {f, Length@b}
    ];
    list
)

Could probably do better.


m[a:{x___,y_},b:{___,z_}]:=If[y<z,b~m~a,{x}~m~b~Join~{y}];{}~m~b_=b;
alephalpha

0

R, 80

Same solution as in Scala and other languages. I am not so sure about x[-1] is O(1).

f=function(a,b)if(length(a)){if(a[1]<=b[1])c(a[1],f(a[-1],b))else f(b,a)}else b

0

Mathematica, 104 bytes

Reap[{m,n}=Length/@{##};i=k=1;Do[If[k>n||TrueQ[#[[i]]<#2[[k]]],Sow@#[[i++]],Sow@#2[[k++]]],n+m]][[2,1]]&

Anonymous function, stores the length of the two input lists in the variables m and n, then each iteration of the Do loop Sows an element of one the lists incrementing the counter for that list (i for the first, k for the second) by one. If one of the counters exceeds the length of the list, the If statement will always Sow the element from the other list. After n+m operations, all the elements have been taken care of. Reap or rather part [[2,1]] of its output is a list of elements in the order they have been Sown.

I'm not sure of the internals (is accessing a part of a list a O(1) operation or not), but timings looked quite linear on my machine with respect to input list length.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.