ทำให้ฉันเป็นเวทย์มนตร์ขั้นต่ำ


27

ทำให้ความท้าทายนี้สั้น

คุณได้รับหมายเลข 4: p1, p2, p3 และ p4

ผลรวมเวทย์มนตร์ของตัวเลขถูกกำหนดดังนี้:

magic_sum = |p1 - p2| + |p2 - p3| + |p3 - p4| + |p4 - p1|

คุณได้รับอนุญาตให้เปลี่ยนหนึ่งในค่าจำนวนเต็มข้างต้นเท่านั้น (p1, p2, p3 หรือ p4) คุณต้องเปลี่ยนค่าเพื่อให้ผลรวมเวทย์มนตร์ของค่าบรรลุค่าขั้นต่ำ

ตัวอย่างเช่น:

p1, p2, p3, p4 = 17, -6, 15, 33. ค่าของผลรวมเวทย์มนตร์คือ 78 ในกรณีนี้

คุณสามารถเปลี่ยน -6 ที่นี่เป็น 16 และค่าของผลรวมเวทย์มนตร์จะกลายเป็น 36 ซึ่งเป็นค่าต่ำสุดที่สามารถบรรลุได้

โปรดทราบว่าตัวเลขอาจเป็นจำนวนเต็มบวกหรือลบ

นี่คือ code-golf ดังนั้นอย่างน้อยไบต์ในการชนะรหัส คะแนนบราวนี่สำหรับการใช้ภาษาที่ใช้งานได้จริงในภาษาสันทนาการ อาจที่ 4 อยู่กับคุณ

หากต้องการย้ำ:

ตัวอย่างที่ 1

อินพุต 1

17 -6 15 33

เอาท์พุท 1

36

คำอธิบาย 1

-6 สามารถถูกแทนที่ด้วย 16 และนั่นทำให้เราได้ผลรวมของเวทย์มนตร์ขั้นต่ำที่เป็นไปได้

ตัวอย่างที่ 2

อินพุต 2

10 10 10 10

เอาท์พุท 2

0 or 2

ทั้งเป็นที่ยอมรับ

คำอธิบาย 2

ผลรวมเวทย์มนตร์ที่สามารถบรรลุได้ต่ำสุดคือ 0 เนื่องจากผลรวมขั้นต่ำของจำนวนเต็มบวก 4 ตัวคือ 0 หากต้องเปลี่ยนหมายเลขดังนั้นหนึ่งใน 10 ของสามารถเปลี่ยนเป็น 9 และทำให้ได้ผลลัพธ์ 2

ตัวอย่างที่ 3

อินพุต 3

1 2 3 4

เอาท์พุท 3

4

คำอธิบาย 3

การป้อนข้อมูลด้วยตัวเองให้ผลรวม 6 เป็นผลรวมของเวทย์มนตร์ การเปลี่ยน 4 เป็น 1 และผลรวมของเวทย์มนตร์ขั้นต่ำคือ 4


10
+1 แต่สามารถทำได้กับตัวอย่างเพิ่มเติม
Jonathan Allan

2
ตัวอย่างการทำงานอย่างสมบูรณ์และอีกสองกรณีทดสอบเพิ่มเติมและมันเป็นของ+1ฉัน
Shaggy

@Shaggy เสร็จแล้ว +1 ของฉันอยู่ที่ไหน : P
Koishore Roy

1
@KoishoreRoy จะไม่ทดสอบกรณีที่ 3 เป็น 6 โดยไม่มีการเปลี่ยนแปลงหรือไม่
wizzwizz4

@ wizzwizz4 | 1 - 2 | + | 2 - 3 | + | 3 - 4 | + | 4 - 1 | = 1 + 1 + 1 + 3 = 6 คุณถูก. ทำการแก้ไข
Koishore Roy

คำตอบ:



20

Python 2 , 44 ไบต์

a,b,c,d=sorted(input())
print min(c-a,d-b)*2

ลองออนไลน์!

เรียงลำดับอินพุตเป็น a,b,c,d,ในลำดับใช้เวลาเล็ก ๆc-aและd-bและคู่มัน ทำไมจึงใช้งานได้

ครั้งแรกที่ทราบว่าเมื่อเราเปลี่ยนองค์ประกอบเพื่อเพิ่มผลรวมวงจรรวมของระยะทางของมันที่ดีที่สุด (หรือผูกที่ดีที่สุด) 17, -6, 15, 33 -> 17, 17, 15, 33ที่จะเปลี่ยนมันให้เท่ากับเพื่อนบ้านเช่น นั่นเป็นเพราะระยะทางโดยรวมใหม่ไปยังเพื่อนบ้านที่เป็นวงจรวนซ้ายและขวานั้นอย่างน้อยก็ระยะห่างระหว่างเพื่อนบ้านเหล่านั้นดังนั้นการทำสิ่งเหล่านี้ให้เท่าเทียมกันนั้นดีที่สุดที่เราสามารถทำได้

ทีนี้การลบหนึ่งในสองสำเนาที่อยู่ติดกันของตัวเลขจะให้ผลรวมระยะทางเหมือนกันหมด ในตัวอย่างนี้คือ17, 15, 332 + 18 + 16ให้ระยะทาง ดังนั้นแทนที่จะแทนที่หนึ่งในสี่ตัวเลขมันก็เท่ากับลบมันทิ้งสามตัวเลขและใช้ผลรวมของระยะทางรอบของพวกเขา

ขอให้สังเกตว่าด้วยตัวเลข 3 ตัวระยะทางที่ใหญ่ที่สุดคือผลรวมของสองตัวที่เล็กกว่า เนื่องจากหมายเลขถ้าเราเรียงลำดับที่จะมีแล้วa ≤ b ≤ c |a - c| = |a - b| + |b - c|กล่าวอีกนัยหนึ่งเราเดินทางระหว่างจำนวนที่มากที่สุดและน้อยที่สุดสองครั้งโดยใช้หมายเลขกลางเป็นหลุมหยุดหนึ่งครั้ง ดังนั้นผลรวมของสามระยะทางเป็นเพียงสองเท่าของระยะห่างระหว่างค่าต่ำสุดและสูงสุดดังนั้น(c-a)*2ดังนั้นผลรวมของระยะทางที่สามเป็นเพียงครั้งที่สองระยะห่างระหว่างต่ำสุดและสูงสุดดังนั้น

ดังนั้นคำถามคือจำนวนที่เราลบเพื่อให้ได้ระยะทางที่เล็กที่สุดระหว่างค่าต่ำสุดและสูงสุดของตัวเลขสามตัวที่เหลืออยู่ เห็นได้ชัดว่าเราลบตัวเลขที่เล็กที่สุดหรือใหญ่ที่สุด เรียกพวกเขาa, b, c, dตามลำดับเรียงลำดับการลบaใบไม้d - bและการลบdใบไม้c - aและผลลัพธ์สุดท้ายคือสองเท่าใดก็ตามที่มีขนาดเล็กกว่า


ช่วยฉันด้วยกรณีทดสอบที่นี่ เกิดอะไรขึ้นถ้าผลรวมเวทย์มนตร์เป็น 0 อยู่แล้วซึ่งเป็นจำนวนที่ต่ำที่สุด ในกรณีนั้นคำตอบควรเป็น 0? หรือจำนวนต่ำสุดถัดไปที่เป็นไปได้ ในกรณีที่อินพุทคือ [10,10,10,10], ผลรวมเวทย์มนตร์คือ 0 ที่ต่ำที่สุดที่สองที่เป็นไปได้คือ 2 ให้ฉันรู้ว่าคุณคิดอย่างไร
Koishore Roy

สิ่งที่ฉันได้ยินคุณพูดคือคุณสามารถละเว้นคำสั่งของตัวเลขทั้งสี่ที่ให้ไว้ (ขั้นตอนแรกของคุณคือการเรียงลำดับ) แต่ถ้าเราได้ขอให้ห้าตัวเลขp1ผ่านp5และยังคงได้รับอนุญาตเท่านั้นเปลี่ยนหมายเลขหนึ่ง? กรณีสี่หลักนั้นดูเหมือนง่ายเกินไป (หลังจากเห็นคำตอบของคุณเท่านั้น)
Jeppe Stig Nielsen

@ KoishoreRoy ฉันชอบวิธีการแก้ปัญหาของคุณให้ทั้งสอง
xnor

@JeppeStigNielsen ใช่ความจริงที่ว่าคำสั่งนั้นไม่สำคัญสำหรับตัวเลข 4 ตัวและมันเกิดขึ้นเพราะหลังจากลบเลขหนึ่งเพื่อให้มีสามตัวเลขคู่ของตัวเลขทั้งหมดจะอยู่ติดกันเป็นวงกลม ด้วยตัวเลขห้าตัวสิ่งนี้จะใช้ไม่ได้ (คุณสามารถหาตัวอย่าง) และความท้าทายจะแตกต่างกันมาก
xnor

หวังว่าฉันจะสามารถโหวตได้สองครั้ง การสังเกตที่สวยงามอธิบายได้ดี
Jonah

9

R , 66 33 ไบต์

function(x)2*min(diff(sort(x),2))

ลองออนไลน์!

สั้นกว่ามากด้วยอัลกอริธึมของ xnor (อ่านคำอธิบายของพวกเขาและโพสต์โพสต์!)

เวอร์ชั่นเก่า:

R , 66 ไบต์

function(x,m=matrix(x,3,4))min(colSums(abs(diff(rbind(m,m[1,])))))

ลองออนไลน์!

รับอินพุตเป็นเวกเตอร์ของจำนวนเต็ม 4 ตัว

p2p2p1p2p3|p1p2|+|p2p3|p2=p1.

มี 4 วิธีในการเลือกหมายเลขที่เราเปลี่ยน สำหรับแต่ละสิ่งเหล่านี้เราต้องคำนวณผลรวมของความแตกต่างสัมบูรณ์ 3 ประการเท่านั้น

3×4rbind


4

เจลลี่ , 11 10 ไบต์

I;SASƲ$-ƤṂ

ลองออนไลน์!

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


3

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

ṁ-Ƥ⁸IA§Ṃ

ลิงก์ monadic ยอมรับรายการจำนวนเต็ม * ซึ่งให้ผลเป็นจำนวนเต็ม

* สามารถเป็นตัวเลขใดก็ได้ตราบใดที่มีมากกว่า 1; ใช้สูตรเวทย์มนตร์สไตล์เดียวกันโดยสรุปความแตกต่างของเพื่อนบ้าน

ลองออนไลน์!

อย่างไร?

ṁ-Ƥ⁸IA§Ṃ - Link: list of integers, X       e.g. [17,-6,15,33]
 -Ƥ      - for overlapping "outfixes" of length length(X)-1:
         -                                      [[-6,15,33],[17,15,33],[17,-6,33],[17,-6,15]]
ṁ  ⁸     -   mould like X                       [[-6,15,33,-6],[17,15,33,17],[17,-6,33,17],[17,-6,15,17]]
    I    - incremental differences              [[21,18,-39],[-2,18,-16],[-23,39,-16],[-23,21,2]]
     A   - absolute (vectorises)                [[21,18,39],[2,18,16],[23,39,16],[23,21,2]]
      §  - sums                                 [78,36,78,46]
       Ṃ - minimum                              36

3

Japt -Q , 11 ไบต์

ñÍó ®r- ÑÃn

ใช้อัลกอริทึมของ @ xnor ซึ่งช่วยฉัน 4 ไบต์

บันทึก 5 ไบต์ด้วย @Shaggy

ลองมัน


ดูเหมือนว่าจะทำงานได้ดี แต่คุณจะอธิบายว่าทำไมงานนี้ถึงได้ผล
Koishore Roy

@KoishoreRoy เพิ่มคำอธิบาย
ศูนย์รวมของความไม่รู้

29 bytes (ฉันคิดว่า )
Shaggy

@Shaggy เมื่อฉันอัปเดตคำตอบของฉันฉันตั้งใจแทนที่ผลรวมกับแผนที่ทำให้กอล์ฟบางอย่างไม่ถูกต้อง แต่คนอื่นดี
ศูนย์รวมของความไม่รู้

อย่างมาก (เพิ่มเติม) golfed :) คุณสามารถบันทึก 1 ไบต์เพิ่มเติมโดยแทนที่ÃÃด้วยขึ้นบรรทัดใหม่
Shaggy

3

J , 24 20 18 17 ไบต์

รุ่นทางเลือกโดยใช้อัลกอริธึม xnor:

2*[:<./2 2-/@$\:~

อย่างไร

สองครั้ง2 *นาทีของ[:<./แถวที่ 2 หักออกจากแถวแรก[:-/ของเมทริกซ์ 2x2 ที่เกิดขึ้นจากการสร้าง2 2$อินพุตที่เรียงลำดับลง\:~

ลองออนไลน์!

คำตอบเดิม: J , 24 ไบต์

[:<./1(1#.2|@-/\],{.)\.]

ลองออนไลน์!

ใช้ความคิดของ Nick Kennedy

  • 1(...)\.] ใช้คำกริยาใน parens กับความยาวทั้งหมด 1 (ความยาวของ n คือรายการที่ลบองค์ประกอบที่อยู่ติดกัน n ออกดังนั้นสิ่งนี้จะสร้างรายการที่เป็นไปได้ทั้งหมดโดยนำ 1 elm ออก)
  • (1 #. 2 |@-/\ ] , {.)นี้จะคำนวณผลรวมมายากลโดยการผนวกเอล์มแรกที่จะมีการป้อนข้อมูล] , {.และการประยุกต์ใช้ความแตกต่างของเอบีเอส|@-/เพื่อ infixes ของความยาว 2 และสรุปผล2 ...\1 #.
  • [:<./ ส่งคืน min

2

05AB1E , 11 7 ไบต์

พอร์ตของ @xnor 'คำตอบวุ้น
-4 ไบต์ขอบคุณที่ @Emignaและ@Grimy

{2ô`αß·

ลองออนไลน์

ทางเลือก7 ไบต์ซึ่งใช้งานได้ในรุ่นดั้งเดิมของ 05AB1E เท่านั้น (จะต้องใช้ก่อนหน้า¥ในเวอร์ชันใหม่):

{2ôø¥W·

ลองออนไลน์

คำอธิบาย:

{        # Sort the (implicit) input-list
         #  i.e. [17,-6,15,33] → [-6,15,17,33]
 2ô      # Split this list into parts of size 2
         #  → [[-6,15],[17,33]]
   `     # Push both separated to the stack
    α    # And take their absolute differences
         #  → [23,18]
     ß   # Pop and push the minimum
         #  → 18
      ·  # Double it (and output implicitly as result)
         #  → 36

{        # Sort the (implicit) input-list
         #  i.e. [17,-6,15,33] → [-6,15,17,33]
 2ô      # Split this list into parts of size 2
         #  → [[-6,15],[17,33]]
   ø     # Zip/transpose, swapping rows/columns
         #  → [[-6,17],[15,33]]
    ¥    # Get the deltas/forward differences of the inner lists
         #  → [[23],[18]]
     W   # Get the flattened minimum (without popping)
         #  → 18
      ·  # Double it (and output implicitly as result)
         #  → 36

1
7 ไบต์ในแบบดั้งเดิม: {2ôø¥W·หรือ 8 ด้วยในการเขียนใหม่
Emigna

2
7 ไบต์ในแบบที่ไม่ใช่มรดก:{2ô`αW·
Grimmy

@Emigna Smart ขอบคุณ!
Kevin Cruijssen

@Grimy ขอบคุณเช่นกัน!
Kevin Cruijssen

1

C ++ (gcc)

โปรแกรมเต็มรูปแบบ: 138 ไบต์

#include<iostream>
#include<regex>
using namespace std;int main(){int a[4];for(int&b:a)cin>>b;sort(a,a+4);cout<<min(a[2]-*a,a[3]-a[1])*2;}

ลองออนไลน์!

ฟังก์ชั่นหลัก: 84 ไบต์

#include<regex>
int m(int*a){std::sort(a,a+4);return std::min(a[2]-*a,a[3]-a[1])*2;}

ลองออนไลน์!

ยังใช้อัลกอริทึมxnorอธิบายในโพสต์ Python 2 ของเขา


0

ถ่าน 20 ไบต์

I⌊EEθΦθ⁻κμΣEι↔⁻λ§ι⊕μ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด กลายเป็นว่าฉันใช้ความคิดของ @ NickKennedy คำอธิบาย:

   Eθ                   Map over input array
     Φθ                 Filter over input array where
       ⁻κμ              Outer and inner indices differ
  E                     Map over resulting list of lists
           Eι           Map over remaining values in list
                §ι⊕μ    Get the next value in the list
             ↔⁻λ        Compute the absolute difference with the current value
          Σ             Take the sum of absolute differences
 ⌊                      Take the minimum sum
I                       Cast to string and implicitly print

0

JavaScript (ES6), 51 ไบต์

การใช้วิธีที่ฉลาดกว่าของ xnor :

a=>([a,b,c,d]=a.sort((a,b)=>a-b),b+c<a+d?c-a:d-b)*2

ลองออนไลน์!


คำตอบเดิม 96 ไบต์

รับอินพุตเป็นอาร์เรย์จำนวนเต็ม 4 ตัว อาจไม่ใช่วิธีที่สั้นที่สุดแน่นอน

a=>a.map(m=x=>a.map((y,i)=>a[m=a.map(v=>s+=Math.abs(p-(p=v)),a[i]=x,p=a[3],s=0)|m<s?m:s,i]=y))|m

ลองออนไลน์!



0

Java 8 , 235 ไบต์

พอร์ตของคำตอบและอัลกอริธึม Pythonของ @ xnor

import java.util.*;interface M{static void main(String[]A){Scanner I=new Scanner(System.in);int a[]={0,0,0,0};for(int i=0;i<4;a[i++]=I.nextInt());java.util.Arrays.sort(a);System.out.print(2*(a[2]-a[0]>a[3]-a[1]?a[3]-a[1]:a[2]-a[0]));}}

ลองออนไลน์!

Java 10 , ไม่ผ่านการพิสูจน์, 222 ไบต์

ด้วย Java 10 ฉันควรจะสามารถแทนที่ด้านซ้ายของการประกาศสแกนเนอร์ด้วยvarแม้ว่าฉันจะไม่สามารถรวบรวมออนไลน์และดังนั้นฉันสามารถเพิ่มมันเป็นเรื่องไม่สำคัญ ขอโทษ

interface M{static void main(String[]A){var I=new java.util.Scanner(System.in);int a[]={0,0,0,0};for(int i=3;i<4;a[i++]=I.nextInt());java.util.Arrays.sort(a);System.out.print(2*(a[2]-a[0]>a[3]-a[1]?a[3]-a[1]:a[2]-a[0]));}}

1
AFAIK คุณสามารถมีฟังก์ชั่นการส่งของคุณได้เช่นเดียวกับคำตอบอื่น ๆ ไม่จำเป็นต้องรวมคลาสโดยรอบส่วนต่อประสาน ฯลฯ
Tau
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.