Matchmaker, Matchmaker, spraw, żebym pasował

21

(nie będzie znalezienie Findlub łowienie tryCatch, choć)

To druga część wieloczęściowej serii implementacji interesujących funkcji R. Część pierwszą można znaleźć tutaj .

Zadanie:

Masz zaimplementować funkcję Rmatch w jak najmniejszej liczbie bajtów.

Wkład:

  • x, prawdopodobnie pusta lista / tablica liczb całkowitych
  • table, prawdopodobnie pusta lista / tablica liczb całkowitych
  • nomatch, jedna wartość całkowita
  • incomparables, prawdopodobnie pusta lista / tablica liczb całkowitych

Wydajność:

  • pojedyncza tablica / lista liczb całkowitych Oo równej długości x, gdzie każda wartość O[i]reprezentuje:
    • Indeks jz pierwszej wartości w tablektórymtable[j]==x[i]
    • nomatch, wskazując, że żadna wartość w nie tablejest równa x[i] OR, która x[i]znajduje się na liście incomparables.

Przypadki testowe

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]

W razie potrzeby można wygenerować więcej przypadków testowych.

Dodatkowe zasady:

  • R ma wskaźniki oparte na 1, ale spójne wskaźniki alternatywne są dopuszczalne. Możesz więc użyć wskaźników, które zaczynają się od 3 lub 17, czy cokolwiek innego, ale musi to być spójne i musisz to wskazać w swojej odpowiedzi.
  • Jeśli wybrałeś język, który to robi, zaimplementuj również własne rozwiązanie.
  • Wyjaśnienia są mile widziane.

To jest , więc wygrywa najkrótsze rozwiązanie w bajtach!

Giuseppe
źródło
Czy musi obsługiwać liczby ujemne? Zakładam, że nie jest to konieczne, ponieważ zakłada to tylko przykład i jestem pewien, że istnieje standardowa reguła.
wizzwizz4
@ wizzwizz4 nie, ponieważ 4jest włączony incomparables, więc nie można go dopasować. Jeśli Twój język nie obsługuje liczb ujemnych, możesz wymagać liczb nieujemnych, ale podaj to założenie w swoim zgłoszeniu.
Giuseppe
1
Dodanie do komentarza w nagłówku: my również nie będziemy tworzyć make.
val mówi Przywróć Monikę
1
@val to właściwie złe odniesienie do Fiddler on the Roof ; wszystkie te wyzwania zostały nazwane tematycznie po różnych pokazach, ponieważ ten pasuje idealnie, więc pomyślałem, że będzie dobrym tematem.
Giuseppe

Odpowiedzi:

8

Galaretka ,  10  8 bajtów

-2 dzięki Erikowi Outgolfer

,⁷y⁵iⱮ⁶o

Pełny program akceptujący cztery argumenty wiersza poleceń, incomparables nomatch table xktóry wypisuje galaretkową reprezentację * listy matchwyników funkcji R.

Wypróbuj online!

W jaki sposób?

np. z 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]

* Pusta lista jest reprezentowana jako nic, lista dziesiąta jest reprezentowana tylko jako element, podczas gdy inne listy są zawarte []i ograniczone przez,

Jonathan Allan
źródło
8

R , 83 bajty

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

Wypróbuj online!

Unika match, %in%i setdiff.

Nick Kennedy
źródło
3
66 bajtów
JAD
6

R , 55 bajtów

W tym przypadku kod nie wykorzystuje matchswojej pełnej funkcjonalności, jest po prostu używany jako indexfunkcja. Pierwsza odpowiedź R, więc prawdopodobnie niesamowicie nieefektywna bajtowo!

Uwaga (podziękowania dla Giuseppe za informację) : %in% i setdiffsą one również wewnętrznie zaimplementowane za pomocą match, więc całkowite pozbycie się tej zaskakująco przydatnej funkcji spowoduje bałagan . Dlatego istnieje 150 powtórzeń nagród bez terminu! (uwaga, że setdiffjest to dozwolone)

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

Wypróbuj online!

lub...

R , 5 bajtów

match

Wypróbuj online!

Pan Xcoder
źródło
Nie jestem pewien, czy dałbym sobie radę lepiej, chociaż unikałem używania %in%i match; jeśli chcesz znaleźć dobrą odpowiedź golfową bez żadnej z tych funkcji (prawdopodobnie okropnych), naliczę to.
Giuseppe,
Ach lol, właśnie skomentowałem na ten temat w golfR ...
Pan Xcoder,
Głosowano wyłącznie za snarky matchpoddanie
Punintended
Możesz skrócić, ifelsekorzystając z tej wskazówki: codegolf.stackexchange.com/a/97826/59530
JAD
2
ponadto dłuższe przesyłanie faktycznie używa match: S
JAD
6

Galaretka , 9 8 bajtów

ṣK¥ƒiⱮo⁶

Wypróbuj online!

Pełen program, który przyjmuje trzy argumenty: [[table], incomparables], x, nomatchw tej kolejności.

Nick Kennedy
źródło
5

Rubinowy , 44 bajty

Zero indeksowane.

->x,t,n,i{x.map{|e|i-[e]==i&&t.index(e)||n}}

Wypróbuj online!

Wartość tuszu
źródło
5

R , 79 bajtów

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

Wypróbuj online!

R , 66 bajtów

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

Łączę moje rozwiązanie z częściami rozwiązania Nicka .

Wypróbuj online!

JAD
źródło
4

Japt , 14 bajtów

Ë!XøD ©ÒVbD ªW

Spróbuj

Kudłaty
źródło
4

Python 3 , 60 bajtów

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

Wypróbuj online!

Pan Xcoder
źródło
Jakie cechy tego są specyficzne dla 3.8? Wygląda na to, że może to działać w przypadku dowolnej subwersji Pythona 3.
Theo
Cóż, nie jest to specyficzne dla 3.8. Właśnie skopiowałem wklejony automatycznie wygenerowany szablon na TIO, więc nie zauważyłem, że użyłem 3.8. Dzięki za heads-up dostosuje się.
Pan Xcoder,
1
R has 1-based indices, but a consistent alternative-based indices are acceptable.Możesz więc wyjąć -~i użyć indeksowania 0 dla -1 bajtów.
Wartość tuszu
1
@ValueInk To się nie udaje w 3. przypadku testowym (i ogólnie, gdy pasujący element znajduje się na początku listy), ponieważ 0 w Pythonie jest fałszem.
Pan Xcoder,
1
Ach, targi. Nawiasem mówiąc, t.index(v)if v in{*t}-{*i}else nma dokładnie taką samą liczbę bajtów, jak obecne v in{*t}-{*i}and-~t.index(v)or nrozwiązanie, haha
Value Ink
4

PowerShell , 63 bajty

param($x,$t,$n,$o)$x|%{($n,$t.indexof($_))[$_-in$t*!($_-in$o)]}

Wypróbuj online!

0-indeksowane

Veskah
źródło
3

Perl 6 , 45 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera dane wejściowe curry, lubi f(table, nomatch, incomparables)(x)i zwraca dopasowania 0 indeksowane.

Wyjaśnienie:

->\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
źródło
+1 Pracowałem nad tym krótko, ale robiłem to, $_∉d&&b.antipairs.Map{$_}||cco działałoby dobrze, gdyby nie wartość falsey równa 0. Pierwsze ($ _: k) to świetne rozwiązanie, które pozwala uniknąć długiego przymusu antyparowego. Mapa.
user0721090601
2

Węgiel drzewny , 14 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. 1-indeksowany. Wyjaśnienie:

  θ             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
źródło
2

C (gcc) , 125 bajtów

1-indeksowany.

Biorąc pod uwagę, że nie mogę użyć wartości wartownika w przekazywanych tablicach, muszę podać granice dla każdej tablicy.

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

Wypróbuj online!

ErikF
źródło
2

Attache , 39 bajtów

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

Wypróbuj online!

Dość prosta weryfikacja. Zauważ, że kolejność argumentów różni się od kolejności dopasowania; w szczególności xjest ostatnim argumentem, a nie pierwszym, i odpowiada _4powyższemu fragmentowi.

Wyjaśnienie

${{[_,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
źródło
2

Haskell, 57 56 bajtów

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

Kolejność argumentem jest: table, nomatch, incomparables, x.

Wypróbuj online!

nimi
źródło
2

05AB1E , 7 bajtów

õ:Ik®I:

0-indeksowane. Dane wejściowe są w kolejności:incomparables, table, x, nomatch .

Wypróbuj online.

Wyjaśnienie:

õ:       # 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
źródło