세련된 파티션


19

정수 배열을 고려하십시오.

[1, 0, 9, 1, 3, 8]

이 목록을 연속 된 하위 목록으로 분할하는 방법에는 여러 가지가 있습니다. 다음은 세 가지입니다.

A: [[1, 0, 9], [1, 3, 8]]
B: [[1], [0, 9], [1, 3], [8]]
C: [[1, 0], [9, 1], [3, 8]]

하위 목록 중 일부를 다시 결합 하여 Y 에서 X 를 얻을 수 있으면 파티션 Y 와 다른 파티션 X의 구체화를 호출합니다 .

그래서 B의 정제이다 A: 우리가 다시 함께 처음 두와 마지막 두 하위 목록에 가입하는 경우, 우리는 얻을 A. 그러나 C하지 의 정제 A: 우리는 분할해야 할 것 9하고 1복구하기 위해 A그것에서. 또한 모든 파티션은 사소하게 개선됩니다.

우리는 어떤 시점에서도 하위 목록이나 요소를 재 배열 할 수 없습니다.

도전

두 개의 파티션 (정수 목록 목록)이 주어 X지고 의 세분화 Y여부를 결정하십시오 .YX

파티션은 0~ 9까지의 정수만 포함한다고 가정 할 수 있습니다 . 당신은 가정하지 않아야 X하고 Y(그렇지 않을 경우 그들은 또한 서로의 개선하지 않습니다) 동일한 목록의 파티션입니다. X및 / 또는 Y비어있을 수 있지만 빈 하위 목록을 포함하지 않습니다.

STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받고 STDOUT (또는 가장 가까운 대안), 함수 리턴 값 또는 함수 (out) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다.

편리한 문자열 또는 목록 형식으로 입력 할 수 있습니다. 요소는 한 자리 정수일 뿐이므로 하위 목록 내에서 구분 기호를 생략하도록 선택할 수 있지만 선행 0s가 가능 해야 합니다. 당신은 걸릴하도록 선택할 수 있습니다 XY반대 순서.

출력해야 truthy 경우 Y의 정교화하고있다 Xfalsy 그렇지.

코드는 합리적인 데스크톱 컴퓨터에서 1 초 안에 아래의 각 테스트 사례를 해결할 수 있어야합니다. (이것은 단순한 무차별 대입 솔루션을 피하기위한 위생 검사일뿐입니다.)

이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다.

테스트 사례

각 테스트 사례는로 작성됩니다 X Y. 수평 공간을 절약하기 위해 GolfScript / CJam 스타일 배열 표기법을 사용하고 있습니다.

진실한 :

[] []
[[0]] [[0]]
[[1 0 9 1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9 1 3 8]] [[1 0 9 1 3] [8]]
[[1 0 9 1 3 8]] [[1] [0] [9] [1] [3] [8]]
[[1 0 9] [1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5] [1 4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]

거짓 :

[[0]] []
[[0]] [[1]]
[[1 0 9]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9 1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9]]
[[1 0 9] [1 3 8]] [[1 0] [9]]
[[1 0 9] [1 3 8]] [[1 0] [9 1] [3 8]]
[[1] [0 9] [1 3] [8]] [[1 0 9] [1 3 8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5 1] [4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 점수를 높이면 헤드 라인을 쳐서 오래된 점수를 유지할 수 있습니다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

<script>site = 'meta.codegolf'; postID = 5314; isAnswer = true; QUESTION_ID = 51719</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>

관련 도전


싶은 [[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]]또는 [["109" "138"] ["1" "09" "13" "8"]]허용 입력 포맷 될?
Dennis

@Dennis 전체 입력을 배열로 감싸는 것은 이상하게 보입니다. 나는 그것이 표준 관행이라는 것을 알지 못하지만 메타 질문의 가치가 있습니다. 외부 괄호가 없으면 확실히 좋습니다.
Martin Ender 2016 년

메타 질문을 작성하려고합니다.
Dennis

답변:


6

CJam, 13 10 9 바이트

lr.-F-U-!

CJam 통역사 에서 온라인으로 사용해보십시오 .

@ edc65의 독창적 인 입력 형식 을 제안 해 주신 @ MartinBüttner 에게 감사드립니다 .

입력 형식을 개선하고 3 개의 추가 바이트를 제공하는 @ jimmy23013에게 감사합니다.

I / O

입력

하위 목록은 다음과 같이 서로 구분 ;됩니다 ,.

1;0;9,1;3;8
1,0;9,1;3,8

산출

1

작동 원리

lr e# Read line and a whitespace-separated token from STDIN.
.- e# Vectorized difference. Pushes the differences of corresponding code points.
F- e# Remove all occurrences of 15 (';' - ',') from the array.
U- e# Remove all occurrences of 0 from the array.
!  e# Push 1 if the resulting array is empty and 0 if not.

길이가 다른 문자열의 .-경우 배열에 문자를 남겨두고 정수 0 또는 15와 같을 수 없습니다.


당신이 사용할 수있는 경우 ;분리로 ... ll.m27m0-!.
jimmy23013

@ jimmy23013 : 왜 안되는지 모르겠습니다. ,그리고 ;일반적인 배열 구문입니다 (CJam에서 사용되지 않는 구문). 감사!
Dennis

9

Pyth, 19 바이트

&gF_m{.u+NYdYQqFsMQ

온라인으로 사용해보십시오 : 데모 또는 테스트 장치

Pyth의 튜플 / 목록 형식을 입력으로 사용하고 있습니다. 테스트 케이스의 공백을 쉼표로 바꾸십시오.

설명:

                     implicit: Q is the evaluated input
    m        Q       map each input list d to:
      .u   dY          reduce with intermediate states over d, initial value = []
        +NY              update initial value N with sum of N and Y (current element of d)
     {                 generate a set
   _                 invert
 gF                  check, if the first element is >= (superset) than the second
&                    and
                sMQ  check, if the joined lists of the input
              qF     are equal

의사 코드는 여전히 약간 혼란 스럽기 때문에 예제 입력을 사용하여 알고리즘을 시연합니다.

Input: [[1,0,9],[1,3,8]],[[1],[0,9],[1,3],[8]]

.u+NYdY부분은 첫 번째 요소를 포함하는 모든 연속 하위 목록을 계산한다.

[[1,0,9],[1,3,8]]     => [[], [1,0,9], [1,0,9,1,3,8]]
[[1],[0,9],[1,3],[8]] => [[], [1], [1,0,9], [1,0,9,1,3], [1,0,9,1,3,8]]

BA각 연속 하위 목록이 A연속 하위 목록 인 경우 B(단 하나의 예외 만 있음)의 개선입니다.

따라서 연속 하위 목록 A집합이 B( gF_m.u+NYdYQ) 연속 하위 목록 집합의 하위 집합 인지 간단히 확인 합니다.

첫 번째 입력 목록에 두 번째 입력 목록보다 적은 수의 요소가 포함 된 경우는 예외입니다. 예를 들어 input을 <Fm.u+YdYQ반환 True합니다 [[1]],[[1],[2]].

따라서 조인 된 목록도 같은지 확인 &...qFsMQ합니다.


7

자바 스크립트 ( ES6 ), 67 70

3 바이트 저장된 @apsillers 편집

Firefox에서 아래 스 니펫을 실행하여 테스트하십시오.

f=(a,b)=>a+''==b // same values in the lists ?
&![...a.join(' ')].some((c,p)=>c<','&b.join(c)[p]>c) // splits in a are present in b?

// TEST

out=x=>O.innerHTML += x+'\n';

OK=[
[[],[]],
[[[0]],[[0]]],
[[[1,0,9,1,3,8]],[[1,0,9],[1,3,8]]],
[[[1,0,9,1,3,8]],[[1,0,9,1,3],[8]]],
[[[1,0,9,1,3,8]],[[1],[0],[9],[1],[3],[8]]],
[[[1,0,9],[1,3,8]],[[1,0,9],[1,3,8]]],
[[[1,0,9],[1,3,8]],[[1],[0,9],[1,3],[8]]],
[[[9,8,8,5,8,2,7],[5],[1,4],[2,0,0,6,0,8,4,2,6,4,2,3,7,8,7,3,9,5,7,9,8,2,9,5],[3,9,8],[7,1,4,9,7,4,5,9],[3,3,3],[9,0,7,8],[3,9,4,7,2,7,8,0,3,0],[8,2,2,7,3,9,3,2],[2,9,0,8,5,4,1,8,5,5,6,2,0,9,2,7,7,9,2,7],[3,6],[1,2,7,7,4,4,2,9]],[[9,8],[8],[5,8,2],[7],[5],[1,4],[2],[0,0,6],[0],[8,4,2],[6,4],[2],[3],[7,8],[7,3],[9],[5,7,9],[8,2],[9,5],[3],[9,8],[7,1,4],[9,7],[4,5,9],[3,3],[3],[9,0],[7,8],[3],[9],[4],[7,2],[7,8],[0],[3,0],[8,2],[2],[7,3],[9,3],[2],[2],[9],[0],[8,5,4],[1,8],[5,5],[6],[2,0],[9],[2],[7,7,9],[2,7],[3,6],[1,2],[7,7],[4,4,2],[9]]]
];

KO=[
[[[0]],[]],
[[[0]],[[1]]],
[[[1,0,9]],[[1,0,9],[1,3,8]]],
[[[1,0,9],[1,3,8]],[[1,0,9,1,3,8]]],
[[[1,0,9],[1,3,8]],[[1,0,9]]],
[[[1,0,9],[1,3,8]],[[1,0],[9]]],
[[[1,0,9],[1,3,8]],[[1,0],[9,1],[3,8]]],
[[[1],[0,9],[1,3],[8]],[[1,0,9],[1,3,8]]],
[[[9,8,8,5,8,2,7],[5],[1,4],[2,0,0,6,0,8,4,2,6,4,2,3,7,8,7,3,9,5,7,9,8,2,9,5],[3,9,8],[7,1,4,9,7,4,5,9],[3,3,3],[9,0,7,8],[3,9,4,7,2,7,8,0,3,0],[8,2,2,7,3,9,3,2],[2,9,0,8,5,4,1,8,5,5,6,2,0,9,2,7,7,9,2,7],[3,6],[1,2,7,7,4,4,2,9]],[[9,8],[8],[5,8,2],[7],[5,1],[4],[2],[0,0,6],[0],[8,4,2],[6,4],[2],[3],[7,8],[7,3],[9],[5,7,9],[8,2],[9,5],[3],[9,8],[7,1,4],[9,7],[4,5,9],[3,3],[3],[9,0],[7,8],[3],[9],[4],[7,2],[7,8],[0],[3,0],[8,2],[2],[7,3],[9,3],[2],[2],[9],[0],[8,5,4],[1,8],[5,5],[6],[2,0],[9],[2],[7,7,9],[2,7],[3,6],[1,2],[7,7],[4,4,2],[9]]]
];

dump=l=>l.map(x=>'['+x+']').join(',');

out('YES');
OK.forEach(l=>out(f(l[0],l[1])+' a['+dump(l[0])+'] b['+dump(l[1])+']'));
out('NO');
KO.forEach(l=>out(f(l[0],l[1])+' a['+dump(l[0])+'] b['+dump(l[1])+']'));
<pre id=O></pre>


요즘에는 멋진 솔루션이 작동하는지 확인하기 위해 Firefox를 다운로드해야합니다. :)
Alex A.

@AlexA. 그것없이 어떻게 살 수 있습니까?
edc65 2016 년

repl.it 사용, ES6 : D
Mark K Cowan

난 당신이 변수라는 방법을 좋아 OK하고 KO.
rr-

7

C, 69 75

2 개 문자열 매개 변수가있는 함수로 0 또는 1을 반환합니다.

매개 변수 형식 : 공백 ( '')으로 구분 된 하위 목록, 쉼표로 구분 된 목록 요소

예: "1,0,9 1,3,8" "1,0 9,1,3,8"

f(char*a,char*b){for(;*a-44?*a&&*b==*a:*b<48;a++)b++;return!(*b|*a);}

덜 골프

int f(char *a, char *b)
{
    // expected in a,b: digit,separator,digit... with separator being ' ' or ','
    for(; *a; a++,b++)
       // ' ' or digit in a must be the same in b
       // comma in a must be comma or space in b
       if (*a != ',' ? *b != *a : *b > *a) return 0;
    return !*b; // must have a null in *b too
}

Ideone 테스트 (구식)


1
입력 형식의 영리한 선택. 나는 또 다른 Haskell 답변을 위해 그것을 빌 렸습니다.
nimi

내 JS의 답변을 입력 아이디어를 찢어하고, 1 바이트로 판명 이상 나는 것으로 기대 한 것 ES6 ... ...로 업그레이드 할 때까지 C 버전보다
마크 K 코완

6

하스켈, 76 바이트

[]#[]=1<2
[x]#[y]=x==y
x@(a:b)#(c:d:e)|a==c=b#(d:e)|1<2=x#((c++d):e)
_#_=2<1

반환 True또는 False. 사용법 예 : [[1,0,9],[1,3,8]] # [[1,0],[9]]-> False.

간단한 재귀 접근법 : 첫 번째 요소가 일치하면 꼬리로 진행하고 다시 시작하지만 두 번째 목록의 앞면에 두 요소를 연결하십시오. 기본 사례는 다음과 같습니다. 두 목록이 모두 비어 있음-> True; 단일 요소를 가진 두 목록 모두-> 비교; 하나의 목록이 비어 있음-> False.


6

CJam, 19 바이트

q~]{_,,\f>:sS.+}/-!

온라인으로 사용해보십시오.

I / O

입력

[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]

산출

1

생각

다음 두 가지 속성을 관찰하여 각 파티션을 고유하게 식별 할 수 있습니다.

  • 모든 하위 목록을 연결하여 형성된 목록입니다.

  • 목록의 극단을 포함한 "절단 점"

각 절단 지점을 절단 지점에서 목록 끝까지의 하위 요소 목록으로 대체하여 두 기준을 하나로 결합 할 수 있습니다.

주어진 파티션이 다른 파티션보다 더 미세한 지 확인하려면 위와 같이 더 거친 파티션이 더 좋은 파티션의 하위 집합인지와 두 파티션의 가장 큰 목록이 일치하는지 확인하면됩니다.

암호

q~]   e# Read from STDIN and evaluate.
{     e# For each array P from the input:
  _,, e#   Push [0 ... L], where L == length(P) - 1.
  \f> e#   Push [P[0:] ... P[L]].
  :s  e#   Stringify each P[k:] (flattens).
  S.+ e#   Vectorized concatenation. This appends a space to the first element.
}/    e#
-!    e# Push the logical NOT of the difference A-B to check if A is a subset of B.

입력 양식의 I / O 예에서 스택은

["109138 " "138"] ["109138 " "09138" "138" "8"]

실행하기 전에 -!.

각 배열의 첫 번째 요소에는 후행 공백이 있습니다. 이를 통해 첫 번째 입력의 전체 목록과 두 번째 입력의 전체 목록을 비교할 수 있습니다.


5

CJam, 24 바이트

l~L\{+_a2$1<={;1>L}&}/+!

연산

여기서는 단순히 탐욕스러운 알고리즘을 사용 N하여 두 번째 목록의 첫 번째 하위 목록을 함께 병합하여 첫 번째 목록의 첫 번째 하위 목록을 형성 할 수 있는지 확인합니다. 그러한 N것이 발견되면 우리 N는 두 번째 목록에서 첫 번째 하위 목록을 제거하고 첫 번째 목록에서 첫 번째 하위 목록을 제거하고 프로세스를 반복합니다.

이상적으로, 두 번째 목록이 첫 번째 목록을 개선 한 경우 스택에 두 개의 빈 목록을 남겨 두어야합니다. 우리는 그것을 확인하고 그 1경우에 인쇄 합니다. 다른 조합에서는 두 번째 목록의 하위 목록을 완전히 반복 한 후에 빈 목록이 2 개로 끝나지 않습니다. 따라서 0그러한 경우에 a 가 인쇄됩니다.

코드 확장

l~L\{+_a2$1<={;1>L}&}/+!
l~L\                       e# Read the line, evaluate the two lists and put an empty list
                           e# between them
    {               }/     e# Iterate over all sub-lists of the second list
     +                     e# Append the current sub-list to whatever is on stack. Originally
                           e# an empty array, but eventually the sum of first N sub-lists
      _a                   e# Copy this and wrap it in an array
        2$                 e# Copy the first list on top of stack
          1<               e# Get only its first element wrapped in an array. This approach
                           e# is exception safe in case the array was already 0 length
            ={    }&       e# If we have a match, remove both first sub-lists
              ;            e# Remove the first N sub-lists array
               1>          e# Remove the first element from the first array
                 L         e# Put an empty array on stack to repeat the process
                      +!   e# If we are left with two empty arrays, sum them and do logical
                           e# not to get 1. If any of the arrays is non-empty, logical not
                           e# gives 0

여기에서 온라인으로 시도 하거나 여기 에서 전체 테스트 스위트를 실행하십시오.


3

C, 120 114 바이트

#define C(x),x+=(*x/93)*(1+!!x[1])|1
o;R(char*s,char*t){for(o=1;*s;o&=*s==t[2*(*t==93&&93>*s)]C(s)C(t));return o;}

나는 최근에 골프를 치지 않았으므로 이것을 시도해 볼 것이라고 생각했습니다.

우리는 함수를 정의 R(char* s, char* t)하는 반환 1하는 경우 t의 세련된 파티션 s하고, 0그렇지 않으면. st형식 것으로 예상되는 [DDDD...][DDDD...]...각 어디 D다른 한자리 소자이다.

테스트 코드 :

#include "stdio.h"

int main(int argc, char** argv) {
    char* str1, *str2;
    str1 = "[109][138]";
    str2 = "[1][09][13][8]";
    printf("Input: %s, %s --> %d\n", str1, str2, R(str1, str2));

    str1 = "[109][138]";
    str2 = "[1][19][13][8]";
    printf("Input: %s, %s --> %d\n", str1, str2, R(str1, str2));

    str1 = "[109][138]";
    str2 = "[10][91][3][8]";
    printf("Input: %s, %s --> %d\n", str1, str2, R(str1, str2));
}

위는 다음을 인쇄합니다.

Input: [109][138], [1][09][13][8] --> 1
Input: [109][138], [1][19][13][8] --> 0
Input: [109][138], [10][91][3][8] --> 0

적어도 작동하는 것 같습니다.


3

하스켈, 52 50 53 바이트

x#y=and$zipWith(\a b->a==b||a==',')(x++"..")(y++"..")

다른 솔루션 과는 완전히 다릅니다 . @ edc65의 답변 과 동일한 영리한 입력 형식을 사용합니다 . 즉, 요소는로 구분 ,되고로 나열됩니다 .

사용 예 : "1,0,9,1,3,8" # "1,0,9 1,3,8"-> True.

두 번째 매개 변수는 첫 번째 매개 변수가 모든 위치에서 동일한 요소를 갖거나 첫 번째 매개 변수가 인 경우 첫 번째의 세분화입니다 ,. 더 긴 매개 변수를 자르기 ..때문에 두 매개 변수 모두에 고유 한 엔드 토큰 (-> ) 을 추가해야 합니다 .zipWith"1,2,3" # "1,2"True


1
(\a b->a==b||a>b)그냥 (>=)입니다.
alephalpha

작업 "."대신 추가하지 ".."않습니까?
자랑스런 Haskeller 2016 년

이 실패 "2"#"1"값이 동일하지 더 큰 경우 기능 때문에 전용 체크
자랑 haskeller

@alephalpha : 오, 사랑하는 그게 얼마나 간과인지. 그러나 어쨌든 잘못되었습니다. 다른 의견을보십시오.
nimi

@proudhaskeller : 막판 편집. 예, 이것은 버그입니다. 고쳤다. 찾아 주셔서 감사합니다. BTW, 하나의 점은 "."없는 일, 그것 때문에 대한 가양 줄 것이라고합니다 "2,1" # "2"첫번째로 확장 것이다 "2,1." # "2."의해 잘립니다 다음과 zipWith에를 "2," # "2.". 첫 번째 문자열의 쉼표는 모든 항목과 일치합니다.
nimi

2

Mathematica, 65 바이트

f@__=1<0;{}~f~{}=1>0;{a_,b___}~f~{c__,d___}/;a==Join@c:={b}~f~{d}

1
좋은 해결책. 참고로, 재귀 (또는 여러 정의)를 사용하지 않는 59 바이트 솔루션이 있습니다.
Martin Ender 2016 년

2

정규 표현식이있는 수학은 재미 있습니다!

ES6 자바 스크립트, 53 자

(a,b)=>RegExp('^'+a.replace(/,/g,'[ ,]')+'$').test(b)

빈티지 자바 스크립트, 70 자

function f(a,b){return RegExp('^'+a.replace(/,/g,'[ ,]')+'$').test(b)

edc65 's answer 와 동일한 입력 형식을 사용합니다 .

모든 테스트 사례를 포함한 전체 데모.


영리한! 이 작업에 대한 정규식에 대해 생각하지 마십시오.
edc65

역 추적 정규식을 사용하여 주요 요소를 찾은 재귀 함수를 사용하여 정수를 인수 분해하는 펄 프로그램을 작성했습니다 ... 예쁘고 확실히 빠르지는 않지만 멋진 일을 할 수 있습니다!
Mark K Cowan

또한 언어 사양을 정규식으로 변환하는 파서 생성기를 작성했으며이 정규식을 사용하여 지정된 언어로 표현을 구문 분석 할 수 있습니다. 기본적으로 사람이 읽을 수있는 언어 사양을 "실행 가능"정규식으로 "컴파일"합니다. github.com/battlesnake/d-slap AngularJS 이해 표현식을 파싱하기 위해 생성 된 정규 표현식의 길이는 약 400-500 자입니다.
Mark K Cowan

2

수학, 55 바이트

Equal@@Join@@@#&&SubsetQ@@(Accumulate[Length/@#]&)/@##&

이것은 하나의 list에서 두 개의 파티션 을 역순 (즉, Y첫 번째, X두 번째)으로 가져 오는 명명되지 않은 함수를 정의합니다 .

설명

Equal@@Join@@@#

이것은 두 파티션이 실제로 같은 목록의 파티션인지 확인합니다.

SubsetQ@@(Accumulate[Length/@#]&)/@##

이것은 Mathematica.SE에 대한이 질문에 대한 나의 접근 방식의 골치 아픈 형태입니다 . 기본적으로 분할은 분할이 삽입되는 여러 인덱스로 정의되며 하위 목록의 길이를 누적하여 모든 분할 위치가 X나타나는지 확인합니다 Y.


2

파이썬 2, 68 51 바이트

상당한 바이트 절약을위한 xnor에 감사합니다!

형태의 두 개의 문자열 소요 익명 기능 "1,0,9 1,3,8"(에서 촬영 edc65의 C 응답 반환) TrueFalse. map(None)Python 3에서는 더 이상 새 버전이 작동하지 않습니다.

lambda a,b:all(i in[j,","]for i,j in map(None,a,b))

테스트 스위트 :

>>> def runTests(f):
    assert f("1,0,9 1,3,8","1 0,9 1,3 8")
    assert not f("1,0,9 1,3,8","1,0 9,1 3,8")
    assert f("1 0,9 1,3 8","1 0,9 1,3 8")
    assert not f("1 0,9 1,3 8","1,0,9 1,3,8")
    assert not f("1 0,9 1,3 8","1 0,9 1,3")
    assert not f("1 0,9 1,3,8","1 0,9 1,3")
    print("All tests pass.")


>>> runTests(lambda a,b:all(i in[j,","]for i,j in map(None,a,b)))
All tests pass.

다음과 같이 입력을받는 이전 92 바이트 솔루션 "109 138":

def R(a,b):
 r=1
 for i in b.split():r&=a.find(i)==0;a=a[len(i):].strip()
 return r and""==a

None매핑 하여 명시 적 길이 검사를 피할 수 있다고 생각합니다 . 하나의 목록은 다른 목록보다 긴 경우 하나의 목록에는 None있지만 다른 색인에는 번호가있는 경우 거부 i==j or"0">i>j됩니다. 보유 할 수 없기 때문 입니다.
xnor

내가 빠진 것이 아니라면 두 번째 시험은 단지 될 수 있습니다 i==','. 이것은 당신이 같은 테스트를 결합 할 수 있습니다 i in[',',j](우리가 할 수 i in ','+j있기 때문에) j수 있습니다 None.
xnor

@xnor 와우, 고마워. 파이썬 1에서 생각하는 데 익숙하기 때문에 # 1은 나에게 일어나지 않았습니다. "2는 b그 자리에 숫자가 있다면 어떨까요?" ...이 입력 형식으로는 잊을 수 없습니다.
DLosc 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.