ค้นหาตัวเลขสูงสุด 3 หมายเลขโดยไม่ต้องแยกสาขา


17

คราวนี้เป้าหมายของคุณคือการหาจำนวนเต็ม 3 จำนวน (จาก - (2 ^ 31) ถึง 2 ^ 31 - 1 ในส่วนเสริมของไบนารี 2) โดยไม่ต้องใช้การแยกหรือลูป

คุณได้รับอนุญาตให้ใช้เท่านั้น

  • ความไม่เท่าเทียมกัน / ความเท่าเทียมกัน ( ==, >, >=, <, <=, !=) นับเหล่านี้เป็น2ราชสกุล

  • เลขคณิต ( +, -, *, /)

  • ผู้ประกอบการเชิงตรรกะ ( !ไม่ใช่, &&และ, || หรือ)

  • Bitwise ผู้ประกอบการ ( ~ไม่&และ|หรือ^แฮคเกอร์, <<, >>, >>>คณิตศาสตร์และตรรกะซ้ายกะขวา)

  • ค่าคงที่ 0 โทเค็น

  • การมอบหมายตัวแปร 0 โทเค็น

อินพุต 3 ตัวแปรเป็นa, และb cส่งออกจำนวนสูงสุด

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


แล้วการกำหนดฟังก์ชั่นพิเศษล่ะ? หากได้รับอนุญาตจะมีการนับโทเค็นเป็นจำนวนเท่าใด
ชัดเจน

@voidpigeon คุณได้รับอนุญาตให้มีเพียงหนึ่งฟังก์ชั่นหนึ่งฟังก์ชั่นที่ใช้ทั้ง 3 อินพุทและเอาท์พุท
qwr

1
ฉันคิดว่า" เราเคยทำแบบนี้มาก่อน "แต่ฉันคิดว่าตัวเปรียบเทียบที่มีราคา 2 เปลี่ยนแปลงเกมค่อนข้างน้อย
โม่

@primo ฉันขอเฉพาะ 3 อินพุตเพราะจริง ๆ แล้วมันช่วยให้มีการปรับปรุงที่น่าสนใจ
qwr

2
เราสามารถใช้ฟังก์ชั่น inbuilt ได้หรือไม่?
ผู้ใช้ที่ลงทะเบียน

คำตอบ:


7

โทเค็น Javascript 10

แก้ไขโดยใช้ <และ * แทนการเล่นบิต - ตามที่ระบุไว้ในความคิดเห็นการทำงานของบิตอาจล้มเหลวสำหรับอินพุตใกล้ช่วง จำกัด (มากกว่า 30 บิต)

function Max(x,y,z)
{
  var d=y-x;
  x=y-d*(d<0);
  d=x-z;
  return x-d*(d<0);
}

โทเค็น 8 C

ผู้ไม่เชื่อเรื่องภาษาในความเป็นจริงภาษา C ใด ๆ จะทำ ในการเป็นคนจู้จี้จุกจิกในมาตรฐาน C มันไม่สามารถพกพาได้เพราะการเปลี่ยนที่ถูกต้องอาจไม่ขยายเครื่องหมาย

ใน C (และ C ++, C #, และ Java ฉันคิดว่า) เราสามารถจัดการปัญหาล้นได้อย่างง่ายดายโดยใช้ค่าชั่วคราวที่ใหญ่กว่า:

int Max(int x, int y, int z)
{
    long long X = x;
    long long Y = y;
    long long Z = z;
    long long D = Y-X;
    X=Y-((D>>63)&D);
    D=X-Z;
    return (int) (X-((D>>63)&D));
}

1
ฉันกำลังจู้จี้จุกจิก แต่การใช้ C ints รหัสของคุณใช้ไม่ได้กับ x = 2147483647, y = -2, z = 0 ตัวเลือกของคุณหากคุณต้องการเปลี่ยน
qwr

10

จาวาสคริ

6 โทเค็น

function maxOf3(a, b, c) {
    (b>a) && (a=b);
    (c>a) && (a=c);
    return a;
}

6
+1 ฉันเห็นการประเมินทางลัดเป็นประเภทของการแยกทาง แต่ไม่ได้รับอนุญาตในกฎ
edc65

11
ฉันจะพิจารณาเรื่องนี้ว่าจะแตกกิ่งฮ่าฮ่า
justhalf

2
@ edc65 มันเป็น อนุญาต&&และ||มีแนวโน้มว่าจะมีการกำกับดูแลซึ่งควรชี้ให้เห็นมากกว่าการใช้ประโยชน์
โม่

@primo นี่เป็นปัญหาที่น่าสนใจ ฉันเชื่อว่าสถาปัตยกรรม CISC บางแห่งมีคำแนะนำซึ่งรวมถึงข้อความแสดงเงื่อนไขดังนั้นฉันไม่แน่ใจว่าจะนับรวมอย่างไร
qwr

2
ผมคิดว่ามันควรจะ 4 ราชสกุลคือ 2 &&, และ< ใช้เป็นที่ได้รับมอบหมายและนับเป็น 0>=
ไคลด์ Lobo

6

C: 10 โทเค็น

int max(int a, int b, int c)
{
    a += (b > a) * (b - a);
    a += (c > a) * (c - a);
    return a;
}

แรงบันดาลใจจากคำตอบของ @ openorclose แต่เปลี่ยนเป็น C และทำให้ไม่มีสาขาโดยใช้การคูณมากกว่าตัวดำเนินการบูลีนลัดวงจร


3

จาวาสคริ

14 โทเค็น

function max (a, b, c)
{
    var ab = (a >= b) * a + (a < b) * b;
    return (ab >= c) * ab + (ab < c) * c;
}

1
คุณไม่ได้รับอนุญาตให้สร้างฟังก์ชั่นใหม่
qwr

:( 14 โทเค็นแล้ว
Fabricio

2

หลายภาษา (Python) (10 โทเค็น)

def max3(x,y,z):
    m = x ^ ((x ^ y) & -(x < y))
    return m ^ ((m ^ z) & -(m < z))

print max3(-1,-2,-3) # -1
print max3(-1,2,10) # 10

https://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax

โอ้มีคนโพสต์แล้ว :)


คุณไม่ได้รับอนุญาตให้สร้างฟังก์ชั่นใหม่
qwr

อ่าโอเค! ไม่ได้อ่านความคิดเห็น :)
Mardoxx

@qwr ฉันไม่เข้าใจคุณพูดว่า: You are only allowed to have one function, the one that takes the 3 inputs and outputs.นั่นคือสิ่งที่คำตอบนี้มี ภาพพิมพ์ 2 ภาพเป็นเพียงกรณีทดสอบ
Cruncher

1
@Cruncher ฉันแก้ไขคำตอบที่ผมทำmax2(max2(x,y),z)ครั้งแรก :)
Mardoxx

@Mardoxx ah ดี +1
Cruncher

1

C ++ 11: 15 โทเค็น

การใช้ตัวดำเนินการทางคณิตศาสตร์และตัวประมวลผลระดับบิตเท่านั้น (เนื่องจากตัวดำเนินการเชิงตรรกะและตรรกะแบบบูลทำให้มันง่ายเกินไป) ...

#include <iostream>

auto max(int32_t a, int32_t b, int32_t c)->int32_t {
  return c - ((c - (a - ((a - b) & (a - b) >> 31))) & (c - (a - ((a - b) & (a - b) >> 31))) >> 31);
}

auto main()->int {
  // test harness
  std::cout << max(9, 38, 7) << std::endl;
  return EXIT_SUCCESS;
}

ล้มเหลวสำหรับจำนวนมาก (> 2 ^ 30) ดูความคิดเห็นcodegolf.stackexchange.com/questions/32476/#comment68870_32477
edc65

ดูดีสำหรับฉัน: ideone.com/pEsvG3
จลาจล

คุณอ่านความคิดเห็นจริงหรือไม่? ฉันคิดว่า 2billions มากกว่า 0 [ ideone.com/vlcnq9 ]
edc65

อ่าฉันเห็น ใช่มันมีปัญหากับตัวเลขเหล่านั้นในความคิดเห็นอื่นของคุณเมื่อมีส่วนเกี่ยวข้อง 0 แต่ไม่ใช่สำหรับ 2 ^ 30 อย่างที่คุณพูด ideone.com/LicmXa
จลาจล

มันไม่เกี่ยวข้องกับ 0 ปัญหาคือจำนวนมากและมากเกินลองสูงสุด (2000000000, -200000000, 1111111111)
edc65

0

J (ไม่แข่งขัน)

ฉันแค่สงสัยว่าการแก้ปัญหาใน J จะเป็นอย่างไร สิ่งนี้ใช้ a ,และ a #ดังนั้นจึงไม่สามารถแข่งขันได้

((a<b),(b<c),(c<a))#b,c,a

สิ่งนี้จะแข่งขันกัน แต่มันยาวเกินไปกับ 9 โทเค็น:

(b*a<:b)+(c*b<c)+(a*c<a)

0

เรามีสมมติฐานดังต่อไปนี้:

  • max (a; b) = (a + b + | ab |) / 2

  • สูงสุด (กขค) = max (สูงสุด (กข) c)

  • abs (a) = (a + (a >> 31)) ^ (a >> 31)

เราสามารถใช้รหัสหลอก:

ฟังก์ชั่นสูงสุด (a, b, c)

{

out1 = ((+ a) + ((ab) + (ab) >> 31)) ^ ((ab) >> 31))) div 2

out2 = ((out1 + c) + ((out1-c) + ((out1-c) >> 31)) ^ ((out1-c) >> 31)) div 2

ผลตอบแทน out2

}


โปรดเขียนรหัสจริงและระบุจำนวนโทเค็นในคำตอบของคุณ
ProgramFOX

0

C # (ลองครั้งที่ 2)

เข้าใจแล้ว ... ไม่มีฟังก์ชั่นรวม ...

แต่จะอนุญาตให้ใช้ประเภทข้อมูลอื่น ๆ หรือเพียงแค่ int ธรรมดา? หากได้รับอนุญาตฉันจะเสนอ:

int foo2(int a, int b, int c)
{
   var x = new SortedList<int,int>();

   x[a] = 1;
   x[b] = 1;
   x[c] = 1;

   return x.Keys[2];
}

0

javascript 8 โทเค็น

แม้ว่าจะคล้ายกับคำตอบของ @ openorclose แต่ฉันใช้ตัวดำเนินการเชิงตรรกะสำหรับการกำหนดเอง

function max( a, b, c ) {
    x=( a > b && a) || b;
    return ( x > c && x ) || c;
}

ซอ



0

Brainfuck (ไม่แข่งขัน)

>,[-<+>>>+<<]>,[-<+>>>+<<]>[>[-<->>]<<]<[-]>[-]>[-]<<<[->>>>+<<<<]>>>>[-<+>>>+<<]>,[-<+>>>+<<]>[>[-<->>]<<]<<

0

TIS-100, 8 การปฏิบัติการ

MOV ACC UP #A
SUB UP     #B
SUB 999
ADD 999
ADD UP     #B
SUB UP     #C
SUB 999
ADD 999
ADD UP     #C
MOV ACC DOWN

ผู้ให้บริการ (UP) ทำ MOV เท่านั้นดังนั้นจึงไม่แสดงในรหัสอาจไม่ทำงานเมื่อใกล้กับขอบ 999 มากเกินไป


-1

VBA (6 โทเค็น)

 Function max3(a As Integer, b As Integer, c As Integer)
 i = IIf(a >= b And a >= c, a, IIf(b >= c, b, c))
 max3 = i
 End Function  

ไม่แน่ใจว่านี่ไม่ใช่การแยกหรือไม่


มันแตกแขนงแบบอินไลน์เท่านั้น โดยเฉพาะผู้ประกอบการที่ประกอบไปด้วยแพร่หลาย (ซึ่งนี่คือหลัก) ไม่ใช่หนึ่งในการดำเนินการที่ได้รับอนุญาต
tomsmeding

ขอบคุณ @tomsmeding ฉันขอถามผู้ประกอบการประกอบไปด้วยแพร่หลาย (คือ IIF () ในรหัสของฉันได้อย่างไร)
Alex

ใช่ขอโทษด้วยแพร่หลายฉันหมายความว่ามันมีอยู่ในเกือบทุกภาษาและผู้ประกอบการที่สามคือIIfInline-If ของคุณ ตัวอย่างเช่นในภาษาส่วนใหญ่a>=b ? a : bนั้น มันแตกแขนงแน่นอน
tomsmeding

-1

JavaScript: 4 โทเค็น (** ขึ้นอยู่กับการตีความแบบกว้างของ "การมอบหมาย"!)

เห็นได้ชัดว่าคะแนน 4 ของฉันใจกว้างมาก / ผ่อนปรน!

เพื่อให้ได้คะแนนนั้นฉันได้สันนิษฐานว่า "การมอบหมาย" (มูลค่า 0 โทเค็นในคำถาม) รวมถึงสิ่งต่าง ๆ เช่นการมอบหมายเพิ่มเติมการมอบหมายการลบการมอบหมายการคูณและการมอบหมาย XOR-ing ( ^=)

function f(a, b, c) {
  d = a;
  d -= b;
  d = d >= 0;

  a *= d;  //a = a if (a>=b), else 0
  d ^= true; //invert d
  b *= d;  //b = b if (b<a), else 0

  a += b;  //a is now max(a,b)

  d = a;
  d -= c;
  d = d >= 0;

  a *= d;  //a = a if (a>=c), else 0
  d ^= true; //invert d
  c *= d;  //c = c if (c<a), else 0
  a += c;  //a is now max(max(a,b),c)

  return a;
}

หากการมอบหมายเหล่านั้นจริงนับคะแนนคือ 14 :)


เพราะd -= bจริง ๆ แล้วd = d - bฉันจะบอกว่าคุณใช้เลขคณิตและคุณควรนับสิ่งนี้เป็นโทเค็น
ProgramFOX

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