Matchmaker, Matchmaker, fais-moi un match


21

(nous ne trouverons Findni n'attraperons untryCatch , cependant)

Il s'agit de la deuxième partie d'une série en plusieurs parties d'implémentation de fonctions R intéressantes. La première partie peut être trouvée ici .

La tâche:

Vous devez implémenter la matchfonction de R dans le moins d'octets possible.

Contribution:

  • x, une liste / tableau d'entiers éventuellement vide
  • table, une liste / tableau d'entiers éventuellement vide
  • nomatch, une valeur entière unique
  • incomparables, une liste / tableau d'entiers éventuellement vide

Sortie:

  • un seul tableau / liste d'entiers Ode longueur égale à x, où chaque valeurO[i] représente soit:
    • L'index jde la première valeur tabletable[j]==x[i]
    • nomatch, indiquant qu'aucune valeur dans tablen'est égale à x[i] OU qui x[i]est dans la liste de incomparables.

Cas de test

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]

Plus de cas de test peuvent être générés selon les besoins.

Règles supplémentaires:

  • R a des indices basés sur 1, mais des indices basés sur une alternative cohérente sont acceptables. Vous pouvez donc utiliser des indices qui commencent à 3 ou 17 ou autre chose, mais cela doit être cohérent, et vous devez l'indiquer dans votre réponse.
  • Si vous avez choisi la langue avec une fonction intégrée qui le fait, veuillez également implémenter votre propre solution.
  • Les explications sont appréciées.

Il s'agit de , donc la solution la plus courte en octets gagne!


Doit-il prendre en charge les nombres négatifs? Je suppose que ce n'est pas nécessaire, car seul l'exemple le suppose et je suis sûr qu'il existe une règle standard pour cela.
wizzwizz4

@ wizzwizz4 non, car il 4est activé, incomparablesil ne peut donc pas être mis en correspondance. Si votre langue ne peut pas prendre en charge les nombres négatifs, il est bon d'exiger des nombres non négatifs, mais énoncez cette hypothèse dans votre soumission.
Giuseppe

1
Ajout au commentaire d'en-tête: nous ne ferons pas non plus make.
val dit Réintégrer Monica

1
@val c'est en fait une assez mauvaise référence à Fiddler on the Roof ; tous ces défis ont été intitulés après diverses émissions parce que celui-ci correspondait si parfaitement que je pensais qu'il ferait un bon thème.
Giuseppe

Réponses:


8

Gelée ,  10  8 octets

-2 merci à Erik l'Outgolfer

,⁷y⁵iⱮ⁶o

Un programme complet acceptant quatre arguments de ligne de commande, incomparables nomatch table xqui imprime une représentation Jelly * de la liste des matchrésultats de la fonction de R.

Essayez-le en ligne!

Comment?

par exemple avec 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]

* Une liste vide est représentée comme rien, une liste de lenth est représentée comme juste l'élément, tandis que d'autres listes sont enfermées []et délimitées par,



6

R , 55 octets

Dans ce cas, le code n'utilise pas matchavec toutes ses fonctionnalités, il est juste utilisé comme une indexfonction. Première réponse R, donc probablement incroyablement inefficace au niveau des octets!

Remarque (merci à Giuseppe pour l'info) : %in% et setdiffsont également implémentés en internematch , donc se débarrasser complètement de cette fonction étonnamment utile entraînera un gâchis . Par conséquent, il y a une prime de 150 représentants sans date limite pour cela! (notez que setdiffc'est autorisé, cependant)

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

Essayez-le en ligne!

ou...

R , 5 octets

match

Essayez-le en ligne!


Je ne suis pas sûr de pouvoir faire mieux même si j'évitais l'utilisation de %in%et match; si vous voulez trouver une bonne réponse golfique sans aucune de ces fonctions (susceptible d'être horrible), je vous en prie.
Giuseppe

Ah lol, je viens de commenter dans golfR à ce sujet ...
M. Xcoder

A voté uniquement pour la matchsoumission
sournoise

Vous pouvez raccourcir en ifelseutilisant cette astuce: codegolf.stackexchange.com/a/97826/59530
JAD

2
aussi, votre soumission plus longue utilise en fait match: S
JAD






4

Python 3 , 60 octets

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

Essayez-le en ligne!


Quelles sont les fonctionnalités spécifiques à 3.8? Il me semble que cela pourrait fonctionner pour n'importe quelle subversion de Python 3.
Theo

Eh bien, ce n'est pas spécifique à 3.8. Je viens de copier-coller le modèle généré automatiquement sur TIO, donc je n'ai pas remarqué que j'utilisais 3.8. Merci pour l'avertissement, va s'ajuster.
M. Xcoder

1
R has 1-based indices, but a consistent alternative-based indices are acceptable.Vous pouvez donc retirer le -~et utiliser simplement l'indexation 0 pour -1 octets.
Value Ink

1
@ValueInk Cela échoue pour le 3e cas de test (et en général quand un élément correspondant est au début d'une liste), car 0 est faux en Python.
M. Xcoder

1
Ah, juste spectacle. t.index(v)if v in{*t}-{*i}else nSoit dit en passant , a exactement le même bytecount que votre v in{*t}-{*i}and-~t.index(v)or nsolution actuelle , haha
Value Ink



3

Perl 6 , 45 octets

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

Essayez-le en ligne!

Bloc de code anonyme qui prend les entrées au curry, comme f(table, nomatch, incomparables)(x) et renvoie les correspondances indexées à 0.

Explication:

->\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 J'ai travaillé brièvement sur ce point, mais je le faisais, $_∉d&&b.antipairs.Map{$_}||cce qui aurait bien fonctionné sans la valeur de falsey de 0. La première ($ _: k) est une excellente solution qui évite les longues antipairs.
user0721090601

2

Fusain , 14 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. 1 indexé. Explication:

  θ             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 octets

1 indexé.

Étant donné que je ne peux pas utiliser de valeur sentinelle dans les tableaux passés, je dois donner les limites du tableau pour chaque tableau.

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

Essayez-le en ligne!


2

Attaché , 39 octets

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

Essayez-le en ligne!

Vérification assez simple. Notez que l'ordre des arguments diffère de celui de la correspondance; en particulier, xest le dernier argument plutôt que le premier, et correspond à _4l'extrait ci-dessus.

Explication

${{[_,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

Haskell, 57 56 octets

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

Ordre argument est: table, nomatch, incomparables, x.

Essayez-le en ligne!


2

05AB1E , 7 octets

õ:Ik®I:

0 indexé. Les entrées sont dans l'ordre:incomparables, table, x, nomatch .

Essayez-le en ligne.

Explication:

õ:       # 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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.