Matchmaker, Matchmaker, fammi una partita


21

(non troveremo Findo cattureremo un tryCatch, però)

Questa è la seconda parte di una serie in più parti di implementazione di alcune interessanti funzioni R. La prima parte può essere trovata qui .

L'obiettivo:

Devi implementare la matchfunzione di R nel minor numero di byte possibile.

Ingresso:

  • x, un elenco / array di numeri interi eventualmente vuoto
  • table, un elenco / array di numeri interi eventualmente vuoto
  • nomatch, un singolo valore intero
  • incomparables, un elenco / array di numeri interi eventualmente vuoto

Produzione:

  • un singolo array / elenco di numeri interi Odi uguale lunghezza a x, in cui ciascun valore O[i]rappresenta:
    • L'indice jdel primo valore in tablewheretable[j]==x[i]
    • nomatch, Indicando che nessun valore tableè uguale a x[i] OR che x[i]è nella lista dei incomparables.

Casi 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]

Altri casi di test possono essere generati secondo necessità.

Regole aggiuntive:

  • R ha indici basati su 1, ma sono accettabili indici coerenti basati su alternative. Quindi puoi usare indici che iniziano con 3 o 17 o qualsiasi altra cosa, ma questo deve essere coerente e devi indicarlo nella tua risposta.
  • Se la lingua scelta ha un builtin che lo fa, si prega di implementare anche la propria soluzione.
  • Le spiegazioni sono apprezzate.

Questo è , quindi vince la soluzione più breve in byte!


Deve supportare numeri negativi? Presumo che non sia necessario, poiché solo l'esempio lo assume e sono abbastanza sicuro che ci sia una regola standard per questo.
wizzwizz4,

@ wizzwizz4 no, perché 4è dentro incomparables, quindi non può essere abbinato. Se la tua lingua non è in grado di supportare numeri negativi, allora è necessario richiedere numeri non negativi, ma dichiaralo nella tua richiesta.
Giuseppe,

1
Aggiunta al commento dell'intestazione: anche noi non lo faremo make.
dice Val Reinstate Monica il

1
@val è in realtà un brutto riferimento a Fiddler on the Roof ; tutte queste sfide hanno preso il titolo da vari showtunes perché questo si adattava così perfettamente che ho pensato che sarebbe stato un buon tema.
Giuseppe,

Risposte:


8

Gelatina ,  10  8 byte

-2 grazie a Erik the Outgolfer

,⁷y⁵iⱮ⁶o

Un programma completo che accetta quattro argomenti della riga di comando, incomparables nomatch table xche stampa una rappresentazione Jelly * dell'elenco dei matchrisultati della funzione di R.

Provalo online!

Come?

ad es. 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]

* Un elenco vuoto è rappresentato come nulla, un elenco dell'ultimo è rappresentato come solo l'elemento, mentre altri elenchi sono racchiusi []e delimitati da,



6

R , 55 byte

In questo caso, il codice non viene utilizzato matchcon la sua piena funzionalità, viene utilizzato solo come indexfunzione. Prima risposta R, quindi probabilmente incredibilmente inefficiente in termini di byte!

Nota (grazie a Giuseppe per le informazioni) : %in% e setdiffsono anche entrambi implementati internamente utilizzando match, quindi liberarsi completamente di questa funzione sorprendentemente utile comporterà un disastro . Pertanto, c'è una generosità di 150 ripetizioni senza scadenza per questo! (nota che setdiffè permesso, però)

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

Provalo online!

o...

R , 5 byte

match

Provalo online!


Non sono sicuro di poter fare di meglio anche se stavo evitando l'uso di %in%e match; se vuoi trovare una buona risposta da golf senza nessuna di queste funzioni (probabilmente essere orribile), lo ricompenserò.
Giuseppe

Ah, lol, ho appena commentato nel golfR a riguardo ...
Mr. Xcoder, il

Votato esclusivamente per la match
subdola

Puoi abbreviare ifelseusando questo suggerimento: codegolf.stackexchange.com/a/97826/59530
JAD

2
inoltre, il tuo invio più lungo utilizza effettivamente match: S
JAD




5

R , 79 byte

function(x,t,n,i)sapply(x,function(y)`if`(any(z<-y==t)&all(y-i),which(z)[1],n))

Provalo online!

R , 66 byte

function(x,t,n,i)sapply(x,function(y)c(which(y==t&all(y-i)),n)[1])

Combinando la mia soluzione con parti della soluzione di Nick .

Provalo online!



4

Python 3 , 60 byte

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

Provalo online!


Quali caratteristiche sono specifiche di 3.8? Mi sembra che questo potrebbe funzionare per qualsiasi sovversione di Python 3.
Theo

Beh, è non è specifico per 3,8. Ho appena copiato e incollato il modello generato automaticamente su TIO, quindi non ho notato che ho usato 3.8. Grazie per l'heads-up, si adatterà.
Mr. Xcoder,

1
R has 1-based indices, but a consistent alternative-based indices are acceptable.Quindi puoi eliminare -~e usare solo l'indicizzazione 0 per -1 byte.
Valore inchiostro

1
@ValueInk Che fallisce per il terzo caso di test (e in generale quando un elemento corrispondente è all'inizio di un elenco), poiché 0 è errato in Python.
Mr. Xcoder,

1
Ah, fiera. Per inciso, t.index(v)if v in{*t}-{*i}else nha lo stesso numero di addetti della tua attuale v in{*t}-{*i}and-~t.index(v)or nsoluzione, haha
Value Ink



3

Perl 6 , 45 byte

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

Provalo online!

Blocco di codice anonimo che accetta input al curry, come f(table, nomatch, incomparables)(x)e restituisce le corrispondenze 0 indicizzate.

Spiegazione:

->\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 Ci ho lavorato brevemente ma stavo facendo ciò $_∉d&&b.antipairs.Map{$_}||cche avrebbe funzionato bene ma per il valore di falso di 0. Il primo ($ _: k) è un'ottima soluzione che evita i lunghi antipair. Coercizione della mappa.
user0721090601

2

Carbone , 14 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. 1-indicizzati. Spiegazione:

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

1-indicizzati.

Dato che non posso usare un valore sentinella negli array passati, devo fornire i limiti dell'array per ciascun array.

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

Provalo online!


2

Attache , 39 byte

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

Provalo online!

Verifica abbastanza semplice. Si noti che l'ordine degli argomenti differisce da quello della corrispondenza; in particolare, xè l'ultimo argomento anziché il primo e corrisponde al _4frammento di cui sopra.

Spiegazione

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

õ:Ik®I:

0-indicizzati. Gli ingressi sono nell'ordine: incomparables, table, x, nomatch.

Provalo online.

Spiegazione:

õ:       # 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.