อีกาเทียบกับแท๊กซี่


36

ลองนึกภาพการเดินทางไปยังจุดที่โกหกห่างออกไปในแนวนอนและBห่างออกไปในแนวตั้งจากตำแหน่งปัจจุบันของคุณ หรือพูดอีกอย่างคือเดินทางจากจุดหนึ่งไปยังอีกจุดหนึ่ง คุณต้องเดินทางไกลแค่ไหน? ดูเหมือนว่าเป็นคำถามที่ตรงไปตรงมา แต่คำตอบนั้นขึ้นอยู่กับคนที่คุณถาม หากคุณอีกาและคุณสามารถเดินทางเป็นอีกาบิน , ระยะทางที่เดินทางเป็นเพียงระยะทางยุคลิดไป นี่คือ(0, 0)(a, b)(a, b)

sqrt(a^2 + b^2)

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

abs(a) + abs(b)

นี้เรียกว่ารถแท็กซี่ระยะทาง ภาพนี้แสดงให้เห็นถึงความแตกต่างอย่างชัดเจนระหว่างสอง:

ป้อนคำอธิบายรูปภาพที่นี่

ในการเดินทางไป(6, 6)อีกาสามารถบินได้บนเส้นสีเขียวและนี่จะให้ระยะทาง6 * sqrt(2)หรือประมาณ 8.49 รถแท็กซี่สามารถใช้เส้นทางสีแดงสีน้ำเงินหรือสีเหลือง แต่พวกเขาทั้งหมดจะใช้เวลา 12

สิ่งนี้นำไปสู่คำถามจริงที่ฉันถาม หากอีกาและรถแท็กซี่ออกจากจุด(0, 0)และเดินทางไปยังจุด(a, b)ใดเส้นทางของรถแท็กซี่จะยาวเท่าไหร่? หรือในศัพท์แสงคณิตศาสตร์มากขึ้น

ให้เวกเตอร์สองมิติกำหนดความแตกต่างระหว่าง norm2 ของเวกเตอร์กับ norm1 ของเวกเตอร์

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นที่สั้นที่สุดเพื่อตอบคำถามนี้ คุณอาจเลือกที่จะใช้ 'a' และ 'b' เป็นสองอินพุตแยกกันหรือเป็นสองรายการ tuple คุณสามารถนำเข้าและส่งออกในรูปแบบที่เหมาะสม หากความแตกต่างไม่ใช่จำนวนเต็มคุณต้องแม่นยำในตำแหน่งทศนิยมอย่างน้อยสองตำแหน่ง

คุณสามารถสันนิษฐานได้ว่า 'a' และ 'b' จะเป็นจำนวนเต็มและพวกเขาจะไม่เป็น 0 ทั้งคู่ (แม้ว่าจะเป็นไปได้ที่หนึ่งในนั้นจะเป็นศูนย์)

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

ฉันจะ upvote คำตอบใด ๆ ที่โพสต์คำอธิบายวิธีการทำงานของรหัสและแสดงให้เห็นถึงเทคนิคเด็ด ๆ ที่ใช้ในการบันทึกไบต์

นี่คือตัวอย่างสำหรับคุณในการทดสอบรหัสของคุณ:

#input    #output
3, 4      2
-3, 4     2
-3, -4    2
6, 6      3.51
42, 0     0
10, 10    5.86
3, 3      1.76

ขอให้สนุกกับการเล่นกอล์ฟ! :)


9
เราสามารถรับอินพุตเป็นจำนวนเชิงซ้อนได้หรือไม่
Uriel

ฉันคิดว่า testcase สำหรับ10,10ต้องเป็น 5.86 เนื่องจากมันออกมา5.85786...และคุณปัดเศษด้านล่าง
numbermaniac

4
ครั้งแรกที่ฉันอ่านชื่อเป็นThe Cow vs The Taxicabและหวังว่าจะได้พบกับบางสิ่งที่เกี่ยวข้องกับฟิสิกส์การชน ...
MooseBoys

เราจะให้ผลลัพธ์เชิงลบได้ไหม
Adám

@ Adám No. (เนื่องจากคอนเซปต์คุณจะกลับมาเป็นระยะทางซึ่งเป็นผลบวกเสมอ)
DJMcMayhem

คำตอบ:


108

แท็กซี่ , 7394 3773 ไบต์

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Tom's Trims.Pickup a passenger going to Tom's Trims.Go to Tom's Trims:n.[a]Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l 2 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Multiplication Station.1 is waiting at Starchild Numerology.Go to Starchild Numerology:s 2 l 2 r.Pickup a passenger going to Cyclone.Go to Cyclone:w 1 r 4 l.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to The Underground.Go to Cyclone:n 1 l 1 l.Pickup a passenger going to Multiplication Station.Go to The Underground:n 2 r 2 r.Switch to plan "b" if no one is waiting.Pickup a passenger going to Charboil Grill.Go to Charboil Grill:s 2 r 1 l 1 l 2 r.-1 is waiting at Starchild Numerology.Go to Starchild Numerology:e 2 r.Pickup a passenger going to Multiplication Station.Go to The Underground:w 1 r 2 r 1 r 2 l.[b]Go to Multiplication Station:s 1 l 1 r.Go to Tom's Trims:s 1 r 3 r.Switch to plan "c" if no one is waiting.Switch to plan "a".[c]Go to Multiplication Station:s 1 l 3 l.Pickup a passenger going to Cyclone.Pickup a passenger going to Cyclone.Go to Cyclone:s 1 r 2 l 2 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Multiplication Station.-1 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:w 1 r 2 r 1 r 4 l.Pickup a passenger going to Rob's Rest.Go to Rob's Rest:s 1 r 2 l 1 l 1 r 1 r.Go to Cyclone:s 1 l 1 l 1 l 1 r.Pickup a passenger going to Cyclone.[d]Pickup a passenger going to Multiplication Station.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:s 1 l 2 r 4 l.Pickup a passenger going to Addition Alley.Go to Cyclone:s 1 r 2 l 2 r.Switch to plan "e" if no one is waiting.Switch to plan "d".[e]Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Cyclone.99 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.Pickup a passenger going to The Underground.Go to Cyclone:e 1 l 2 r.Pickup a passenger going to Trunkers.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 r.Go to Trunkers:s 1 l.[f]Pickup a passenger going to Cyclone.Go to Cyclone:w 2 r.Pickup a passenger going to Divide and Conquer.Pickup a passenger going to Trunkers.Go to Trunkers:s 1 l.Go to Sunny Skies Park:w 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l.Pickup a passenger going to Divide and Conquer.Go to Zoom Zoom:n.Go to Divide and Conquer:w 1 l 2 r 1 r.Pickup a passenger going to Addition Alley.Go to Cyclone:e 1 l 1 l 2 l.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Divide and Conquer.2 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 3 l 2 r.Pickup a passenger going to Divide and Conquer.Go to Divide and Conquer:w 1 r 2 r 1 r 2 l 3 l.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:e 1 l 1 l 2 l 1 l.Go to The Underground:s 1 l 1 r 2 l.Switch to plan "g" if no one is waiting.Pickup a passenger going to The Underground.Go to Trunkers:s 2 r 1 l.Switch to plan "f".[g]Go to Rob's Rest:n 3 l 2 l 1 l 2 r 1 r.Pickup a passenger going to What's The Difference.Go to Sunny Skies Park:s 1 l 1 l.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:e 3 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

ลองออนไลน์!

Engineer Toastนักกอล์ฟแท็กซี่ที่มีประสบการณ์มากกว่าตัดสินใจที่จะใช้เวลาสักครู่ (อาจจะน้อยกว่าที่ฉันเคยทำ) และลงโปรแกรม Taxi ของฉันโดยเขียนมันใหม่ คุณสามารถค้นหาเนื้อหาคำตอบเก่าของฉันและลิงก์ไปยัง TIO เก่าของฉันในประวัติการแก้ไข

อัลกอริทึมรากที่สองที่ไม่ได้รับการดัดแปลงของ Toast: ลองออนไลน์!

Ungolfed พร้อมคำอธิบาย:

[ Crow vs. Taxi ]


[ GET THE NEGATIVE ABSOLUTE VALUES OF BOTH STDINS ]

[Move the stdin values to Tom's Trims b/c:]
[1) Stdin doesn't count as a passenger waiting]
[2) Checking for no one waiting is shorter that keeping tracker of a count for just 2 iterations OR repeating all the code over again]
Go to Post Office:w 1 l 1 r 1 l.
Pickup a passenger going to Tom's Trims.
Pickup a passenger going to Tom's Trims.
Go to Tom's Trims:n.

[a]
[Clone the first waiting value]
[If we've already picked up both, move to the next process]
[Switch to plan "c" if no one is waiting.]
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:s 1 l 1 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:n 1 l 1 l 2 r.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Multiplication Station.

[Add one to the value]
1 is waiting at Starchild Numerology.
Go to Starchild Numerology:s 2 l 2 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:w 1 r 4 l.
Pickup a passenger going to Addition Alley.
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to The Underground.

[Pick up a clone of that one to feed into Multiplication Station]
Go to Cyclone:n 1 l 1 l.
Pickup a passenger going to Multiplication Station.

[Subtract one and see if that's more than zero]
Go to The Underground:n 2 r 2 r.
Switch to plan "b" if no one is waiting.

[It was more than zero so we make it negative]
[First, though, get rid of the pesky result from The Underground]
Pickup a passenger going to Charboil Grill.
Go to Charboil Grill:s 2 r 1 l 1 l 2 r.
-1 is waiting at Starchild Numerology.
Go to Starchild Numerology:e 2 r.
Pickup a passenger going to Multiplication Station.
Go to The Underground:w 1 r 2 r 1 r 2 l.

[b]
[Make sure it's a negative value and leave it at Multiplication Station]
[Either it was already negative OR we now have -1 as a passenger]
Go to Multiplication Station:s 1 l 1 r.

[Get the next stdin unless we've already gotten them both]
Go to Tom's Trims:s 1 r 3 r.
Switch to plan "c" if no one is waiting.
Switch to plan "a".


[ ADD THE TWO NEGATIVES AND INVERT TO GET THE TAXI DISTANCE]

[c]
[Pickup the two negative absolute values and clone them]
Go to Multiplication Station:s 1 l 3 l.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Cyclone.
Go to Cyclone:s 1 r 2 l 2 r.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.

[Add the two clones values to get the negative Taxi distance]
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Multiplication Station.

[Invert to get the Taxi distance and store it at Rob's Rest]
-1 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station:w 1 r 2 r 1 r 4 l.
Pickup a passenger going to Rob's Rest.
Go to Rob's Rest:s 1 r 2 l 1 l 1 r 1 r.


[ FIND THE CROW DISTANCE ]
[Uses the Babylonian method: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method ]

[Square and Sum the cloned values]
Go to Cyclone:s 1 l 1 l 1 l 1 r.
Pickup a passenger going to Cyclone.
[d]
Pickup a passenger going to Multiplication Station.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station:s 1 l 2 r 4 l.
Pickup a passenger going to Addition Alley.
Go to Cyclone:s 1 r 2 l 2 r.
Switch to plan "e" if no one is waiting.
Switch to plan "d".
[e]
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Cyclone.

[Pickup our cycle counter]
[It's cheaper to do this than to check each iteration's value as equal to the last]
[Taxi can only handle integers up to 2^31-1 so 99 iterations is sufficient.]
99 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.
Pickup a passenger going to The Underground.

[Duplicate stdin to be stored as S at Trunkers and as x0 at Sunny Skies Park]
[a & b are always integers so Trunkers won't hurt S and it's close with a short name so it's good for golfing]
Go to Cyclone:e 1 l 2 r.
Pickup a passenger going to Trunkers.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park:n 1 r.
Go to Trunkers:s 1 l.

[ This is our starting position for square root:           ]
[  • x at Sunny Skies Park                                 ]
[  • S at Trunkers                                         ]
[  • Taxi at Trunkers                                      ]
[  • The iterator as a passenger going to The Underground  ]

[f]

[Duplicate S so we don't lose it]
Pickup a passenger going to Cyclone.
Go to Cyclone:w 2 r.
Pickup a passenger going to Divide and Conquer.
Pickup a passenger going to Trunkers.
Go to Trunkers:s 1 l.

[Diplicate x for division and addition]
Go to Sunny Skies Park:w 1 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:n 1 l.
Pickup a passenger going to Divide and Conquer.

[Gas will be super important in this loop]
Go to Zoom Zoom:n.

[Perform (x + S/x)/2]
[(/2) turns out to be a few bytes shorter than (*.5), mostly due to place names]
Go to Divide and Conquer:w 1 l 2 r 1 r.
Pickup a passenger going to Addition Alley.
Go to Cyclone:e 1 l 1 l 2 l.
Pickup a passenger going to Addition Alley.
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Divide and Conquer.
2 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 3 l 2 r.
Pickup a passenger going to Divide and Conquer.
Go to Divide and Conquer:w 1 r 2 r 1 r 2 l 3 l.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park:e 1 l 1 l 2 l 1 l.
[Now we have the next iteration of x]

[Check the iterator]
Go to The Underground:s 1 l 1 r 2 l.
Switch to plan "g" if no one is waiting.
Pickup a passenger going to The Underground.

[Reset the loop]
Go to Trunkers:s 2 r 1 l.
Switch to plan "f".


[ ADD THE NEGATIVE SUM TO THE SQUARE ROOT TO GET THE NEGATIVE DIFFERENCE ]

[g]
Go to Rob's Rest:n 3 l 2 l 1 l 2 r 1 r.
Pickup a passenger going to What's The Difference.
Go to Sunny Skies Park:s 1 l 1 l.
Pickup a passenger going to What's The Difference.
Go to What's The Difference:n 1 r 1 l.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:e 3 r.
Pickup a passenger going to Post Office.
Go to Post Office:n 1 l 1 r.

1
นี่มันบ้า ...
Gryphon - Reinstate Monica

2
@Gryphon สิ่งที่บ้าคือฉันแน่ใจ 100% ว่าฉันสามารถลบเช่นสองพันไบต์เมื่อฉันทบทวนตรรกะของฉันในขณะที่ฉันไม่ได้ครึ่งหลับ
Stephen

4
4 ชั่วโมงสมควรได้รับ +1 ในตัวมันเอง!
Shaggy

4
ฉันแน่ใจว่าจำนวนนักกอล์ฟที่จะอ่านคำอธิบายทั้งหมดจะเล็กกว่า bytes ของคุณ: D
Grajdeanu Alex

1
+1 สำหรับ-1 is waiting at Starchild Numerology.
Keyu Gan

10

Javascript (ES6), 36 ไบต์

-1 ไบต์ขอบคุณ @dtkaias

(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)

ตัวอย่างข้อมูลโค้ด:

f=

(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)

for(i=0;i<7;i++)
  a=[3,-3,-3,6,42,10,3][i],
  b=[4,4,-4,6,0,10,3][i],
  console.log(`f(${a},${b}) = ${f(a,b)}`)


ES6 **ไม่ได้
Neil

2
รุ่น ES6 จริงอาจจะเป็น 41 (x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y)ไบต์:
Neil

@DanEsparza มันชัดเจนในการใช้ นี่คือประวัติการแก้ไขสำหรับ ...
Neil

ทำไมไม่a=>b=>a+b-Math.hypot(a,b)?
dtkaias

1
ถูกต้อง(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)ขนาด 36 ไบต์ ES6 กันได้ด้วย
dtkaias

8

จูเลีย 20 ไบต์

x->norm(x,1)-norm(x)

ใช้เวลาaและbเป็นรายการ

จูเลียnormค่าเริ่มต้นอาร์กิวเมนต์ที่สอง 2 - norm(x, 1) - norm(x, 2)เพราะฉะนั้นนี้จะเทียบเท่ากับ


ฉันคิดถึงการใช้ Julia ด้วย!
enedil

คำตอบที่คล้ายกันมากกับ MATLAB ฉันกำลังจะโพสต์
TheIncredibleZ1

6

Java 8, 47 ไบต์

แข็งแรงเล่นกอล์ฟ:

(a,b)->(a<0?-a:a)+(b<0?-b:b)-Math.sqrt(a*a+b*b)

นี่เป็นเรื่องพื้นฐานตามที่ได้รับ: ลบค่าที่คำนวณได้สองค่าเพื่อค้นหาความแตกต่าง สิ่งนี้ใช้ตรรกะที่ประกอบไปด้วยแทนที่จะMath.abs()บันทึกหนึ่งไบต์ในแต่ละเหตุการณ์ น่าเสียดายที่จำเป็นต้องใส่วงเล็บเนื่องจากตัวดำเนินการมาก่อน

ผลลัพธ์คือสิ่งที่ Java doubleสามารถถือครองได้ซึ่งมีความถูกต้องมากกว่าทศนิยมสองตำแหน่งและเป็นไปตามข้อกำหนดด้านความแม่นยำของคำถาม

Ungolfed:

public class TheCrowVsTheTaxicab {

  public static void main(String[] args) {
    int[][] inputs = new int[][] { { 3, 4 }, { -3, 4 }, { -3, -4 }, { 6, 6, }, { 42, 0 }, { 10, 10 }, { 3, 3 } };
    double[] outputs = new double[] { 2, 2, 2, 3.51, 0, 5.85, 1.76 };

    for (int i = 0; i < inputs.length; ++i) {
      double actual =
        f((a, b) -> (a < 0 ? -a : a) + (b < 0 ? -b : b) - Math.sqrt(a * a + b * b), inputs[i][0], inputs[i][1]);

      System.out.println("Input:    " + inputs[i][0] + ", " + inputs[i][1]);
      System.out.println("Expected: " + outputs[i]);
      System.out.println("Actual:   " + actual);
      System.out.println();
    }
  }

  private static double f(java.util.function.BiFunction<Integer, Integer, Double> f, int a, int b) {
    return f.apply(a, b);
  }
}

เอาท์พุท:

Input:    3, 4
Expected: 2.0
Actual:   2.0

Input:    -3, 4
Expected: 2.0
Actual:   2.0

Input:    -3, -4
Expected: 2.0
Actual:   2.0

Input:    6, 6
Expected: 3.51
Actual:   3.5147186257614305

Input:    42, 0
Expected: 0.0
Actual:   0.0

Input:    10, 10
Expected: 5.85
Actual:   5.857864376269049

Input:    3, 3
Expected: 1.76
Actual:   1.7573593128807152

1
คุณสามารถใช้ currying a->b->เพื่อประหยัดไบต์:
จา

4

Mathematica ขนาด 32 ไบต์

N[Tr@Abs[a={##1}]-Sqrt@Tr[a^2]]&

หรือ

Mathematica, 31 ไบต์

N[Abs@#+Abs@#2-Sqrt[#^2+#2^2]]&

หรือ @ ไม่แนะนำต้นไม้

Mathematica ขนาด 26 ไบต์

N[Tr@Abs@{##}-Abs[#+I#2]]&

หรือข้อเสนอแนะของ @ alephalpha

Mathematica, 19 ไบต์

N[#~Norm~1-Norm@#]&

เยี่ยมมาก! คุณสามารถบันทึกไม่กี่ไบต์โดยใช้ตัวเลขที่ซับซ้อนสำหรับส่วนยูคลิด:N[Tr@Abs@{##}-Abs[#+I#2]]&
ไม่ใช่ต้นไม้

2
N[#~Norm~1-Norm@#]&.
alephalpha

2
@alephalpha #~Norm~1-N@Norm@#&อาจจะ?
Martin Ender


4

R , 30 ไบต์

function(v)norm(v)-norm(v,'f')

ใช้vเป็นเมทริกซ์ 1 คอลัมน์ normคำนวณบรรทัดฐานเฉพาะของเมทริกซ์โดยค่าเริ่มต้นคือ L1 norm (taxicab) และfL2 norm ( 'f'สำหรับ Frobenius / Euclidean)

ลองออนไลน์!


ว้าว R มีทั้งในตัวดี!
BLT

3

Python 2 , 40 38 ไบต์

-2 ไบต์ขอบคุณ vaultah

สนุกจริงรหัส 11 ไบต์นี้เพิ่งถูกคัดลอกมาจากคำถามและเล่นกอล์ฟ

lambda a,b:abs(a)+abs(b)-(a*a+b*b)**.5

ลองออนไลน์!


1
ฉันเป็นนินจา
นาย Xcoder

@ Mr.Xcoder ฉันไม่ต้องกังวลเกี่ยวกับเรื่องนี้มากเกินไปฉันจะออกไปเล่นกอล์ฟ : P
มนุษย์

@vaultah โอ้จุดดี ขอบคุณ!
สิ้นเชิงมนุษย์

5
abs(a+b*1j)ควรทำงานแทน(a*a+b*b)**.5
SteamyRoot

3

Japt , 11 9 ไบต์

-2 ไบต์ขอบคุณ @ETHproductions

Nxa -MhUV

ลองออนไลน์!

อธิบาย

Nxa -MhUV   // implicit: U and V are input integers, N = [U,V]

N a         // get absolute value of both inputs
 x          // sum those values
    -MhUV   // subtract hypot(U, V) -> sqrt(U^2 + V^2)

ดีฉันคิดว่านี่เป็นครั้งแรกที่ฉันเห็นว่าMhใช้แล้ว ฉันเชื่อว่าคุณสามารถตัดUa +Vaให้สั้นลงNxa(ผลรวมของอินพุตทำงานaบนแต่ละรายการ)
ETHproductions

@ETHproductions โอ้ถูกต้องลืมจำนวนนั้นมีพารามิเตอร์แผนที่เพิ่มเติม ขอบคุณ!
Justin Mariner

ดังนั้นมี * คือ "ใช้สำหรับMh!: D วิธีการส่วนใหญ่ใน Japt สามารถใช้สิ่งที่ @ ETHproductions เรียกว่า" ฟังก์ชั่นอัตโนมัติ "เป็นอาร์กิวเมนต์ดูเคล็ดลับนี้สำหรับพวกเขามากขึ้นและฉันจะเขียนเคล็ดลับในวันพรุ่งนี้ โดยใช้ฟังก์ชั่นอัตโนมัติกับการลดอาร์เรย์เพื่อให้บรรลุผลที่น่าสนใจ (เช่นrwจะกลับเลขที่ใหญ่ที่สุดในอาร์เรย์).
ปุย

@Shaggy ขอบคุณฉันมีความคิดพื้นฐานของ "ฟังก์ชั่นอัตโนมัติ" แต่ไม่ทราบว่ามีโพสต์สำหรับเคล็ดลับ Japt จะมองผ่านโพสต์นั้นแน่นอน
Justin Mariner

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

3

โครงการ - 58 ไบต์

(define (f a b) (-(+(abs a)(abs b))(sqrt(* a a)(* b b))))

3
ยินดีต้อนรับสู่ PPCG!
Martin Ender

คุณสามารถลบสองช่องว่าง - หนึ่งระหว่างdefineและ(และเป็นหนึ่งในระหว่างและ) (
clismique

Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
แอรอน

(lambda(a b)(...))ควรจะเพียงพอแทนที่จะผูกไว้กับชื่อ นอกจากนี้(sqrt(* a a b b))จะบันทึกสองสามไบต์
Daniel Schepler


3

APL (Dyalog)ขนาด 14 ไบต์

รับอาร์กิวเมนต์ในรูปแบบxJyเช่น3J4

||-2+/∘|9 11○⊢

ลองออนไลน์!

| ขนาดของหมอ

| ขนาดของการโต้แย้ง

- ลบ

2+/ ผลรวมคู่ที่ชาญฉลาด

 ของ

| ขนาดของ

9 11.○⊢ การโต้แย้งของจริงและชิ้นส่วนจินตภาพ คุณหมอ

เคล็ดลับพิเศษสำหรับการเล่นกอล์ฟคือการใช้การลดลงของจำนวนคู่ ( 2+/) เพื่อจัดหา+/อาร์กิวเมนต์ที่ไม่มี op ให้เหลือดังนั้นการหลีกเลี่ยงวงเล็บ:||-(+/∘|9 11○⊢)


3

J, 13 ไบต์

+/@:|-+/&.:*:

นี่คือฟังก์ชั่นที่ใช้พิกัดเป็นอาร์เรย์เช่น:

   (+/@:|-+/&.:*:) _3 4
2

คำอธิบาย:

+/             sum
  @:           of
    |          absolutes
     -         minus
      +/       sum
        &.:    under
           *:  square

การใช้งานที่ดีของ&.:- ฉันไม่ได้ตระหนักถึง:ของภายใต้
โยนาห์


2

TI-Basic (TI-84 Plus CE), 10 ไบต์

sum(abs(Ans))-√(sum(Ans2

โปรแกรมที่อินพุตเป็นรายการของจำนวนเต็มสองตัวAnsเช่นการโทรด้วย{3,4}:prgmCROW(แทนที่3,4ด้วยอินพุตและCROWด้วยชื่อของโปรแกรม)

คำอธิบาย:

sum(abs(Ans))-√(sum(Ans2
        Ans               # The input list of two integers
    abs(   )              # Absolute value of each item in the list
sum(        )             # Sum of the list
                    Ans   # The input list of two integers
                       2  # Square of each item in the list
                sum(      # Sum of the list
              √(          # Square root of the sum
             -            # Difference of the two values

ที่ดูเหมือนว่าฉัน 24-26 ไบต์ขึ้นอยู่กับวิธีการและ $ Ans ^ 2 $ จะถูกเข้ารหัส อาจจะมีการกดแป้น 10 ครั้งแต่ก็ไม่เหมือนกัน
Ray

@Ray TI-Basic เป็นภาษา tokenized
pizzapants184

ฉันคุ้นเคยกับ TI-89 Basic เป็นส่วนใหญ่ซึ่งไม่เป็นเช่นนั้น ถอนการคัดค้าน
Ray



2

GNU APL 1.2, 24 ไบต์

∇f P
(+/|P)-(+/P*2)*.5
∇

∇f Pประกาศฟังก์ชั่นfที่ใช้เวกเตอร์Pที่มีระยะทางเป็นอาร์กิวเมนต์ (เช่น[3, 4])

APL ทำงานกับเวกเตอร์ดังนั้นให้+/|Pใช้|โอเปอเรเตอร์ ( absฟังก์ชัน) กับแต่ละองค์ประกอบในเวกเตอร์แล้วประเมินผล+ในแต่ละองค์ประกอบ (ดังนั้นเพิ่มองค์ประกอบทั้งหมด) นี่ทำให้ระยะทางรถแท็กซี่

P*2ให้ผลเวกเตอร์ที่เหมือนกันPแต่กับแต่ละองค์ประกอบกำลังสอง +/P*2เพื่อเพิ่มสิ่งเหล่านั้นเข้าด้วยกันจากนั้น (พร้อมวงเล็บที่มีลำดับความสำคัญเนื่องจาก APL เป็นจากขวาไปซ้าย) *.5เพื่อรับสแควร์รูท นี่จะทำให้ระยะห่างของอีกา

เพิ่มวงเล็บคู่พิเศษสำหรับระยะทางรถแท็กซี่เพื่อนำหน้าและคำนวณความแตกต่าง

เพื่อสิ้นสุดฟังก์ชั่น


1
คุณไม่สามารถใช้แลมบ์ดานิรนามได้หรือไม่? {(+/|⍵)-(+/⍵*2)*.5}?
Adám

@ Adámฉันไม่มีประสบการณ์มากกับ APL และล่าม GNU รุ่นใหม่ล่าสุด (1.7) จะไม่รวบรวมบน Mac ดังนั้นอาจมีข้อ จำกัด บางประการ ฉันจะลองในภายหลังเพื่อดูว่ามันใช้งานได้ ขอบคุณสำหรับทิป.
Arc676

เกือบทุกคุณสมบัติของ GNU APL ยังอยู่ใน Dyalog APL ซึ่งเป็นอิสระที่มีอยู่บน Mac คุณสามารถลองออนไลน์ได้เช่นกัน
อดัม

นอกจากนี้อย่าลังเลที่จะเข้าร่วมห้องแชทของ APLเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ APL
อดัม

2

J , 9 8 ไบต์

-1 ขอบคุณมาร์แชลเพื่อนร่วมงานของฉัน

+&|-|@j.

ลองออนไลน์!

รับAเป็นอาร์กิวเมนต์ด้านซ้ายและBเป็นอาร์กิวเมนต์ด้านขวา

+ ผลรวม

& ของ

| ขนาด

- ลบ

| ขนาด

@ ของ

j.A + B i

เคล็ดลับการเล่นกอล์ฟ: รวมค่าเข้ากับจำนวนเชิงซ้อนเดียวเนื่องจากเส้นทแยงมุมนั้นหาได้ง่ายในขณะที่แยกพวกมันออกจากกันเนื่องจากผลรวมนั้นง่ายที่จะได้รับเช่นนั้น


2

เพิ่ม ++ , 59 57 ไบต์

D,f,@@,|@|+
D,g,@@,d*@d*+
_
$f>G>G
V
$g>?>?
S
-G
$f>x>0
O

ลองออนไลน์!

มันใช้เวลานานในการแก้ปัญหา ไม่ปัดเศษคำตอบสุดท้ายเนื่องจากไม่สามารถทำได้ใน Add ++ นี่คือวิธีที่โปรแกรมทำงานกับอินพุต-3และ-4( ACCคือค่าตัวสะสม)

D,        Define a function
  f,      called f
  @@,     that takes 2 arguments (e.g. -3, -4)
     |    absolute value;   STACK = [-3, 4]
     @    reverse stack;    STACK = [4, -3]
     |    absolute value;   STACK = [4, 3]
     +    sum;              STACK = [7]
          implicitly return the top of the stack

D,        Define a function
  g,      called g
  @@,     that takes 2 arguments (e.g. -3, -4)
     d    duplicate;  STACK = [-3, -4, -4]
     *    multiply;   STACK = [-3, 16]
     @    reverse;    STACK = [16, -3]
     d    duplicate;  STACK = [16, -3, -3]
     *    multiply;   STACK = [16, 9]
     +    sum;        STACK = [25]
          implicitly return the top of the stack

_         store the inputs in the second stack;  ACC = 0;  STACK = [-3, -4]
$f>G>G    apply f with -3 and -4 as arguments;   ACC = 7;  STACK = []
V         store ACC in the stack;                ACC = 7;  STACK = [7]
$g>?>?    apply g with -3 and -4 as arguments;   ACC = 25; STACK = [7]
S         square root the ACC;                   ACC = 5;  STACK = [7]
-G        subtract the stack value from the ACC; ACC = -2; STACK = []
$f>x>0    apply f with ACC and 0 as arguments;   ACC = 2;  STACK = []
O         output ACC as a number


1

Excel VBA ขนาด 34 ไบต์

ฟังก์ชั่นหน้าต่างแบบไม่ระบุชื่อ VBE แบบทันทีที่รับอินพุตจากช่วง[A1:B1]และแสดงความแตกต่างระหว่างยูคลิดและระยะทาง Taxicab กับหน้าต่างทันที VBE

?[ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)]

1
สั้นลงสองไบต์เพื่อใส่ลงในเซลล์โดยตรงในแผ่นงาน:=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
วิศวกร Toast

@EngineerToast ฉันคิดว่าฉันได้วาง Google ชีต / Excel Solutions แล้ว - ขอบคุณที่ชี้ให้เห็น
Taylor Scott





1

Ruby (2.0.0 - 2.3.0), 57bytes

x,y=$*.map(&:to_i);puts x.abs+y.abs-Math.sqrt(x**2+y**2)

สิ่งนี้จะถือว่ารับข้อมูลจาก ARGV เช่น

ruby -e 'x,y=$*.map(&:to_i);puts x.abs+y.abs-Math.sqrt(x**2+y**2)' -- -3 4

มันให้ความรู้สึกเหมือนโกงเพราะ Ruby มาพร้อมกับ lib คณิตศาสตร์ที่มีฟังก์ชั่น abs และ sqrt (ต่างจากคนที่เขียนฟังก์ชัน abs และ sqrt ของเขาเอง

เคล็ดลับแรกคือการใช้.mapแทนการ.eachบันทึกไบต์จากนั้นใช้&:symbolสัญกรณ์เพื่อส่งแผนที่ proc ที่เราดำเนินการto_iกับแต่ละรายการในอาร์เรย์และใช้การกำหนดหลายรายการเพื่อกำหนดค่าให้กับ x และ y

รุ่นที่ยาวกว่าจะเป็น:

(x, y) = ARGV.map{ |string| string.to_i }

(เนื่องจาก map ส่งคืนอาร์เรย์การกำหนดหลายอย่างอาจเป็นวิธีที่ทำได้สิ่งนี้จะทำให้พารามิเตอร์เพิ่มเติมหายไป แต่เราสมมติว่ามีเพียงสองอินพุตเท่านั้น)

จากนั้นฉันก็ลบช่องว่างทั้งหมดในสมการ

นี่คือรุ่นที่ยาวกว่า 84 ไบต์

$*.map!(&:to_i);puts$*.inject(0){|x,y|x+y.abs}-Math.sqrt($*.inject(0){|x,y|x+y**2})

เป้าหมายที่นี่คือการไม่ทำซ้ำตัวเองเช่นต้องเขียนxหรือabsสองครั้งและกำลังสองของฉันx**2 + y**2

มันไม่ได้ผล.

แต่สิ่งที่น่าสนใจคือสิ่งที่ทำให้ไม่ต้องใช้พื้นที่ฉันเดาว่า lexer ฉลาดพอที่จะเห็นถ่านชนิดพิเศษและรู้ว่ามันเป็นตัวแปรพิเศษ

injectและreduceคำพ้องความหมาย inject มีลายเซ็นของ

inject(initial) {| memo, obj | block }

ในกรณีของเราเราต้องตั้งค่าเริ่มต้นเป็น 0 จากนั้นเรามีตัวสะสมของเรา (เช่น: memo = 0) และวัตถุจากการวนซ้ำแต่ละครั้ง

ด้านลงของวิธีนี้คือมันจะใช้เวลามากกว่าสองอินพุตและจะรวมหรือสี่เหลี่ยมเพิ่มจากนั้น sqrt ค่าทั้งหมดในอาร์เรย์

ฉันคิดว่า -แม้ว่าฉันจะไม่มี Ruby 2.4.0 ที่จะทดสอบด้วย - ว่ามันจะทำงานได้ดีเช่นกันซึ่งมีขนาด 72 ไบต์:

$*.map!(&:to_i);puts$*.sub{|x,y|x+y.abs}-Math.sqrt($*.sum{|x,y|x+y**2})

ผลรวมเริ่มต้นที่ 0 และเท่าที่ฉันสามารถบอกได้ผลเช่นเดียวกับการฉีด / ลด


เหตุผลเดียวที่เขาไม่ได้ใช้บิวอินคือเพราะภาษานั้นไม่มีให้ใช้ คำตอบที่ดีและยินดีต้อนรับสู่ PPCG! :)
Conor O'Brien

ยินดีต้อนรับสู่ PPCG! TIO Portal มี Ruby 2.4.0 ที่ใช้งานได้ซึ่งคุณสามารถใช้เพื่อทดลองใช้ทางออนไลน์ ลองที่นี่
Value Ink

การใช้ประโยชน์จากความยืดหยุ่นฉัน / o ความต้องการของคุณสามารถหลีกเลี่ยงการแยกและการทำให้ไอเอ็นจี, การเล่นกอล์ฟลงไปแลมบ์ดา 35 ไบต์
benj2240

1

Google ชีตขนาด 31 ไบต์

ฟังก์ชั่นแผ่นงานที่รับอินพุตจากช่วง[A1:B1]และเอาท์พุทความแตกต่างระหว่างยุคลิดและระยะทาง Taxicab

=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2

Excel, 32 ไบต์

เหมือนกับด้านบน แต่ได้รับการจัดรูปแบบสำหรับ MS Excel

=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)

1

Pyth , 7 ไบต์

a.aQsa0

ลองที่นี่


Pyth ,  25  23 ไบต์

นี่เป็นวิธีแก้ปัญหาเบื้องต้นนั่นคือวิธีแก้ปัญหาแบบ Pyth แรกที่ไม่น่าสนใจและคุณจะเห็นได้ว่าฉันเคยเล่นกอล์ฟใน Pyth ที่แย่แค่ไหน :)

K.aswJ.asw-+KJ^+^K2^J2 .5

ลองออนไลน์!


0

Pip 15 ไบต์

ABa+ABb-RT$+g*g

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง ลองออนไลน์!

คำอธิบาย

ใน pseudocode abs(a) + abs(b) - sqrt(fold+(g*g))นี้เป็น aและbเป็นสอง cmdline args แรกและgเป็นรายการของ cmdline args (เช่น argv) *ประกอบเวกเตอร์เช่นเดียวกับผู้ประกอบการ Pip จำนวนมากจึงเป็นสิ่งเดียวกับ$+g*g a*a + b*bที่เหลือค่อนข้างตรงไปตรงมา

น่าเสียดายที่ฉันไม่สามารถบันทึกไบต์ใด ๆ$+ABgได้เนื่องจากความสำคัญของโอเปอเรเตอร์ที่มีการปิดตายังไม่ได้ผลเหมือนที่ควร $+ควรจะมีความสำคัญสูงกว่าระบบเลขฐานสองเล็กน้อย-แต่ในขณะนี้มันจะแยกวิเคราะห์ว่าเป็น$+(ABg-RT$+g*g)คำตอบที่ผิด การทำเช่น($+ABg)-RT$+g*gนี้จะไม่บันทึกไบต์ใด ๆ ในเวอร์ชันที่ไม่ยุ่งยากด้านบน

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