仲人、仲人、私をマッチさせて


21

(ただしFind、を見つけることも、キャッチすることtryCatchもありません)

これは、興味深いR関数を実装するマルチパートシリーズのパート2です。パート1はここにあります

タスク:

Rのmatch関数をできるだけ少ないバイトで実装する必要があります。

入力:

  • x、空の可能性のある整数のリスト/配列
  • table、空の可能性のある整数のリスト/配列
  • nomatch、単一の整数値
  • incomparables、空の可能性のある整数のリスト/配列

出力:

  • Oに等しい長さの整数の単一の配列/リストx。各値O[i]は次のいずれかを表します。
    • インデックスj最初の値tabletable[j]==x[i]
    • nomatch、には値ことを示すtableISに等しいないx[i] ORそのx[i]リストにありますincomparables

テストケース

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]

必要に応じて、より多くのテストケースを生成できます。

追加のルール:

  • Rには1ベースのインデックスがありますが、一貫した代替ベースのインデックスは受け入れ可能です。そのため、3または17などで始まるインデックスを使用できますが、これは一貫している必要があり、回答でこれを指定する必要があります。
  • これを行う言語が組み込まれている言語を選択した場合は、独自のソリューションも実装してください。
  • 説明を歓迎します。

これはなので、バイト単位の最短の解決策が勝ちです!


負の数をサポートする必要がありますか?例だけがそれを想定しており、標準的なルールがあると確信しているので、それは必要ないと想定します。
wizzwizz4

@ wizzwizz4いいえ、4はにincomparablesあるため、一致することはできません。あなたの言語が負の数をサポートできない場合、非負の数を要求することは問題ありませんが、あなたの提出においてその仮定を述べてください。
ジュゼッペ

1
ヘッダーコメントへの追加:を作成しませんmake
valによると、モニカの復職

1
@valそれは実際に屋根の上のフィドラーへのかなり悪い参照です; これらの課題はすべて、さまざまなショーチューンをテーマにしたものです。なぜなら、これは非常に完璧にフィットし、良いテーマになると思ったからです。
ジュゼッペ

回答:


8

ゼリー 10  8 バイト

-2 アウトゴルファーのエリックに感謝

,⁷y⁵iⱮ⁶o

incomparables nomatch table xRのmatch関数結果のリストのゼリー表現*を出力する4つのコマンドライン引数を受け入れる完全なプログラム。

オンラインでお試しください!

どうやって?

例: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]

*空のリストは何も表されず、長さのリストはアイテムとして表されますが、他のリストは次のように囲まれ[]て区切られます。,



6

R、55バイト

この場合、コードはmatch完全な機能を使用せず、index関数として使用されます。最初のRの答えです。おそらくバイト単位で信じられないほど非効率です!

(のおかげジュゼッペ・情報用) %in%setdiffも両方され、内部で使用して実装さmatchそう完全になります。この驚くほど便利な機能を取り払う、混乱。したがって、これには期限のない150名の報奨金があります!(ただし、setdiff許可されています)

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

オンラインでお試しください!

または...

R、5バイト

match

オンラインでお試しください!


%in%and の使用を避けていたのに、もっとうまくやれるかどうかはわかりませんmatch。これらの機能のいずれも使用せずに(恐ろしいと思われる)良いゴルフの答えを見つけたい場合、私はこれを賞賛します。
ジュゼッペ

ああ、私はただそれについてgolfRでコメントしました...
Xcoder氏

卑劣なmatch投稿のみに賛成
懲罰

ifelseこのヒントを使用して短縮できます:codegolf.stackexchange.com/a/97826/59530
JAD

2
また、あなたのより長い提出は実際に使用しますmatch:S
JAD






4

Python 3、60バイト

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

オンラインでお試しください!


これのどの機能が3.8に固有ですか?このような私にはルックスは、Python 3のいずれかの転覆のために働く可能性
テオ・

まあ、それは3.8に固有のものではありません。TIOに自動生成されたテンプレートをコピーアンドペーストしただけなので、3.8を使用していることに気付きませんでした。ヘッズアップをありがとう、調整します。
Xcoder氏

1
R has 1-based indices, but a consistent alternative-based indices are acceptable.その-~ため、-1バイトに0インデックスを使用して、そのまま使用できます。
バリューインク

1
@ValueInk 3番目のテストケース(および一般に一致する要素がリストの先頭にある場合)では、Pythonでは0が偽であるため失敗します。
Xcoder氏

1
ああ、フェアショー。ちなみに、t.index(v)if v in{*t}-{*i}else nあなたの現在のv in{*t}-{*i}and-~t.index(v)or nソリューションとまったく同じバイト数を持っています、笑
Value Ink



3

Perl 6、45バイト

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

オンラインでお試しください!

カリーf(table, nomatch, incomparables)(x)化された入力を受け取り、インデックス0の一致を返す匿名コードブロック。

説明:

->\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私はこれに簡単に取り組みましたが$_∉d&&b.antipairs.Map{$_}||c、0の偽の値に対してはうまくいくはずでした。
user0721090601

2

、14バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。1インデックス。説明:

  θ             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バイト

1インデックス付き。

渡された配列でセンチネル値を使用できない場合、各配列の配列境界を指定する必要があります。

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

オンラインでお試しください!


2

アタッシュ、39バイト

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

オンラインでお試しください!

非常に簡単な検証。引数の順序は、matchの順序とは異なることに注意してください。具体的にxは、最初ではなく最後の引数であり_4、上記のスニペットに対応します。

説明

${{[_,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 バイト

õ:Ik®I:

0インデックス。入力は次の順序です。incomparables, table, x, nomatchです。

オンラインでお試しください。

説明:

õ:       # 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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.