Matchmaker, Matchmaker, faça-me uma partida


21

(não encontraremos Findnem capturamos um tryCatch)

Esta é a parte dois de uma série de várias partes da implementação de algumas funções R interessantes. A primeira parte pode ser encontrada aqui .

A tarefa:

Você deve implementar a matchfunção de R no menor número possível de bytes.

Entrada:

  • x, uma lista / matriz possivelmente vazia de números inteiros
  • table, uma lista / matriz possivelmente vazia de números inteiros
  • nomatch, um único valor inteiro
  • incomparables, uma lista / matriz possivelmente vazia de números inteiros

Saída:

  • uma única matriz / lista de números inteiros Ode comprimento igual a x, em que cada valor O[i]representa:
    • O índice jdo primeiro valor em tablequetable[j]==x[i]
    • nomatch, indicando que nenhum valor em tableé igual a x[i] OR que x[i]está na lista de incomparables.

Casos de teste

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]

Mais casos de teste podem ser gerados conforme necessário.

Regras adicionais:

  • R possui índices baseados em 1, mas índices consistentes baseados em alternativas são aceitáveis. Portanto, você pode usar índices que começam em 3 ou 17 ou qualquer outra coisa, mas isso deve ser consistente e deve ser indicado na sua resposta.
  • Se você escolheu um idioma que tenha isso embutido, implemente também sua própria solução.
  • As explicações são apreciadas.

Isso é , então a solução mais curta em bytes vence!


Ele deve suportar números negativos? Suponho que não seja necessário, pois apenas o exemplo assume e tenho certeza de que há uma regra padrão para isso.
wizzwizz4 11/07

@ wizzwizz4 não, porque 4está dentro incomparables, portanto não pode ser correspondido. Se o seu idioma não suportar números negativos, não há problema em exigir números não negativos, mas indique essa suposição no seu envio.
Giuseppe

1
Além do comentário do cabeçalho: também não faremos make.
val diz Reinstate Monica

1
@val é na verdade uma péssima referência ao violinista no telhado ; todos esses desafios têm o tema de várias séries, porque este se encaixa tão perfeitamente que eu pensei que seria um bom tema.
Giuseppe

Respostas:


8

Geléia ,  10  8 bytes

-2 graças a Erik, o Outgolfer

,⁷y⁵iⱮ⁶o

Um programa completo que aceita quatro argumentos de linha de comando, incomparables nomatch table xque imprime uma representação Jelly * da lista de matchresultados da função de R.

Experimente online!

Quão?

por exemplo, com 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]

* Uma lista vazia é representada como nada, uma lista da décima primeira é representada apenas como o item, enquanto outras listas são incluídas []e delimitadas por,



6

R , 55 bytes

Nesse caso, o código não é usado matchcom todas as suas funcionalidades, é usado apenas como uma indexfunção. Primeira resposta R, provavelmente incrivelmente ineficiente em bytes!

Nota (obrigado a Giuseppe pela informação) : %in% e setdifftambém são implementados internamente usando match, portanto, livrar-se completamente dessa função surpreendentemente útil resultará em uma confusão . Portanto, há uma recompensa de 150 representantes sem prazo para isso! (observe que setdiffé permitido)

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

Experimente online!

ou...

R , 5 bytes

match

Experimente online!


Não tenho certeza de que poderia fazer melhor, embora estivesse evitando o uso de %in%e match; se você quiser encontrar uma boa resposta para o golfe sem nenhuma dessas funções (provavelmente horrível), eu recompensarei isso.
Giuseppe

Ah, lol, acabei de comentar no golfR sobre isso ...
Sr. Xcoder

Voto a favor unicamente para a matchsubmissão sarcástica
Punintended

Você pode reduzir ifelseusando esta dica: codegolf.stackexchange.com/a/97826/59530
JAD

2
além disso, seu envio mais longo realmente usa match: S
JAD






4

Python 3 , 60 bytes

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

Experimente online!


Quais recursos são específicos para 3.8? Parece-me que isso poderia funcionar para qualquer subversão do Python 3.
Theo

Bem, é não específico para 3,8. Acabei de copiar e colar o modelo gerado automaticamente no TIO, então não percebi que usei o 3.8. Obrigado pelo alerta, irá ajustar.
Sr. Xcoder 10/07

1
R has 1-based indices, but a consistent alternative-based indices are acceptable.Então você pode remover o -~e apenas usar a indexação 0 para -1 bytes.
Value Ink

1
@ValueInk Isso falha no terceiro caso de teste (e geralmente quando um elemento correspondente está no início de uma lista), pois 0 é falso no Python.
Sr. Xcoder 10/07

1
Ah, feira justa. Aliás, t.index(v)if v in{*t}-{*i}else ntem exatamente o mesmo bytecount da sua v in{*t}-{*i}and-~t.index(v)or nsolução atual , haha
Value Ink



3

Perl 6 , 45 bytes

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

Experimente online!

Bloco de código anônimo que recebe a entrada com curry, gosta f(table, nomatch, incomparables)(x)e retorna as correspondências 0 indexadas.

Explicação:

->\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 Eu trabalhei nisso brevemente, mas estava fazendo o $_∉d&&b.antipairs.Map{$_}||cque teria funcionado bem, mas pelo valor de falsey de 0. O primeiro ($ _: k) é uma ótima solução que evita os antipaires longos. Coerção do mapa.
user0721090601 16/07

2

Carvão , 14 bytes

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

Experimente online! Link é a versão detalhada do código. 1 indexado. Explicação:

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

1 indexado.

Como não posso usar um valor de sentinela nas matrizes passadas, preciso fornecer os limites da 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);}}

Experimente online!


2

Anexo , 39 bytes

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

Experimente online!

Verificação bastante simples. Observe que a ordem dos argumentos difere da ordem de correspondência; especificamente, xé o último argumento e não o primeiro e corresponde ao _4snippet acima.

Explicação

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

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

Fim argumento é: table, nomatch, incomparables, x.

Experimente online!


2

05AB1E , 7 bytes

õ:Ik®I:

Indexado a 0. As entradas são na ordem: incomparables, table, x, nomatch.

Experimente online.

Explicação:

õ:       # 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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.