매치 메이커, 매치 메이커


21

(우리 Find는를 찾지 않거나 잡지 않을 것입니다 tryCatch)

이것은 흥미로운 R 함수를 구현하는 여러 부분으로 구성된 시리즈의 2 부입니다. 하나는 여기 에서 찾을 수 있습니다 .

작업:

가능한 적은 바이트로 R의 match기능 을 구현 해야합니다.

입력:

  • x비어있는 정수 목록 / 배열
  • table비어있는 정수 목록 / 배열
  • nomatch단일 정수 값
  • incomparables비어있는 정수 목록 / 배열

산출:

  • O길이가 같은 정수 의 단일 배열 / 목록 x. 각 값 O[i]은 다음 중 하나를 나타냅니다.
    • 어디 j에서 첫 번째 값 의 인덱스tabletable[j]==x[i]
    • nomatch,의 값을 나타내는 tableIS가 동일하지 x[i] ORx[i]목록이다 incomparables.

테스트 사례

All in the form x, table, nomatch, incomparables -> output
outputs 

[], [1,2,3], 0, [5] -> []

[1, 2, 3], [], 0, [5] -> [0, 0, 0]

[9, 4, 3, 6, 3], [9, 8, 7, 6, 5, 4, 3, 2, 1], -1, [4] -> [1, -1, 7, 4, 7]

[8, 6, 7, 5, 3, 0, 9], [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8, 4, 6, 2, 6], 1000, [1] -> [12, 8, 14, 5, 1, 1000, 6]

필요에 따라 더 많은 테스트 사례를 생성 할 수 있습니다.

추가 규칙 :

  • R에는 1 기준 지수가 있지만 일관된 대체 기준 지수는 허용됩니다. 따라서 3 또는 17에서 시작하는 색인을 사용할 수 있지만 일관성이 있어야하며 답에이를 표시해야합니다.
  • 언어를 선택한 경우 내장 언어를 사용하는 경우 자체 솔루션도 구현하십시오.
  • 설명을 부탁드립니다.

이것은 이므로 바이트 단위의 최단 솔루션이 승리합니다!


음수를 지원해야합니까? 예제 만 가정하고 표준 규칙이 있다고 확신하기 때문에 필요하지 않다고 가정합니다.
wizzwizz4

@ wizzwizz4 아니요 4는에 있기 때문에 incomparables일치시킬 수 없습니다. 귀하의 언어가 음수를 지원할 수 없다면 음수가 아닌 숫자를 요구하는 것이 좋지만 제출시 그 가정을 명시하십시오.
주세페

1
헤더 의견에 추가 : 우리는 또한하지 않습니다 make.
발은 모니카의 복원을 말한다

1
@val 그것은 실제로 지붕 위의 피들러에 대한 아주 나쁜 참조입니다 . 이 모든 도전 과제는 다양한 쇼 튠스를 테마로 제목이 붙여져 있습니다.
주세페

답변:


8

젤리 ,  10  8 바이트

Outgolfer Erik 덕분에 -2

,⁷y⁵iⱮ⁶o

incomparables nomatch table xR의 match함수 결과 목록의 젤리 표현 *을 인쇄하는 4 개의 명령 행 인수를 허용하는 전체 프로그램 .

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

방법?

예를 들어 incomparables nomatch table x= [1,4], 2, [2,4], [4,3,2,1,0]:

,⁷y⁵iⱮ⁶o - Main Link: list, incomparables; list, nomatch
 ⁷       - newline character                                '\n'
,        - pair (incompararables) with (right)              [[1,4],'\n']
   ⁵     - 5th argument (3rd input = table)                 [2,4]
  y      - translate (right) with lookup (left)             [2,'\n']             
      ⁶  - 6th argument (4th input = x)                     [4,3,2,1,0]
     Ɱ   - map with:
    i    -   first index of (right) in (left)               [0,0,1,0,0]
       o - logical OR                                       [2,2,1,2,2]

* 빈 목록은 아무것도 표시되지 않으며, 하나의 목록은 항목으로 만 표시되고 다른 목록은 다음 []과 같이 구분됩니다.,



6

아르 자형 , 55 바이트

이 경우 코드는 match전체 기능과 함께 사용되지 않고 코드 로만 사용됩니다.index . 첫 번째 R 답변, 아마도 바이트 단위로 믿을 수 없을 정도로 비효율적입니다!

참고 ( 정보에 대한 주세페 덕분에 ) : %in% 그리고 setdiff둘 다 내부적으로 구현 match되어 있으므로이 놀랍도록 유용한 기능을 완전히 제거하면 혼란 스러울 수 있습니다. 따라서 마감 기한이없는 150 회 현상금 이 있습니다! (단 setdiff, 허용됩니다)

function(x,t,n,i)ifelse(x%in%setdiff(t,i),match(x,t),n)

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

또는...

R , 5 바이트

match

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


나는 %in%과 의 사용을 피하고 있었지만 더 잘할 수 있을지 확신하지 못한다 match. 이러한 기능 중 하나 (좋은 것 같지 않은)없이 좋은 골프 답변을 찾으려면이 현상금을 드리겠습니다.
주세페

아 lol, 방금 golfR 에서 그 에 대해 언급했습니다…
Mr. Xcoder

으스스한 match제출을 위해 전적으로 찬성
18:48의

ifelse이 팁을 사용하여 단축 할 수 있습니다 . codegolf.stackexchange.com/a/97826/59530
JAD

2
또한, 더 긴 제출물은 실제로 다음을 사용합니다 match: S
JAD






4

파이썬 3 , 60 바이트

lambda x,t,n,i:[v in{*t}-{*i}and-~t.index(v)or n for v in x]

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


이것의 어떤 기능이 3.8에만 해당됩니까? 이것이 파이썬 3의 모든 서브 버전에서 작동하는 것처럼 보입니다.
Theo

글쎄, 그것은 3.8에만 국한 되지 않습니다 . 방금 TIO에서 자동 생성 된 템플릿을 복사하여 붙여 넣었으므로 3.8을 사용하는 것을 보지 못했습니다. 헤드 업 주셔서 감사합니다, 조정합니다.
Mr. Xcoder

1
R has 1-based indices, but a consistent alternative-based indices are acceptable.따라서 -~-1 바이트에 대해 0 인덱싱을 사용할 수 있습니다 .
가치 잉크

1
@ValueInk 파이썬에서는 0이 거짓이므로 세 번째 테스트 사례 (및 일반적으로 일치하는 요소가 목록의 시작 부분에있을 때)에 실패합니다.
Mr. Xcoder

1
아, 페어 쇼 또한 t.index(v)if v in{*t}-{*i}else n현재 v in{*t}-{*i}and-~t.index(v)or n솔루션 과 동일한 바이트 수를 가지고 있습니다 . haha
Value Ink



3

펄 6 , 45 바이트

->\b,\c,\d{*>>.&{$_d&&~b.first($_,:k)||c}}

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

다음과 같이 카레 입력을받는 익명 코드 블록 f(table, nomatch, incomparables)(x) 하고 일치하는 인덱스 0을 반환하는 .

설명:

->\b,\c,\d{                               }    # Anonymous code block taking 3 inputs
           *           # Return an anonymous Whatever lambda
            >>.&{                        }  # Mapping input to
                 $_d                       # If the element is not an uncomparable
                     && b.first($_,:k)      # Return the first index in the table
                       ~                    # Stringified so Nils are false
                                      ||c   # Else the nomatch element
~~

+1 나는 이것을 간단하게 $_∉d&&b.antipairs.Map{$_}||c작업했지만 잘 작동했지만 0의 잘못된 값에는 효과가있었습니다. 첫 번째 ($ _ : k)는 긴 반쌍을 피하는 훌륭한 솔루션입니다.
user0721090601

2

, 14 바이트

IEθ∨∧¬№ει⊕⌕ηιζ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 1- 색인. 설명:

  θ             First input (x)
 E              Map over elements
       ε        Fourth input (incomparables)
      №         Count occurrences of
        ι       Current element
     ¬          Is zero
    ∧           Logical And
           η    Second input (table)
          ⌕     Find 0-based index of
            ι   Current element
         ⊕      Convert to 1-indexed
   ∨            Logical Or
             ζ  Third input (nomatch)
I               Cast to string
                Implicitly print on separate lines

2

C (gcc) , 125 바이트

1- 색인.

전달 된 배열에서 센티넬 값을 사용할 수 없다는 것을 감안할 때 각 배열에 배열 경계를 제공해야합니다.

f(x,c,t,d,n,i,e,j,f)int*x,*t,*i;{for(;f=0,c-->0;x[c]=--f?n:j){for(j=e;!f&j;x[c]-i[--j]||--f);for(;!f&j<d;x[c]-t[j++]||++f);}}

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


2

첨부 , 39 바이트

${{[_,y][nil=_or x@_in z]}=>x&Index@_4}

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

매우 간단한 검증. 인수 순서는 일치 순서와 다릅니다. 구체적으로, x첫 번째가 아닌 마지막 인수이며 _4위의 스 니펫에 해당합니다 .

설명

${{[_,y][nil=_or x@_in z]}=>x&Index@_4}
${                                    }   named lambda, taking parameters x, y, z, and _4
                            x&Index@_4    short for Index[x, _4];
                                              calculates where each element in _4 occurs in x
                                              returns `nil` for no match
  {                      }=>              over each index:
   [_,y][               ]                     choose y (`nomatch`) if
         nil=_                                    the index is nil
              or x@_in z                          or the element is in `incomparables`
    _                                         otherwise, choose the index


2

05AB1E , 7 바이트

õ:Ik®I:

인덱스가 0입니다. 입력 순서는 다음과 같습니다.incomparables, table, x, nomatch ..

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

설명:

õ:       # Replace all values of the (implicit) first incomparables-list in
         # the (implicit) second table-list with an empty string
         #  i.e. incomparables=[4] and table=[9,8,7,6,5,4,3,2,1] → [9,8,7,6,5,"",3,2,1]
  Ik     # Get the index of each value in the third x-list in this list (-1 if not found)
         #  i.e. x=[9,4,3,6,3] → [0,-1,6,3,6]
    ®I:  # Replace all -1 with the fourth input-integer
         #  i.e. nomatch=-99 → [0,-99,6,3,6]
         # (and output the mapped list implicitly as result)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.