รับสองอาร์เรย์ที่ดีที่สุด


19

คุณจะได้รับสองอาร์เรย์ของตัวเลขทศนิยม งานของคุณคือการจับคู่องค์ประกอบที่สอดคล้องกันของสองอาร์เรย์และรับค่าสูงสุดของแต่ละคู่ อย่างไรก็ตามหากองค์ประกอบที่เกี่ยวข้องทั้งสองนั้นเท่ากันคุณจะต้องนำผลรวมของพวกเขามาแทน

ตัวอย่างเช่นให้รายการ[1, 3, 3.2, 2.3]และ[3, 1, 3.2, 2.6]คุณต้องทำต่อไปนี้:

  • จับคู่องค์ประกอบ [[1, 3], [3, 1], [3.2, 3.2], [2.3, 2.6]](หรือไปรษณีย์):

  • [3, 3, 6.4, 2.6]ผ่านไปแต่ละคู่และใช้กระบวนการข้างต้น:


รายละเอียด

  • อาร์เรย์ / รายการจะมีความยาวเท่ากันเสมอ อย่างไรก็ตามอาจว่างเปล่า

  • ตัวเลขที่อยู่ในนั้นจะเหมาะสมกับความสามารถของภาษาของคุณเสมอตราบใดที่คุณไม่ใช้สิ่งที่ไม่เหมาะสม พวกเขาอาจเป็นบวกศูนย์หรือเชิงลบคุณต้องจัดการทุกประเภท

  • หากช่วยลดจำนวนไบต์คุณอาจใช้ความยาวของรายการเป็นอินพุต

กฎระเบียบ


กรณีทดสอบ

Array_1, Array_2 -> เอาท์พุท

[], [] -> []
[1, 2, 3], [1, 3, 2] -> [2, 3, 3]
[1, 3, 3.2, 2.3], [3, 1, 3.2, 2.6] -> [3, 3, 6.4, 2.6]
[1,2,3,4,5,5,7,8,9,10], [10,9,8,7,6,5,4,3,2,1] -> [10, 9, 8, 7, 6, 10, 7, 8, 9, 10]
[-3.2, -3.2, -2.4, 7, -10.1], [100, -3.2, 2.4, -7, -10.1] -> [100, -6.4, 2.4, 7, -20.2]

คุณบอกว่าตัวเลขจะพอดีกับ "ความสามารถ" ในภาษาของคุณเสมอตราบใดที่คุณไม่ "ละเมิด" นั้นจะสนับสนุนเฉพาะจำนวนเต็มในภาษาที่ไม่มีการลอยตัวเท่านั้นที่จะถูกพิจารณาว่าเป็นการล่วงละเมิดหรือไม่ แต่ฉันไม่เห็นเหตุผลจริงๆว่าทำไมต้องเป็นแบบลอยกระบวนการเดียวกันนี้สามารถทำได้กับจำนวนเต็มฉันต้องการแก้ปัญหานี้ใน Brain-Flak แต่ Brain-flak รองรับ ints เท่านั้น
Wheat Wizard

@Weateat ตัวช่วยสร้างฉันสามารถทำการยกเว้นได้ ไปข้างหน้าและโพสต์คำตอบของคุณและพูดถึงฉันอนุญาตให้มันเพื่อหลีกเลี่ยงความสับสน

คำตอบ:


8

เยลลี่ขนาด 4 ไบต์

=‘×»

ลองออนไลน์!

วิธีนี้ใช้วิธีการเดียวกันกับคำตอบ APL ของฉันยกเว้น Jelly มี builtin สำหรับเพิ่มหนึ่งหมายเลข!


เกลียดที่จะเป็นนักเลง แต่ตัวละครบางตัวไม่ได้มากกว่าหนึ่งไบต์ในการเข้ารหัสที่สมเหตุสมผล?
Cedric Knight

นี้ใช้เพจเจลลี่
Zacharý

ในที่สุดฉันก็ชนะการแข่งขัน!
Zacharý

2
@ Zachary ONE MAN, 4 btytes ... ฤดูร้อนนี้ ... คุณ ... จะ ... จะ ... JELLY เขา ... จัดอันดับ J สำหรับวุ้น
Magic Octopus Urn

11

Kotlin, 78 75 71 66 65 59 ไบต์

มันเป็นความพยายามครั้งแรกของฉันเจ๋ง: D

a.zip(b).map{(a,b)->when{b>a->b;a>b->a;else->a*2}}.toList()

TIO ใช้งานไม่ได้กับโซลูชันนี้ (และฉันไม่รู้ว่าทำไม) ซอร์สโค้ดสำหรับการทดสอบด้านล่าง

fun main(args: Array<String>) {
    bestOfTwo(floatArrayOf(), floatArrayOf()).print()
    bestOfTwo(floatArrayOf(0F), floatArrayOf(0F)).print()
    bestOfTwo(floatArrayOf(1F,2F,3F), floatArrayOf(1F,3F,2F)).print()
    bestOfTwo(floatArrayOf(1F,3F,3.2F,2.3F), floatArrayOf(3F,1F,3.2F,2.6F)).print()
    bestOfTwo(floatArrayOf(1F,2F,3F,4F,5F,5F,7F,8F,9F,10F), floatArrayOf(10F,9F,8F,7F,6F,5F,4F,3F,2F,1F)).print()
    bestOfTwo(floatArrayOf(-3.2F,-3.2F,-2.4F,7F,-10.1F), floatArrayOf(100F,-3.2F,2.4F,-7F,-10.1F)).print()
}


fun bestOfTwo(a :FloatArray, b :FloatArray): List<Float> =
    a.zip(b).map{(a,b)->when{b>a->b;a>b->a;else->a*2}}.toList()


fun List<Float>.print() {
    this.forEach { print("$it, ") }; println("")
}

แก้ไข:

-3 โดยแทนที่ "a + b [i]" โดย "a * 2"

-4 โดยแทนที่เมธอด "mapIndexed" โดย "zip" (ขอบคุณ @AnonymousReality Swift solution)

-5 โดยแทนที่เมธอด "Math.max" โดยเมื่อเงื่อนไข

-1 โดยการเปลี่ยนแปลงเมื่อสั่งเงื่อนไข

-6 โดยการเปลี่ยนเป็นFloatArray () โดย toList ()


10
ยินดีต้อนรับสู่ PPCG! โปรดอย่าท้อแท้จาก downvote (เป็นผลมาจากระบบที่แปลกประหลาดเล็กน้อยที่เกิดขึ้นเมื่อโพสต์แรกของผู้ใช้ใหม่ถูกตั้งค่าสถานะโดยอัตโนมัติเพื่อคุณภาพและจากนั้นพวกเขาปรับปรุงโพสต์ดังกล่าว !!)
Jonathan Allan

2
"ฟีเจอร์" ที่แย่ที่สุดตลอดกาล ... btw ไม่รู้สึกแย่กับมัน
Erik the Outgolfer

10

Python 2 , 45 ไบต์

การผสมผสานของการแก้ปัญหาครั้งแรกของฉันและ@ovs'

lambda*a:map(lambda x,y:max(x,y)*-~(x==y),*a)

ลองออนไลน์!

Python 2 , 49 ไบต์

lambda x,y:[max(a,b)*-~(a==b)for a,b in zip(x,y)]

ลองออนไลน์!

Python 2 , 46 ไบต์

@ovsแนะนำวิธีการนี้ให้ประหยัด 3 ไบต์

lambda*x:[max(a,b)*-~(a==b)for a,b in zip(*x)]

ลองออนไลน์!


อย่างไร?

ปิดครั้งแรกที่เราจับคู่องค์ประกอบที่สอดคล้องกันโดยใช้อย่างใดอย่างหนึ่งหรือ* zip()ที่ช่วยให้เราสามารถเล่นกอล์ฟต่อไปของเราโดยการทำงานกับแผนที่หรือรายการความเข้าใจ

max(x,y)*-~(x==y)เคล็ดลับเย็นในคำตอบนี้เป็นส่วนหนึ่งนี้: มันทำงานอย่างไร - อย่างที่ทราบกันดีอยู่แล้วว่า Python แปลงค่าบูลเป็นจำนวนเต็มโดยอัตโนมัติเมื่อใช้ในการดำเนินการทางคณิตศาสตร์ ดังนั้น(x==y)จะได้รับการประเมินว่าเป็น1ไปตามเงื่อนไขหรือไม่ อย่างไรก็ตามหากทั้งสองค่าไม่เท่ากันก็จะส่งคืน0แทน จากนั้นดำเนินการค่าที่เหมาะสม-~เพิ่มขึ้นค่าที่ส่งกลับจากบูลโดย1ให้เราอย่างใดอย่างหนึ่งหรือ2 ให้ค่าสูงสุดของคู่และคูณด้วยค่าที่ส่งกลับด้านบน (ดังนั้นจึงได้รับการคูณด้วยถ้าพวกเขามีค่าเท่ากันซึ่งในกรณีนี้จะคืนค่าของทั้งคู่)1max(a,b)*2max()

นี่คือความจริงที่ว่าผลรวมของสองจำนวนเท่ากันในความเป็นจริงพวกเขาทั้งสองเท่าและประเภทของ "การละเมิด" ชั้นบูลของงูหลามเป็นประเภทย่อยของ int


ว้าวนั่นเร็วจริงๆ!

ตรงไปตรงมามากขึ้นหมายเลขเดียวกันของไบต์:lambda*a:map(lambda x,y:(x<=y)*y+(x>=y)*x,*a)
jferard

@ jferard ฉันจริงแล้วนั่นเป็นทางออกของ Luis แล้ว
Mr. Xcoder

@ Mr.Xcoder โอ๊ะโอ! ฉันไม่ได้อ่านทั้งหน้า ...
jferard

อย่าพูดว่า "ด้านบน" เนื่องจากการสั่งซื้อสามารถเปลี่ยนแปลงได้ (ฉันไม่เห็นคำตอบของคุณด้านบน)
Zacharý

8

JavaScript (ES6), 53 49 45 43 ไบต์

a=>b=>a.map((x,y)=>(y=b[y])>x?y:y<x?x:x+y)
  • บันทึก 4 ไบต์ด้วยการยืมเคล็ดลับจาก Mr. Xcoder
  • บันทึก 2 ไบต์ขอบคุณ Arnauld

ลองมัน

o.innerText=(f=

a=>b=>a.map((x,y)=>(y=b[y])>x?y:y<x?x:x+y)

)(i.value=[1,3,3.2,2.3])(j.value=[3,1,3.2,2.6]);oninput=_=>o.innerText=f(i.value.split`,`.map(eval))(j.value.split`,`.map(eval))
<input id=i><input id=j><pre id=o>


คำอธิบาย

a=>b=>

ฟังก์ชั่นไม่ระบุชื่อที่ใช้ 2 อาร์เรย์เป็นอาร์กิวเมนต์ผ่านพารามิเตอร์aและbในรูปแบบ currying (เช่นการเรียกด้วยf(a)(b)

a.map((x,y)=>                      )

แผนที่เหนืออาร์เรย์แรกผ่านแต่ละองค์ประกอบผ่านฟังก์ชั่นที่xเป็นองค์ประกอบปัจจุบันและyเป็นดัชนีปัจจุบัน

(y=b[y])

รับองค์ประกอบที่ดัชนีในอาร์เรย์ที่สองและกำหนดว่าเป็นค่าใหม่yy

>x?y

ตรวจสอบว่าyมีค่ามากกว่าและถ้าเป็นเช่นนั้นกลับมาxy

:y<x?x

อื่นตรวจสอบว่าyน้อยกว่าxและถ้าเป็นเช่นนั้นกลับx

:x+y

อื่นกลับผลรวมของและx y(การคูณxหรือy2 จะทำงานที่นี่ด้วยจำนวนไบต์เดียวกัน)


j.value.split`,`.map(eval)หรือeval('['+j.value+']')? นอกจากนี้ยังx+yจะมีลักษณะ neater IMHO
Neil

@ Neil: 1) ฉันพบว่าพิมพ์ได้ง่ายกว่าเดิม นอกจากนี้ฉันมีเทมเพลต Snippet สองอันบนหนึ่งในเครื่องของฉัน มันง่ายกว่าที่จะยึด.map(eval)ติดกับมัน 2) ตกลงจะแก้ไขในไม่ช้า
ปุย


7

R , 31 29 ไบต์

function(a,b)pmax(a,b)+a*!a-b

pmax ใช้เวลาสูงสุดขนานของสอง (หรือมากกว่า) อาร์เรย์ (รีไซเคิลที่สั้นกว่าตามที่ต้องการ)

ฉันกำลังดูความคิดเห็นของ Luis Mendoและเห็นได้ชัดว่าฉันรู้ว่าวิธีนี้สามารถใช้กับ R ได้เช่นกัน ที่มีฉันถึง 30 ไบต์ แต่แล้วผมเริ่มเล่นไปรอบ ๆ ด้วยวิธีการที่แตกต่างกันในการได้รับดัชนีแทนในการปรับปรุงคำตอบเดิมของฉันและ stumbled เมื่อ!a-bเป็นTRUEที่a==bและมิฉะนั้นจะเทียบเท่าFALSE a==bอย่างไรก็ตามด้วยเหตุผลใดก็ตาม R ไม่ต้องการวงเล็บ!a-bในขณะที่มันทำa==bซึ่งช่วยฉันสองไบต์

ดังที่JDLกล่าวไว้ในความคิดเห็นการทำงานนี้เพราะ!(การปฏิเสธ) มีความสำคัญต่ำกว่าตัวดำเนินการไบนารี-ใน R ซึ่งแปลก

ลองออนไลน์! (เวอร์ชั่นใหม่)

ลองออนไลน์! (เดิม)


ปรากฎว่า "unary" นั้น มีความสำคัญลดลงในการวิจัยกว่าไบนารี "-" ซึ่งผมคิดว่าเป็นเรื่องผิดปกติมากทีเดียว (และฉันไม่ได้ตระหนักจนอ่านคำตอบนี้!)
JDL

@JDL ใช่ฉันมักจะต้องเปิดหน้า R Syntax ในขณะที่เล่นกอล์ฟในกรณีที่แปลก ๆ แบบนี้ ... และเพราะฉันไม่สามารถจำความสำคัญของ:การโต้ตอบกับเลขคณิตได้
Giuseppe


6

Dyalog APL ขนาด 5 ไบต์

⌈×1+=

ลองออนไลน์!

อย่างไร?

  • อาร์กิวเมนต์สูงสุดที่เป็นองค์ประกอบของอาร์กิวเมนต์
  • ×องค์ประกอบที่ฉลาดคูณ
  • 1+=1 เพิ่มความเสมอภาคองค์ประกอบที่ชาญฉลาดของการขัดแย้ง

วิธีนี้ใช้ได้ผลถ้าหากจำนวนไม่เท่ากันซึ่ง1+=จะเป็น1ซึ่งเมื่อคูณด้วยจำนวนสูงสุดจะเป็นจำนวนสูงสุด เมื่อตัวเลขเท่ากัน1+=จะกลับมา2เมื่อจำนวนนั้นคูณด้วยค่าสูงสุดเราจะได้ค่าสูงสุดเป็นสองเท่าหรือจำนวนที่เพิ่มเข้ามาสูงสุด


5

เยลลี่ 6 ไบต์

żSṀE?€

ลิงก์ dyadic รับรายการตัวเลขในแต่ละด้านและส่งคืนรายการผลลัพธ์

ลองออนไลน์! หรือดูชุดทดสอบ *

อย่างไร?

żSṀE?€ - Link: list of numbers L, list of numbers R   e.g. [1,3,3.2,2.3], [3,1,3.2,2.6]
ż      - zip - interleave L & R                       [[1,3],[3,1],[3.2,3.2],[2.3,2.6]]
     € - for each pair:
    ?  - { if:
   E   -   ...condition: equal                          0      0       1         0
 S     -   ...then: sum                                               6.4
  Ṁ    -   ...else: maximum                             3      3                2.6
       - }                                    ... ->   [3     ,3     ,6.4      ,2.6]

อีกทางเลือกหนึ่งคือลิงค์ monadic นี้ใช้ลิสต์ของสองลิสต์และ6 ไบต์ :

+»⁼?"/

* ฉันไม่คิดว่าฉันได้สร้างส่วนท้ายของชุดทดสอบเกือบสามเท่าของจำนวนไบต์ของรหัสมาก่อน!


Outgolfed! . +1 สำหรับการตีความคำถามทุกคำ
Zacharý

... และฉันถูกจับได้ว่าจะลืม»เวกเตอร์นั้นมาก่อน!
Jonathan Allan

มันจะทำอะไรอีกใช้อาร์เรย์สูงสุดในบางวิธีที่ซับซ้อน?
Zacharý

ไม่จำเป็นต้องมีคำจำกัดความที่ซับซ้อน Python จัดการ - ตัวอย่างเช่นmax([1,1,0],[1,0,3]) -> [1,1,0](ไม่[1,1,3])
โจนาธานอัลลัน

ดังนั้นโดยทั่วไปไม่มีที่สิ้นสุดฐาน?
Zacharý

5

05AB1E , 5 ไบต์

øεMÃO

ลองออนไลน์!

-1 ขอบคุณที่Emigna


เป็นความคิดที่ดีที่ใช้γ!
Emigna

@Emigna ฉันต้องการ "องค์ประกอบสูงสุด" จริงๆและ{γθอาจสั้นที่สุดที่ฉันสามารถทำได้
Erik the Outgolfer

แล้วไงøεMÃOล่ะ
Emigna

@Emigna ยอดเยี่ยมขอบคุณ! (duh ทำไมฉันไม่คิดว่า) yay ได้เป็นผู้นำในขณะนี้: p btw øεZÃOจะทำงานด้วย
Erik the Outgolfer

4

MATL , 7 ไบต์

X>tG=s*

อินพุตเป็นเมทริกซ์สองแถวโดยที่แต่ละแถวเป็นหนึ่งในอาร์เรย์

ลองออนไลน์!

คำอธิบาย

X>   % Implicit input. Maximum of each column
t    % Duplicate
G    % Push input
=    % Is equal? Element-wise with broadcast. Gives a two-row matrix
s    % Sum of each column. Gives a row vector containing 1 and 2
*    % Multiply, element-wise. Implicit display

4

Java 8, 80 69 67 66 65 64 64 63 ไบต์

(a,b,l)->{for(;l-->0;)if(a[l]>=b[l])b[l]=a[l]*(a[l]>b[l]?1:2);}

แก้ไขอินพุตอาร์เรย์ที่สองแทนหรือส่งคืนโฟลว์อาร์เรย์ใหม่เพื่อบันทึกไบต์

-11 ไบต์โดยใช้ความยาวเป็นจำนวนเต็มเพิ่มเติมซึ่งได้รับอนุญาตตามกฎการท้าทาย
-5 ไบต์ขอบคุณที่@ OliverGrégoire (หนึ่งไบต์ในเวลา .. xD)
-1 ไบต์อ้อมขอบคุณที่@Shaggy 's คำตอบ JSโดยใช้แทนa[l]*2a[l]+b[l]

คำอธิบาย:

ลองที่นี่

(a,b,l)->{          // Method with 2 float-array and integer parameters and no return-type
  for(;l-->0;)      //  Loop over the array
    if(a[l]>=b[l])  //   If the current value in `a` is larger or equal to `b`:
      b[l]=         //   Modify the second input-array:
       a[l]*        //    Use `a` multiplied by:
        (a[l]>b[l]? //     If the current value in `a` is larger than `b`:
          1         //      Multiply by 1
         :          //     Else (`a` is smaller of equal to `b`):
          2)        //      Multiply by 2
                    //  End of loop (implicit / single-line body)
}                   // End of method

2
"ถ้ามันช่วยให้คุณลดจำนวนไบต์คุณอาจใช้ความยาวของรายการเป็นอินพุตก็ได้" มันจะลดจำนวนไบต์ของคุณอย่างแน่นอน;)
Olivier Grégoire

1
นอกจากนี้ 2 ไบต์ที่สั้นลง:a->b->l->{float A,B;for(;l-->0;b[l]=(A=a[l])<B?B:A>B?A:A+B)B=b[l];}
Olivier Grégoire

และคุณสามารถบันทึกได้อีกหนึ่งไบต์โดยใส่float A, Bในการforเริ่มต้น
Olivier Grégoire

1
หรือสิ่งนี้: (a,b,l)->{for(;l-->0;)if(a[l]>=b[l])b[l]=a[l]*(a[l]>b[l]?1:2);}(63 ไบต์)
Olivier Grégoire

3
@ OlivierGrégoire Lol .. ด้วยการเล่นกอล์ฟทุกไบท์ช่วย แต่นั่นไม่ได้หมายความว่าคุณต้องเล่นทีละหนึ่งไบต์ ; p
Kevin Cruijssen

3

Pyth , 11 ไบต์

m*eSdhnd{dC

ลองที่นี่!

Pyth , 12 ไบต์

m*eSdhqhdedC

ลองที่นี่!

หรือ

m*eSdh!tl{dC

ลองที่นี่!


@Jakube นั่นเป็นวิธีแก้ปัญหาของ Erik ไปแล้วเศร้า ฉันต้องการใช้สิ่งนั้นด้วย แต่ตอนนี้ฉันไม่สามารถทำได้
Mr. Xcoder

โอ้ไม่เห็นอันนั้น
Jakube

3

05AB1E , 9 8 7 ไบต์

บันทึกไบต์เป็นErik Outgolferชี้ให้เห็นว่ารายการเป็นอินพุตที่ถูกต้อง

øεMsËi·

ลองออนไลน์!

คำอธิบาย

ø          # zip the lists
 ε         # apply to each pair
  M        # get max
   s       # swap the top 2 elements on the stack
    Ëi     # if all elements are equal
      ·    # double the max

ว้าวนั่นเร็วจริงๆ!

คุณสามารถบันทึกไบต์โดยการลบและการป้อนข้อมูลเป็นคู่ของรายการและรายการ
Erik the Outgolfer

@EriktheOutgolfer: จริง ฉันคิดว่าเราไม่ได้รับอนุญาต แต่ฉันเห็นว่าความท้าทายระบุกฎ I / O มาตรฐาน ขอขอบคุณที่แจ้งให้ทราบ :)
2560

1
@Emigna เคล็ดลับ: อย่าสร้างกฎออกมาจากใจของคุณ;)
Erik the Outgolfer

1
@EriktheOutgolfer: ใช่ฉันต้องหยุดทำสิ่งนั้นจริงๆ โดยเฉพาะกฎที่ทำให้โปรแกรมของฉันใช้งานได้นานขึ้น)
Emigna


3

J, 7 ไบต์

>.`+@.=

ลองออนไลน์!

รับหนึ่งรายการเป็นอาร์กิวเมนต์ด้านซ้ายและอีกรายการเป็นด้านขวา

โชคดีที่ความเท่าเทียมกันคือการดำเนินการระดับศูนย์

คำอธิบาย

>.`+@.=
      =  Compare equality pairwise
    @.   If equal
   +       Sum
>.       (Else) take greater value

@.ไม่ใช่คำสั่ง if จริง ๆแต่ในกรณีนี้มันทำหน้าที่เป็นอย่างใดอย่างหนึ่ง (มันทำดัชนีเป็น gerund >.`+ตามผลลัพธ์ของอาร์กิวเมนต์ที่ถูกต้องและนำไปใช้กับอินพุต)


เป็นงานที่ดีฉันรู้ว่าฉันไม่สามารถทำสิ่งนี้แม้ว่าคุณจะได้รับoutgolfedโดยการแปล APL ของฉัน > _ <
Zacharý

J ส่องแสงที่นี่จริงๆ
โยนาห์

@ Zacharýหนู, กอล์ฟดีอย่างไรก็ตาม
โคล


3

TI-Basic, 23 21 ไบต์

Prompt A,B
(ʟA=ʟB)ʟA+max(ʟA,ʟB

รายการที่แย่เกินไปใช้เวลาสองไบต์ในแต่ละ ...


คุณสามารถบันทึกสองไบต์ด้วยการพร้อมท์XและYจากนั้นใช้ʟXและʟYเพื่อเข้าถึงเช่น " Prompt X,Y:ʟX(ʟX=ʟY)+max(ʟ1,ʟ2"
Scott Milner

นอกจากนี้สิ่งนี้ไม่ถูกต้องในขณะนี้เนื่องจากL1(L1=L2)พยายามรับองค์ประกอบของL1ที่รายการซึ่งมีข้อผิดพลาดเกิดขึ้น (L1=L2)L1ในการแก้ไขปัญหาที่สลับการสั่งซื้อคือ
Scott Milner

@ScottMilner ขอบคุณที่ชี้นำทั้งคู่
Timtech



2

Python 3 , 49 46 45 ไบต์

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

lambda*x:map(lambda a,b:a*(a>=b)+b*(b>=a),*x)

ลองออนไลน์!


1
46 lambda*c:[a*(a>=b)+b*(b>=a)for a,b in zip(*c)]ไบต์: ปรากฎว่าสิ่งนี้ค่อนข้างดีเช่นกัน :) - เลวร้ายเกินไปไม่มีที่สำหรับเล่นกอล์ฟเพิ่มเติม
Mr. Xcoder

@ Mr.Xcoder ขอบคุณ! ความคิดที่ดี!
Luis Mendo

45 ไบต์โดยใช้แผนที่แทนรหัสไปรษณีย์
OVS

2

เสียงกระเพื่อมสามัญ, 60 59 ไบต์

(mapcar(lambda(x y)(*(max x y)(if(= x y)2 1)))(read)(read))

ลองออนไลน์!

-1 ไบต์ขอบคุณ @ @ Zacharý!


59 (mapcar(lambda(x y)(*(max x y)(if(= x y)2 1)))(read)(read))ไบต์:
Zacharý

คุณยินดีฉันไม่รู้เสียงกระเพื่อมที่ดีฉันเพิ่งแปลคำตอบของฉันเป็นเสียงกระเพื่อมซึ่งจบลงด้วยการบันทึกไบต์
Zacharý

2

Python มีจำนวน 28 ไบต์

lambda a,b:a*(a>=b)+b*(b>=a)

ถือว่าอินพุตถูกกำหนดเป็นสองอาร์เรย์ numpy


ถ้าเราใช้จำนวนมากนี่คือทางออกที่แย่กว่าของฉัน:lambda a,b:n.fmax(a,b)*((a==b)+1)
ริช

@Erich ผมชอบความคิด import numpy as nแต่จะทำอย่างนั้นฉันจะต้อง ฉันไปโดยไม่มีมันที่นี่เพราะมันเป็นนัยในการป้อนข้อมูล

ฉันเดาว่าฉันสั่นเล็กน้อยในการนับจำนวนไบต์อย่างชัดเจนบ่อยครั้งคำตอบของงูใหญ่เป็นเพียง lambdas เมื่อการนำคำตอบไปใช้จริงจะต้องกำหนดให้บางสิ่ง ด้วยเหตุนี้ฉันจึงสงสัยว่าจะสามารถหลีกเลี่ยงคำสั่งการนำเข้าโดยนัยได้หรือไม่
ริช

@Erich โดยทั่วไปคุณสามารถอ้างถึงตัวแปรเท่านั้นnหากคุณกำหนดไว้nในรหัสของคุณดังนั้นการนำเข้าจะต้องชัดเจน โดยค่าเริ่มต้นเราอนุญาตให้ฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบเป็นคำตอบซึ่งรวมถึงฟังก์ชั่นที่ไม่ระบุชื่อ

1
ดีนี้ต้องการเพียงป้อนข้อมูลเป็นอาร์เรย์ numpy numpyมากกว่าการนำเข้า แต่นี้ไม่ได้ทำงานโดยไม่ต้องใช้return?
Zacharý

2

C # (. NET Core)โดยใช้ Linq 47 + 18 = 65 ไบต์

x=>y=>x.Zip(y,(a,b)=>a>b?a:b>a?b:b+a).ToArray()

ลองออนไลน์!

C # (. NET Core), 82 ไบต์

x=>y=>l=>{for(int i=0;i<l;i++)x[i]=x[i]>y[i]?x[i]:y[i]>x[i]?y[i]:y[i]*2;return x;}

ลองออนไลน์!


คุณสามารถดร็อปคำตอบ LINQ ทีละไม่กี่ไบต์โดยเปลี่ยนเนมสเปซ System.LINQ เป็นใช้ System.LINQ
jkelm

@ jkelm ใช่ฉันเคยสงสัยว่า 'ใช้ระบบ' จะรวมหรือไม่เช่นนั้นฉันเดาไม่ ฉันจะทำความสะอาด
Dennis.Verweij

System.Linq รวมอยู่ใน "Visual C # Interactive Compiler" ผมไม่แน่ใจว่าทั้งหมดเกี่ยวกับการกลับArrayVS IListVS IEnumerableแต่ถ้าทุกคนมีสิทธิ์ได้รับแล้วคุณจะได้รับการนับไบต์ถึง 37 - tio.run/##Sy7WTS7O/...
dana


1

Swift 3, 81 79 Bytes

func n(a:[Double],b:[Double]){for(x,y)in zip(a,b){print((x==y) ?x+y:max(x,y))}}

Swift มีคุณสมบัติที่น่าสนใจซึ่ง Int ไม่สามารถทำการแปลงได้โดยตรงDoubleดังนั้นคุณต้องระบุอาร์เรย์ใด ๆ ว่าเป็นอาร์เรย์ของDoubles ก่อนที่จะส่งไปยังฟังก์ชัน

(เช่น) var k:[Double] = [1,2,3,4,5,5,7,8,9,10]

แก้ไข: -2 ไบต์ขอบคุณ @EriktheOutgolfer


คุณไม่จำเป็นต้องมีช่องว่างรอบ ๆ(x,y)และก่อน??
Erik the Outgolfer

@EriktheOutgolfer ?จำเป็นต้องใช้ก่อนหน้านี้เนื่องจาก Swift จะปฏิบัติต่อพวกเขาเป็นประเภทที่เป็นตัวเลือกแทน ternaries (ซึ่งไม่ใช่) คนอื่นไม่ได้ นอกจากนั้นสิ่งนี้สามารถเล่นกอล์ฟอย่างมาก

@EriktheOutgolfer - TheIOSCoder ได้ตอบคุณไปแล้วบางส่วน แต่คุณพูดถูกคุณไม่ต้องการคนที่อยู่ในวงวนน่าสนใจ!
AnonymousReality

73 ไบต์: func n(a:[Float],b:[Float]){print(zip(a,b).map{$0==$1 ?2*$0:max($0,$1)})}(ค่าเริ่มต้นของความไม่ถูกต้องแบบลอยไม่จำเป็นต้องจัดการ)
Mr. Xcoder

หรือ 74 ไบต์:func n(a:[Float],b:[Float]){print(zip(a,b).map{($0==$1 ?2:1)*max($0,$1)})}
Mr. Xcoder


1

Japt , 13 ไบต์

íV,È¥Y Ä *XwY

ลองออนไลน์! ด้วย-Qแฟล็กเพื่อจัดรูปแบบอาร์เรย์เอาต์พุต


ทำได้ดีมาก ก่อนหน้านี้ฉันลอง 2 ครั้งโดยที่ทั้งคู่ออกมาที่ 17 ไบต์ ฉันลืมไปแล้วว่าíสามารถใช้ฟังก์ชันเป็นอาร์กิวเมนต์ที่สอง
ปุย

1

สนิม , 107 97 ไบต์

|a:V,b:V|a.iter().zip(b).map(|(&x,y)|if x==y{x+y}else{x.max(y)}).collect::<V>();
type V=Vec<f32>;

ลองออนไลน์!

บันทึกแล้ว 8 ไบต์ขอบคุณ @mgc


1
ฉันเดาคุณสามารถบันทึก 8 ไบต์โดยใช้การอนุมานประเภทในการรวบรวมVecและโดยใช้maxวิธีการของf32:|a:Vec<f32>,b:Vec<f32>|a.iter().zip(b).map(|(&x,y)|if x==y{x+y}else{x.max(y)}).collect::<Vec<_>>();
mgc

1
@ mgc ขอบคุณ! การอนุมานประเภทเป็นความคิดที่ดี แต่ในกรณีนี้ประเภทนามแฝงจะสั้นกว่า
jferard

1

Swift 4 , 41 bytes

{zip($0,$1).map{$0==$1 ?2*$0:max($0,$1)}}

กรณีทดสอบ:

let f: ([Float], [Float]) -> [Float]
    = {zip($0,$1).map{$0==$1 ?2*$0:max($0,$1)}}

let testcases: [(inputA: [Float], inputB: [Float], expected: [Float])] = [
    (
        inputA: [],
        inputB: [],
        expected: []
    ),
    (
        inputA: [1, 2, 3],
        inputB: [1, 3, 2],
        expected: [2, 3, 3]
    ),
    (
        inputA: [1, 3, 3.2, 2.3],
        inputB:  [3, 1, 3.2, 2.6],
        expected: [3, 3, 6.4, 2.6]
    ),
    (
        inputA: [1,2,3,4,5,5,7,8,9,10],
        inputB:  [10,9,8,7,6,5,4,3,2,1],
        expected: [10, 9, 8, 7, 6, 10, 7, 8, 9, 10]
    ),
    (
        inputA: [-3.2, -3.2, -2.4, 7, -10.1],
        inputB:  [100, -3.2, 2.4, -7, -10.1],
        expected: [100, -6.4, 2.4, 7, -20.2]
    ),
]

for (caseNumber, testcase) in testcases.enumerated() {
    let actual = f(testcase.inputA, testcase.inputB)
    assert(actual == testcase.expected,
        "Testcase #\(caseNumber) \((testcase.inputA, testcase.inputB)) failed. Got \(actual), but expected \(testcase.expected)!")
    print("Testcase #\(caseNumber) passed!")
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.