Matchmaker, Matchmaker, buat aku cocok

21

(kami tidak akan menemukan Findatau menangkap tryCatch, meskipun)

Ini adalah bagian kedua dari rangkaian multi-bagian penerapan beberapa fungsi R yang menarik. Bagian satu dapat ditemukan di sini .

Tugas:

Anda harus mengimplementasikan fungsi Rmatch sesedikit mungkin byte.

Memasukkan:

  • x, daftar / array bilangan bulat yang mungkin kosong
  • table, daftar / array bilangan bulat yang mungkin kosong
  • nomatch, nilai integer tunggal
  • incomparables, daftar / array bilangan bulat yang mungkin kosong

Keluaran:

  • satu array / daftar bilangan bulat Odengan panjang yang sama x, di mana setiap nilai O[i]mewakili:
    • Indeks jnilai pertama di tablemanatable[j]==x[i]
    • nomatch, menunjukkan bahwa tidak ada nilai dalam tablesama dengan x[i] OR yang x[i]ada dalam daftar incomparables.

Uji Kasus

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]

Lebih banyak kasus uji dapat dihasilkan sesuai kebutuhan.

Aturan tambahan:

  • R memiliki indeks berbasis 1, tetapi indeks berbasis alternatif yang konsisten dapat diterima. Jadi, Anda dapat menggunakan indeks yang dimulai pada 3 atau 17 atau apa pun, tetapi ini harus konsisten, dan Anda harus menunjukkan ini dalam jawaban Anda.
  • Jika Anda memilih bahasa yang memiliki builtin yang melakukan ini, harap juga mengimplementasikan solusi Anda sendiri.
  • Penjelasan dihargai.

Ini adalah , jadi solusi terpendek dalam byte menang!

Giuseppe
sumber
Haruskah itu mendukung angka negatif? Saya akan menganggap itu tidak perlu, karena hanya contoh mengasumsikan dan saya cukup yakin ada aturan standar untuk itu.
wizzwizz4
@ wizzwizz4 tidak, karena 4ada di incomparables, jadi tidak bisa dicocokkan. Jika bahasa Anda tidak dapat mendukung angka negatif, maka boleh saja untuk meminta angka non-negatif, tetapi sebutkan asumsi itu dalam kiriman Anda.
Giuseppe
1
Tambahan untuk komentar tajuk: kami juga tidak akan membuat make.
val berkata Reinstate Monica
1
@val itu sebenarnya referensi yang sangat buruk untuk Fiddler di Atap ; semua tantangan ini memiliki judul bertema setelah berbagai showtunes karena yang ini sangat cocok sehingga saya pikir itu akan menjadi tema yang bagus.
Giuseppe

Jawaban:

8

Jelly ,  10  8 byte

-2 Terima kasih kepada Erik the Outgolfer

,⁷y⁵iⱮ⁶o

Program lengkap yang menerima empat argumen baris perintah, incomparables nomatch table xyang mencetak representasi Jelly * dari daftar matchhasil fungsi R.

Cobalah online!

Bagaimana?

misalnya dengan 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]

* Daftar kosong direpresentasikan sebagai bukan apa-apa, daftar lenth satu diwakili hanya sebagai item, sedangkan daftar lain dilampirkan []dan dibatasi oleh,

Jonathan Allan
sumber
8

R , 83 byte

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

Cobalah online!

Hindari match, %in%dan setdiff.

Nick Kennedy
sumber
3
66 byte
JAD
6

R , 55 byte

Dalam hal ini, kode tidak digunakan matchdengan fungsionalitas penuhnya, hanya digunakan sebagai indexfungsi. Jawaban R pertama, jadi mungkin byte-wise sangat tidak efisien!

Catatan (terima kasih kepada Giuseppe untuk informasinya) : %in% dan setdiffkeduanya juga diimplementasikan secara internalmatch , jadi dengan sepenuhnya menyingkirkan fungsi yang sangat berguna ini akan menghasilkan kekacauan . Karena itu, ada hadiah 150 rep tanpa batas waktu untuk ini! (catatan yang setdiffdiizinkan, meskipun)

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

Cobalah online!

atau...

R , 5 byte

match

Cobalah online!

Tuan Xcoder
sumber
Saya tidak yakin saya bisa melakukan lebih baik meskipun saya menghindari penggunaan %in%dan match; jika Anda ingin menemukan jawaban golf yang baik tanpa salah satu dari fungsi-fungsi itu (kemungkinan akan mengerikan), saya akan memberi hadiah ini.
Giuseppe
Ah lol, saya baru saja berkomentar di golfR tentang itu ...
Tn. Xcoder
Terpilih hanya untuk matchpengajuan snarky
Punintended
Anda dapat mempersingkat ifelsemenggunakan tip ini: codegolf.stackexchange.com/a/97826/59530
JAD
2
juga, kiriman Anda yang lebih lama sebenarnya menggunakan match: S
JAD
6

Jelly , 9 8 byte

ṣK¥ƒiⱮo⁶

Cobalah online!

Sebuah program penuh yang mengambil tiga argumen: [[table], incomparables], x, nomatchdalam urutan itu.

Nick Kennedy
sumber
5

Ruby , 44 byte

Diindeks nol.

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

Cobalah online!

Nilai Tinta
sumber
5

R , 79 byte

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

Cobalah online!

R , 66 byte

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

Menggabungkan solusi saya dengan bagian-bagian dari solusi Nick .

Cobalah online!

JAD
sumber
4

Japt , 14 byte

Ë!XøD ©ÒVbD ªW

Cobalah

Shaggy
sumber
4

Python 3 , 60 byte

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

Cobalah online!

Tuan Xcoder
sumber
Apa fitur ini khusus untuk 3,8? Menurut saya ini bisa bekerja untuk subversi apa pun dari Python 3.
Theo
Ya, tidak spesifik untuk 3.8. Saya hanya menyalin-tempel templat yang dibuat secara otomatis di TIO sehingga saya tidak melihat saya menggunakan 3,8. Terima kasih untuk head-up, akan menyesuaikan.
Tn. Xcoder
1
R has 1-based indices, but a consistent alternative-based indices are acceptable.Jadi Anda bisa menghapus -~dan hanya menggunakan 0-indexing untuk -1 byte.
Nilai Tinta
1
@NilaiInk Itu gagal untuk kasus uji ke-3 (dan secara umum ketika elemen yang cocok ada di awal daftar), karena 0 palsu dalam Python.
Tn. Xcoder
1
Ah, pertunjukan yang adil. Kebetulan, t.index(v)if v in{*t}-{*i}else nmemiliki bytecount yang sama persis dengan solusi Anda saat ini v in{*t}-{*i}and-~t.index(v)or n, haha
Value Ink
4

PowerShell , 63 byte

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

Cobalah online!

Diindeks 0

Veskah
sumber
3

JavaScript (ES6), 53 byte

(x,t,n,i)=>x.map(v=>!~i.indexOf(v)*-~t.indexOf(v)||n)

Cobalah online!

Arnauld
sumber
3

Perl 6 , 45 byte

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

Cobalah online!

Blok kode anonim yang mengambil input kari, sukai, f(table, nomatch, incomparables)(x)dan mengembalikan kecocokan 0 yang diindeks.

Penjelasan:

->\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
sumber
+1 Saya mengerjakan ini secara singkat tetapi melakukan $_∉d&&b.antipairs.Map{$_}||cyang seharusnya bekerja dengan baik tetapi untuk nilai falsey 0. Yang pertama ($ _: k) adalah solusi hebat yang menghindari paksaan antipairs.Map yang panjang.
user0721090601
2

Arang , 14 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. 1-diindeks. Penjelasan:

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

C (gcc) , 125 byte

1-diindeks.

Mengingat bahwa saya tidak dapat menggunakan nilai sentinel dalam array yang diteruskan, saya perlu memberikan batasan array untuk setiap array.

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

Cobalah online!

ErikF
sumber
2

Attache , 39 byte

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

Cobalah online!

Verifikasi yang cukup sederhana. Perhatikan bahwa urutan argumen berbeda dengan urutan yang cocok; khususnya, xadalah argumen terakhir daripada argumen pertama, dan sesuai dengan _4dalam cuplikan di atas.

Penjelasan

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

Haskell, 57 56 byte

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

Agar argumen adalah: table, nomatch, incomparables, x.

Cobalah online!

nimi
sumber
2

05AB1E , 7 byte

õ:Ik®I:

Diindeks 0. Input dalam urutan: incomparables, table, x, nomatch.

Cobalah online.

Penjelasan:

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