Matchmaker, Matchmaker, mach mich zum Match

21

(Wir werden jedoch keine finden Findoder fangen tryCatch)

Dies ist Teil zwei einer mehrteiligen Serie zur Implementierung einiger interessanter R-Funktionen. Teil eins finden Sie hier .

Die Aufgabe:

Sie müssen die matchFunktion von R in so wenigen Bytes wie möglich implementieren .

Eingang:

  • x, eine möglicherweise leere Liste / Array von ganzen Zahlen
  • table, eine möglicherweise leere Liste / Array von ganzen Zahlen
  • nomatchein einzelner ganzzahliger Wert
  • incomparables, eine möglicherweise leere Liste / Array von ganzen Zahlen

Ausgabe:

  • Ein einzelnes Array / eine Liste von ganzen Zahlen mit Oder gleichen Länge wie x, wobei jeder Wert O[i]entweder darstellt:
    • Der Index jdes ersten Wertes in tablewheretable[j]==x[i]
    • nomatchAnzeigt, dass kein Wert in tablegleich x[i] OR , daß x[i]in der Liste der incomparables.

Testfälle

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]

Weitere Testfälle können nach Bedarf generiert werden.

Zusätzliche Regeln:

  • R hat Indizes auf der Basis von 1, aber konsistente Indizes auf der Basis von Alternativen sind akzeptabel. Sie können also Indizes verwenden, die bei 3 oder 17 oder was auch immer beginnen, dies muss jedoch konsistent sein, und Sie müssen dies in Ihrer Antwort angeben.
  • Wenn Sie eine Sprache ausgewählt haben, die dies unterstützt, implementieren Sie bitte auch Ihre eigene Lösung.
  • Erklärungen sind willkommen.

Das ist , also gewinnt die kürzeste Lösung in Bytes!

Giuseppe
quelle
Muss es negative Zahlen unterstützen? Ich gehe davon aus, dass dies nicht erforderlich ist, da nur das Beispiel davon ausgeht und ich mir ziemlich sicher bin, dass es eine Standardregel dafür gibt.
wizzwizz4
@ wizzwizz4 nein, weil 4ist in incomparables, so kann es nicht zugeordnet werden. Wenn Ihre Sprache keine negativen Zahlen unterstützt, ist es in Ordnung, nicht negative Zahlen zu fordern, aber geben Sie diese Annahme in Ihrer Einreichung an.
Giuseppe
1
Hinzufügung zum Header-Kommentar: Wir werden das auch nicht machen make.
Val sagt Reinstate Monica
1
@val es ist eigentlich ein ziemlich schlechter Hinweis auf Fiddler on the Roof ; alle diese herausforderungen haben nach verschiedenen showtunes thematisiert, weil dieses so perfekt passt, dass ich dachte, es wäre ein gutes thema.
Giuseppe

Antworten:

8

Jelly ,  10  8 Bytes

-2 danke an Erik den Outgolfer

,⁷y⁵iⱮ⁶o

Ein vollständiges Programm, das vier Befehlszeilenargumente akzeptiert und incomparables nomatch table xeine Jelly-Darstellung * der Liste der matchFunktionsergebnisse von R ausgibt.

Probieren Sie es online!

Wie?

zB mit 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]

* Eine leere Liste wird als nichts dargestellt, eine Liste mit der Nummer zehn wird nur als Element dargestellt, während andere Listen von eingeschlossen []und begrenzt werden,

Jonathan Allan
quelle
8

R 83 Bytes

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

Probieren Sie es online!

Vermeidet match, %in%und setdiff.

Nick Kennedy
quelle
3
66 Bytes
JAD
6

R , 55 Bytes

In diesem Fall wird der Code nicht in matchvollem Umfang verwendet, sondern nur als indexFunktion. Erste Antwort von R, also wahrscheinlich unglaublich ineffizient!

Beachten Sie (danke an Giuseppe für die Info) : %in% und setdiffsind auch beide intern mit implementiert match, so dass die vollständige Beseitigung dieser überraschend nützlichen Funktion zu einem Durcheinander führt . Daher gibt es eine Prämie von 150 Wiederholungen ohne Frist dafür! (Beachten Sie jedoch, dass dies setdifferlaubt ist.)

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

Probieren Sie es online!

oder...

R , 5 Bytes

match

Probieren Sie es online!

Mr. Xcoder
quelle
Ich bin mir nicht sicher, ob ich es besser machen könnte, obwohl ich die Verwendung von %in%und vermieden habe match. Wenn Sie eine gute golferische Antwort ohne eine dieser Funktionen finden möchten (wahrscheinlich schrecklich), werde ich dies belohnen.
Giuseppe
Ah lol, ich habe das gerade in golfR kommentiert ...
Mr. Xcoder
Nur für die Snarky- matchEinreichung
upvoted
Sie können verkürzen ifelsemit diesen Tipp: codegolf.stackexchange.com/a/97826/59530
JAD
2
Außerdem verwendet Ihr längerer match
JAD
6

Gelee , 9 8 Bytes

ṣK¥ƒiⱮo⁶

Probieren Sie es online!

Ein volles Programm , das drei Argumente verwendet : [[table], incomparables], x, nomatchin dieser Reihenfolge.

Nick Kennedy
quelle
5

Ruby , 44 Bytes

Null indexiert.

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

Probieren Sie es online!

Wert Tinte
quelle
4

Japt , 14 Bytes

Ë!XøD ©ÒVbD ªW

Versuch es

Zottelig
quelle
4

Python 3 , 60 Bytes

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

Probieren Sie es online!

Mr. Xcoder
quelle
Welche Funktionen sind für 3.8 spezifisch? Sieht für mich so aus, als könnte dies für jede Subversion von Python 3 funktionieren.
Theo
Nun, es ist nicht spezifisch für 3.8. Ich habe gerade die automatisch generierte Vorlage in TIO kopiert und nicht bemerkt, dass ich 3.8 verwendet habe. Vielen Dank für das Heads-up, wird sich anpassen.
Herr Xcoder
1
R has 1-based indices, but a consistent alternative-based indices are acceptable.So können Sie die herausnehmen -~und nur 0-Indizierung für -1 Bytes verwenden.
Value Ink
1
@ValueInk Das schlägt für den 3. Testfall fehl (und im Allgemeinen, wenn sich ein übereinstimmendes Element am Anfang einer Liste befindet), da 0 in Python falsch ist.
Herr Xcoder
1
Ah, faire Show. Im übrigen t.index(v)if v in{*t}-{*i}else nhat die exakt gleichen bytecount wie Ihre aktuelle v in{*t}-{*i}and-~t.index(v)or nLösung, haha
Wert Ink
3

Perl 6 , 45 Bytes

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

Probieren Sie es online!

Anonymer Codeblock, der Eingaben wie Curry annimmt f(table, nomatch, incomparables)(x)und die Treffer 0 indiziert zurückgibt.

Erläuterung:

->\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
~~
Scherzen
quelle
+1 Ich habe kurz daran gearbeitet, aber ich habe es getan, $_∉d&&b.antipairs.Map{$_}||cwas ohne den Falsey-Wert von 0 gut funktioniert hätte. Der erste ($ _: k) ist eine großartige Lösung, die die langen Antipairs vermeidet. Kartenzwang.
user0721090601
2

Holzkohle , 14 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. 1-indiziert. Erläuterung:

  θ             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
quelle
2

C (gcc) , 125 Bytes

1-indiziert.

Da ich in den übergebenen Arrays keinen Sentinel-Wert verwenden kann, muss ich die Array-Grenzen für jedes Array angeben.

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

Probieren Sie es online!

ErikF
quelle
2

Attache , 39 Bytes

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

Probieren Sie es online!

Ziemlich einfache Überprüfung. Beachten Sie, dass sich die Argumentreihenfolge von der der Übereinstimmung unterscheidet. Insbesondere xist das letzte Argument eher als das erste und entspricht _4dem obigen Ausschnitt.

Erläuterung

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

Haskell, 57 56 Bytes

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

Argument Reihenfolge ist: table, nomatch, incomparables, x.

Probieren Sie es online!

nimi
quelle
2

05AB1E , 7 Bytes

õ:Ik®I:

0-indiziert. Die Eingänge sind in der Reihenfolge: incomparables, table, x, nomatch.

Probieren Sie es online aus.

Erläuterung:

õ:       # 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
quelle