Matchmaker, Matchmaker ทำให้ฉันตรงกัน


21

(เราจะไม่หาFindหรือจับได้tryCatch)

นี่เป็นส่วนที่สองของซีรี่ส์ที่มีหลายส่วนในการนำฟังก์ชั่น R ที่น่าสนใจมาใช้ ส่วนหนึ่งสามารถพบได้ที่นี่

งาน:

คุณจะต้องใช้ฟังก์ชั่นของ Rmatchในไม่กี่ไบต์เท่าที่จะทำได้

การป้อนข้อมูล:

  • xรายการที่อาจว่างเปล่า / อาร์เรย์ของจำนวนเต็ม
  • tableรายการที่อาจว่างเปล่า / อาร์เรย์ของจำนวนเต็ม
  • nomatchค่าจำนวนเต็มเดียว
  • incomparablesรายการที่อาจว่างเปล่า / อาร์เรย์ของจำนวนเต็ม

เอาท์พุท:

  • อาเรย์เดี่ยว / รายการของจำนวนเต็มที่Oมีความยาวเท่ากันxโดยที่แต่ละค่าO[i]แสดงถึง:
    • ดัชนีjของค่าแรกในtableตำแหน่งที่table[j]==x[i]
    • nomatchแสดงให้เห็นว่าค่าในไม่tableเท่ากับx[i] หรือที่อยู่ในรายชื่อของ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 หรืออะไรก็ได้ แต่สิ่งนี้ต้องสอดคล้องและคุณต้องระบุสิ่งนี้ในคำตอบของคุณ
  • หากคุณเลือกภาษามี builtin ที่ทำสิ่งนี้โปรดใช้โซลูชันของคุณเอง
  • คำอธิบายชื่นชม

นี่คือดังนั้นวิธีที่สั้นที่สุดในการชนะไบต์!


ต้องรองรับตัวเลขลบหรือไม่ ฉันจะสมมติว่ามันไม่จำเป็นเพราะมีเพียงตัวอย่างสมมติว่ามันและฉันค่อนข้างแน่ใจว่ามีกฎมาตรฐานสำหรับมัน
wizzwizz4

@ wizzwizz4 ไม่เพราะ4อยู่ในincomparablesจึงไม่สามารถจับคู่ได้ หากภาษาของคุณไม่สามารถรองรับตัวเลขติดลบได้ก็เป็นเรื่องดีที่จะต้องใช้ตัวเลขที่ไม่เป็นลบ แต่ระบุว่าสมมติฐานดังกล่าวในการส่งของคุณ
จูเซปเป้

1
นอกเหนือจากการแสดงความคิดเห็นส่วนหัว: makeเรายังจะไม่ได้รับการทำ
วาลพูดว่า Reinstate Monica

1
@ มากจริง ๆ แล้วมันเป็นการอ้างอิงที่ไม่ดีนักกับ Fiddler on the Roof ; ความท้าทายทั้งหมดนี้มีบรรดาศักดิ์ตามธีมหลังจากการแสดงต่าง ๆ เพราะสิ่งนี้เข้ากันได้อย่างสมบูรณ์แบบจนฉันคิดว่ามันจะสร้างหัวข้อที่ดี
จูเซปเป้

คำตอบ:


8

เยลลี่ ,  10  8 ไบต์

-2 ขอบคุณErik the Outgolfer

,⁷y⁵iⱮ⁶o

โปรแกรมเต็มรูปแบบยอมรับอาร์กิวเมนต์บรรทัดคำสั่งสี่ข้อincomparables nomatch table xซึ่งพิมพ์การแทน Jelly * ของรายการmatchผลลัพธ์ของฟังก์ชันR

ลองออนไลน์!

อย่างไร?

เช่นกับ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%และ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 ได้
Theo

มันไม่เฉพาะเจาะจงกับ 3.8 ฉันเพิ่งคัดลอกเทมเพลตที่สร้างขึ้นอัตโนมัติบน TIO ดังนั้นฉันจึงไม่สังเกตเห็นว่าฉันใช้ 3.8 ขอบคุณสำหรับหัวขึ้นจะปรับ
Mr. Xcoder

1
R has 1-based indices, but a consistent alternative-based indices are acceptable.ดังนั้นคุณสามารถนำออกมา-~และใช้ดัชนี 0 สำหรับ -1 ไบต์
Value Ink

1
@ValueInk ที่ล้มเหลวสำหรับกรณีทดสอบครั้งที่ 3 (และโดยทั่วไปเมื่อองค์ประกอบที่ตรงกันอยู่ที่จุดเริ่มต้นของรายการ) เนื่องจาก 0 เป็นเท็จใน Python
Mr. Xcoder

1
อาแสดงธรรม อนึ่งt.index(v)if v in{*t}-{*i}else nมีค่าเท่ากับจำนวนเดียวกันกับv in{*t}-{*i}and-~t.index(v)or nโซลูชันปัจจุบันของคุณhaha
Value Ink



3

Perl 6 , 45 ไบต์

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

ลองออนไลน์!

บล็อกโค้ดที่ไม่ระบุตัวตนที่รับอินพุต curried เช่น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 ค่าแรก ($ _: k) เป็นวิธีแก้ปัญหาที่ยอดเยี่ยมที่หลีกเลี่ยง antipairs.Map coercion ที่ยาว
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 การจัดทำดัชนี

เนื่องจากฉันไม่สามารถใช้ค่า Sentinel ในอาร์เรย์ที่ส่งผ่านได้ฉันต้องกำหนดขอบเขตของอาร์เรย์สำหรับแต่ละอาร์เรย์

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}

ลองออนไลน์!

การตรวจสอบที่ค่อนข้างง่าย โปรดทราบว่าลำดับการโต้แย้งนั้นแตกต่างจากการจับคู่ โดยเฉพาะ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.