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!


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,



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!


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




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!



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!


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



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

+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

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!


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

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!


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.