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!


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,



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!


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






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!


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
~~

+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

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!


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

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!


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.