Matchmaker, Matchmaker, hazme un partido

21

( aunque no encontraremos Findni atraparemos un tryCatch)

Esta es la segunda parte de una serie de varias partes de implementación de algunas funciones interesantes de R. La primera parte se puede encontrar aquí .

La tarea:

Debe implementar la matchfunción de R en el menor número de bytes posible.

Entrada:

  • x, una lista / matriz posiblemente entera de enteros
  • table, una lista / matriz posiblemente entera de enteros
  • nomatch, un solo valor entero
  • incomparables, una lista / matriz posiblemente entera de enteros

Salida:

  • una sola matriz / lista de enteros Ode igual longitud x, donde cada valor O[i]representa:
    • El índice jdel primer valor en tabledondetable[j]==x[i]
    • nomatch, lo que indica que ningún valor en tablees igual a x[i] OR que x[i]está en la lista de incomparables.

Casos de prueba

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]

Se pueden generar más casos de prueba según sea necesario.

Reglas adicionales:

  • R tiene índices basados ​​en 1, pero son aceptables índices consistentes basados ​​en alternativas. Por lo tanto, puede usar índices que comienzan en 3 o 17 o lo que sea, pero esto debe ser consistente y debe indicarlo en su respuesta.
  • Si eligió el idioma tiene una función integrada que hace esto, también implemente su propia solución.
  • Las explicaciones son apreciadas.

Este es el , por lo que la solución más corta en bytes gana.

Giuseppe
fuente
¿Debe admitir números negativos? Asumiré que no es necesario, ya que solo el ejemplo lo asume y estoy bastante seguro de que hay una regla estándar para ello.
wizzwizz4
@ wizzwizz4 no, porque 4está dentro incomparables, por lo que no se puede igualar. Si su idioma no puede admitir números negativos, entonces está bien requerir números no negativos, pero indique esa suposición en su envío.
Giuseppe
1
Adición al comentario del encabezado: tampoco lo haremos make.
Val dice reinstalar a Mónica el
1
@val en realidad es una muy mala referencia a Fiddler on the Roof ; Todos estos desafíos se han titulado temáticos después de varias melodías porque encajaba tan perfectamente que pensé que sería un buen tema.
Giuseppe

Respuestas:

8

Jalea ,  10  8 bytes

-2 gracias a Erik the Outgolfer

,⁷y⁵iⱮ⁶o

Un programa completo que acepta cuatro argumentos de línea de comando, incomparables nomatch table xque imprime una representación Jelly * de la lista de matchresultados de la función de R.

Pruébalo en línea!

¿Cómo?

por ejemplo, con 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]

* Una lista vacía se representa como nada, una lista de lenth one se representa solo como el elemento, mientras que otras listas están encerradas []y delimitadas por,

Jonathan Allan
fuente
8

R , 83 bytes

function(x,t,n,i)sapply(x,function(a)c(which(a==t/!rowSums(outer(t,i,`==`))),n)[1])

Pruébalo en línea!

Evita match, %in%y setdiff.

Nick Kennedy
fuente
3
66 bytes
JAD
6

R , 55 bytes

En este caso, el código no se usa matchcon toda su funcionalidad, solo se usa como una indexfunción. Primera respuesta R, ¡así que probablemente sea increíblemente ineficiente en bytes!

Nota (gracias a Giuseppe por la información) : %in% y setdifftambién se implementan internamente usando match, por lo que deshacerse por completo de esta función sorprendentemente útil resultará en un desastre . ¡Por lo tanto, hay una recompensa de 150 repeticiones sin fecha límite para esto! (tenga en cuenta que setdiffestá permitido, sin embargo)

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

Pruébalo en línea!

o...

R , 5 bytes

match

Pruébalo en línea!

Sr. Xcoder
fuente
No estoy seguro de poder hacerlo mejor, aunque estaba evitando el uso de %in%y match; Si desea encontrar una buena respuesta de golf sin ninguna de esas funciones (probablemente sea horrible), se lo recompensaré.
Giuseppe
Ah lol, acabo de comentar en golfR sobre eso ...
Sr. Xcoder
Votado únicamente por la matchsumisión sarcástica
castigado el
Puede acortar ifelseusando este consejo: codegolf.stackexchange.com/a/97826/59530
JAD
2
Además, su presentación más larga en realidad usa match: S
JAD
6

Jalea , 9 8 bytes

ṣK¥ƒiⱮo⁶

Pruébalo en línea!

Un programa completo que toma tres argumentos: [[table], incomparables], x, nomatchen ese orden.

Nick Kennedy
fuente
4

Python 3 , 60 bytes

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

Pruébalo en línea!

Sr. Xcoder
fuente
¿Qué características de esto son específicas de 3.8? Me parece que esto podría funcionar para cualquier subversión de Python 3.
Theo
Bueno, es no específica a 3,8. Acabo de copiar y pegar la plantilla autogenerada en TIO, así que no me di cuenta de que usaba 3.8. Gracias por el heads-up, se ajustará.
Sr. Xcoder
1
R has 1-based indices, but a consistent alternative-based indices are acceptable.Por lo tanto, puede sacar -~y simplemente usar 0-indexing para -1 bytes.
Value Ink
1
@ValueInk Eso falla para el tercer caso de prueba (y en general cuando un elemento coincidente está al comienzo de una lista), ya que 0 es falso en Python.
Sr. Xcoder
1
Ah, espectáculo justo. Por cierto, t.index(v)if v in{*t}-{*i}else ntiene exactamente el mismo bytecount que su v in{*t}-{*i}and-~t.index(v)or nsolución actual , jaja
Value Ink
3

Perl 6 , 45 bytes

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

Pruébalo en línea!

Bloque de código anónimo que toma la entrada curry, como f(table, nomatch, incomparables)(x)y devuelve las coincidencias 0 indexadas.

Explicación:

->\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
~~
Jo King
fuente
+1 Trabajé en esto brevemente, pero estaba haciendo $_∉d&&b.antipairs.Map{$_}||clo que hubiera funcionado bien, pero por el valor falso de 0. El primero ($ _: k) es una gran solución que evita los largos pares de pares. Coacción de mapas.
user0721090601
2

Carbón , 14 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. 1 indexado. Explicación:

  θ             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
Neil
fuente
2

C (gcc) , 125 bytes

1 indexado.

Dado que no puedo usar un valor centinela en las matrices pasadas, necesito dar los límites de la matriz para cada matriz.

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);}}

Pruébalo en línea!

ErikF
fuente
2

Adjunto , 39 bytes

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

Pruébalo en línea!

Verificación bastante simple. Tenga en cuenta que el orden del argumento difiere del del partido; específicamente, xes el último argumento en lugar del primero, y corresponde al _4fragmento anterior.

Explicación

${{[_,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
Conor O'Brien
fuente
2

Haskell, 57 56 bytes

(t#n)i=map$maybe n id.($zip i[n,n..]++zip t[1..]).lookup

Orden de los argumentos es: table, nomatch, incomparables, x.

Pruébalo en línea!

nimi
fuente
2

05AB1E , 7 bytes

õ:Ik®I:

0 indexado. Las entradas están en el orden: incomparables, table, x, nomatch.

Pruébalo en línea.

Explicación:

õ:       # 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)
Kevin Cruijssen
fuente