분기하지 않고 최대 3 개의 숫자 찾기


17

이번 목표는 분기 또는 루프를 사용하지 않고 최대 3 개의 정수 (이진수 2의 보수에서-(2 ^ 31)에서 2 ^ 31-1)를 찾는 것입니다.

당신이하는 경우에만 사용할 수

  • 불평등 / 평등 ( ==, >, >=, <, <=, !=) 등이 수를 2 개 토큰.

  • 산술 ( +, -, *, /)

  • 논리 연산자 ( !하지, &&및, || 또는)

  • 비트 연산자 ( ~하지, &그리고, |또는, ^XOR, <<, >>, >>>산술 및 논리 좌우 이동)

  • 상수. 토큰 0 개

  • 변수 할당. 토큰 0 개

a, b및 로 3 개의 변수를 입력하십시오 c. 최대 수를 출력합니다.

표준 원자 코드 골프 규칙이 적용됩니다. 질문이 있으시면 의견에 남겨주십시오. 하나의 토큰은 위의 규칙 중 하나입니다.


추가 기능을 정의하는 것은 어떻습니까? 이것이 허용된다면, 몇 개의 토큰으로 간주됩니까?
어리석은

@voidpigeon 3 개의 입력과 출력을 취하는 하나의 기능 만 가질 수 있습니다.
qwr

1
언뜻보기에 나는 " 우리는 전에 이것을 가지고있다 " 고 생각했지만, 2를 소비하는 비교기가 게임을 약간 변경한다고 생각합니다.
primo

@primo 실제로 몇 가지 흥미로운 개선이 가능하기 때문에 3 개의 입력을 요청했습니다
qwr

2
내장 함수를 사용할 수 있습니까?
등록 된 사용자

답변:


7

자바 스크립트 10 토큰

주석에서 지적했듯이 비트 피들 링 대신 <및 *를 사용하여 편집 -비트 작동이 범위 제한 (30 비트 초과) 근처에서 입력에 실패 할 수 있음

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

C 8 토큰

언어에 구애받지 않는 언어는 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 사용하면 int코드가 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 바로 가기 평가를 브랜칭 유형으로
보지만

11
나는 하하, 분기로 이것을 고려할 것
justhalf

2
@ edc65입니다. 허용 &&하고 ||감독했을 가능성이 있으며, 이는 악용되기보다는 지적되어야합니다.
primo 2016 년

@primo 이것은 흥미로운 문제였습니다. 일부 CISC 아키텍처에는 조건문이 포함 된 지침이 있으므로 그 계산 방법을 잘 모르겠습니다.
qwr

2
나는 4 개 토큰 2, 즉해야 추측 &&, <그리고 >. 는 =0으로 할당하고 카운트로 사용됩니다
클라이드 로보

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 아. Well +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
폭동

당신은 의견을 attutually 읽었습니까? 20 억이 0보다 크다고 생각합니다. [ ideone.com/vlcnq9 ]
edc65

아 알 겠어. 예, 0이 관련되면 다른 주석의 숫자에 문제가 있습니다. 그러나 당신이 말한대로 2 ^ 30은 아닙니다. ideone.com/LicmXa
폭동

0이 아닙니다. 문제는 큰 숫자와 오버플로입니다. max (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

다음과 같은 가정이 있습니다.

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

  • 최대 (a; b; c) = max (max (a; b); c)

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

우리는 의사 코드를 사용할 수 있습니다 :

함수 최대 (a, b, c)

{

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

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

반품 2

}


실제 코드를 작성하고 답변에 토큰 수를 제공하십시오.
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

자바 스크립트 8 토큰

@openorclose의 답변과 비슷하지만 실제로 할당 자체에 논리 연산자를 사용합니다.

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

깡깡이


0

R (10 개 토큰)

function max(a, b, c) {
  max <- a
  max <- max + (b - max) * (b > max)
  max <- max + (c - max) * (c > max)
  return(max)
}

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  

이것이 분기하지 않는지 확실하지 않습니다.


인라인으로 만 분기됩니다. 특히, 유비쿼터스 삼항 연산자 (본질적으로)는 허용되는 작업 중 하나가 아닙니다.
04 초에 tomsmed

@tomsmeding에게 감사드립니다. 유비쿼터스 삼항 연산자가 무엇인지 물어볼 수 있습니까 (내 코드에서 IIF ()입니까?)
Alex

예, 유비쿼터스로 유감스럽게도 거의 모든 언어로 존재하며 삼항 연산자는 IIf, Inline-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.