정수를 3으로 나눌 수 있는지 확인


20

목표는 조건을 사용하지 않고 숫자를 3으로 나눌 수 있는지 확인하는 것입니다. 입력은 0에서 255 사이의 부호없는 8 비트 숫자가됩니다. 창의성이 권장됩니다!

당신은 오직 사용할 수 있습니다

  • 평등 / 불평등 ( ==, !=, >, <, >=, <=)

  • 산술 ( +, -, x)

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

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

  • 상수 (이 작게 유지하면 더 좋을 것입니다)

  • 변수 할당

0거짓이면 출력 , 1참이면 출력 .

표준 원자 코드 골프 규칙이 적용됩니다. 질문이 있으시면 의견에 남겨주십시오. 여기에 예제 방법이 있습니다 . 토큰은 상수와 변수를 제외한 위의 것 중 하나입니다.


@GregHewgill 내 오타는 8 비트 여야합니다.
qwr

2
위의 연산자 만 사용할 수 있습니까? 그렇지 않으면 모듈로가이 방법을 너무 쉽게 만들 수 있습니다.
Jwosty

또한 테이블 조회는 어떻습니까?
Greg Hewgill

3
조건부없이 의미를 명확하게 설명 할 수 있습니까? IF 문으로 제한됩니까, 아니면 루프와 같은 것에 적용됩니까?
Ruslan

1
@Ruslan 당신은 위의 사용 만 허용됩니다.
qwr

답변:


31

C-2 토큰

int div3(int x) {
    return x * 0xAAAAAAAB <= x;
}

2 31 -1 까지 작동하는 것 같습니다 .

zalgo("nhahtdh")곱셈의 역 아이디어 에 대한 크레딧 .


1
+1. <=작동 방식 에 대해 약간 당황했으며 0xAAAAAAAB가 unsigned int유형 으로 간주 되므로 곱셈의 결과는 부호가 없습니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@DigitalTrauma 불평등 운영자는 금지되어 있지 않습니다.
aditsu

트윗 담아 가기 가끔 더 자세히 읽어야합니다! 좋은 답변 +1!
디지털 외상

@aditsu, 죄송합니다, 멍청한 놈, 이것이 정확히 어떻게 작동합니까?
Kartik_Koro

2
오버플로로 인해 @Kartik_Koro 0xAAAAAAAB * 3 == 1이므로 모든 int x의 경우 x * 0xAAAAAAAB * 3 == x입니다. 또한 y * 3은 다른 y에 대해 다른 값을 가지므로 y = x * 0xAAAAAAAB는 y * 3 == x와 같은 유일한 y 여야합니다. x가 3의 배수이면 y는 x / 3이어야하고, 그렇지 않으면 오버플로를 통해 작동해야합니다. 확인하는 간단한 방법은 y를 x와 비교하는 것입니다. 또한 en.wikipedia.org/wiki/Modular_multiplicative_inverse
aditsu

17

파이썬, 3 2 토큰

무차별 대입 솔루션이지만 작동합니다.

0x9249249249249249249249249249249249249249249249249249249249249249>>x&1

1 토큰 감소에 대한 Howard에게 감사드립니다.


와우! 귀하의 솔루션은 아마도 가장 짧은 것 (3 토큰)이지만 다른 답변도 격려하고 싶습니다.
qwr

11
2 가지 토큰 솔루션도 있습니다 : 0x9......>>x&1.
Howard

6

C- 5 4 (?) 토큰

int div3_m2(uint32_t n) {
    return n == 3 * (n * 0xAAAAAAABull >> 33);
}

작동 어떤 부호없는 32 비트 숫자 .

이 코드는 나누기 연산을 곱셈 연산으로 변환하기 위해 제수 의 곱셈 역 모듈로 2 32 를 사용합니다.

편집하다

내 솔루션 (2 분 후에 게시 됨)은 aditsu의 솔루션과 같은 정신을 가지고 있습니다. 그 사용에 대한 크레딧 ==은 내 솔루션을 1 토큰 향상시킵니다.

참고


1
이것은 믿기 힘든 일이야. 나는 유명한 역 제곱근 트릭의 마법 수에 대해 알고 있었지만 임의의 제수에 사용될 수 있다는 것을 몰랐습니다. 이것은 Bull: P
qwr

예, 0xAAAAAAAB = (2 ^ 33 + 1) / 3 및 171 = (2 ^ 9 + 1) / 3입니다. 트릭을 수행하는 가장 작은 상수를 선택했습니다. 흠, 실제로 그것은 86 = (2 ^ 8 + 2) / 3와 함께 작동하는 것 같습니다
aditsu

쥐, 심지어 43 = (2 ^ 7 + 1) / 3도 작동합니다. 지금 편집했습니다.
aditsu

4

C-15 (?) 토큰

int div3_m1(unsigned int n) {
    n = (n & 0xf) + (n >> 4);
    n = (n & 0x3) + (n >> 2);
    n = (n & 0x3) + (n >> 2);
    return n == 0 || n == 3;
}

4 ≡ 1 (mod 3)이므로 4 n ≡ 1 (mod 3)이 있습니다. 자릿수 합산 규칙은 자릿수 합산에 국한되지 않고 임의로 숫자를 자릿수로 나누고 합치를 유지하면서 모든 숫자를 합칠 수 있습니다.

밑 10의 예, 제수 = 9

1234 ≡ 12 + 34 ≡ 1 + 2 + 3 + 4 ≡ 123 + 4 ≡ 1 (mod 9)

프로그램의 모든 문장은이 속성을 사용합니다. 그것은 실제로 문 실행 루프를 단순화 할 수 있습니다 n = (n & 0x3) + (n >> 2);때까지를 n < 4문은 단순히 최하위 자리에서베이스 4 수를 중단하고이 개 부분을 추가하기 때문에.


+1 : 흥미롭게도 이것은 최대 512까지 (실제로 n = 590) 작동하지만, 왜 그런지 잘 모르겠습니다.
Paul R

@PaulR : 캐리로 인해 더 큰 숫자에는 작동하지 않습니다 (계산에 더하기를 사용했습니다). 또한 반복되는 줄에 유의하십시오.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

예, 왜 9 비트 값에서만 작동하는지 잘 모르겠습니다 .8 비트 만 테스트하는 것 같습니다.
Paul R

첫 번째 덧셈 후 9 비트 숫자의 경우 최대 5 비트가되고, 첫 번째 덧셈 후 n = (n & 0x3) + (n >> 2);결과는 3 비트로 감소하고 반복으로 인해 2 비트 만 남게 됨 stackoverflow.com/a/3421654/995714
phuclv

1
오 실수 했어 5 비트 숫자 + 4 비트 숫자는 6 비트 숫자가 될 수 있습니다. 그러나 n <= 588 인 경우 해당 6 비트 숫자의 상위 4 비트와 하위 2 비트를 더하면 4 비트 합만 생성됩니다. 다시 추가하면 2 비트 숫자가됩니다. 589와 590의 결과는 마지막 합계에서 3 비트이지만 결과적으로 3으로 나눌 수 없으므로 결과는 정확합니다.
phuclv

2

파이썬 (토큰 2 개?)

1&66166908135609254527754848576393090201868562666080322308261476575950359794249L>>x

또는

1&0x9249249249249249249249249249249249249249249249249249249249249249L>>x

또는

1&0b1001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001>>x

2
Howard의 의견 중복
aditsu

@aditsu ... 좋은 생각이 같아? 나는 이것을 게시하기 전에 나는 그것을 보지 못했다고 맹세한다.
ɐɔıʇǝɥʇuʎs

2

자바 스크립트-3 개의 토큰

function div3(n) {
    var a = n * 0.3333333333333333;
    return (a | 0) == a;
}

이것은 비트 연산자를 숫자로 사용하면 JavaScript에서 정수로 자른다는 사실을 남용합니다.


: 4 개 토큰이어야한다 =, *, |,==
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

1
변수 할당이 토큰으로 간주되지 않는다고 생각합니다.
Tyilo

1

C-4 토큰

int div3(int x) {
    return ((x * 43) >> 7) * 3 == x;
}

383까지 작동합니다.

이전 버전 (더 큰 상수) :

int div3(int x) {
    return ((x * 171) >> 9) * 3 == x;
}

1535까지 작동


1

bash – ???

이 점수를 얻는 방법을 모르겠습니다.

seq 0 85 | awk '{print $1 * 3}' | grep -w [number] | wc -l

예 :

$ seq 0 85 | awk '{print $1 * 3}' | grep -w 11 | wc -l
0

$ seq 0 85 | awk '{print $1 * 3}' | grep -w 12 | wc -l
1

$seq 0 85 | awk '{print $1 * 3}' | grep -w 254 | wc -l
0

$seq 0 85 | awk '{print $1 * 3}' | grep -w 255 | wc -l
1

1

Befunge 93-5 토큰

고정-나누기가 제거되었습니다.

v      @._1.@
         \   
         0   
         +   
         3   
>&>3-:0\`|   
  ^      <   

입력을 받고 0보다 작을 때까지 3을 계속 빼고 포인터를 위로 향하게하고 ( '|') 3을 더합니다. 값이 0이면 포인터가 오른쪽으로 이동하고 ( " 1. @"출력 '1') 그렇지 않으면 왼쪽으로 이동합니다 ( "@. "는 '0'을 출력합니다). '@'은 프로그램을 종료합니다.


1

배치-7 토큰

나는 생각한다

@echo off
for /L %%a in (0,3,%1) do set a=%%a
if %a%==%1 echo 1

1주어진 숫자 (stdin로)를 3으로 나눌 수 있는지 여부를 반환 합니다.


루프가 허용됩니까?
sergiol

1

루비, 6 (?) 토큰

토큰을 계산하는 방법을 잘 모르겠습니다. OP, 당신은 저를 득점 할 수 있습니까?

나는 그것이 6 생각 ... 1, 0, 0, *, 255,x

(가) 있습니다 *곱셈 정수가 아닙니다.

def div3(x)
  ([1,0,0]*255)[x]
end

OP의 의미에서 토큰이 질문에 나열된 위의 것 중 하나가 아닙니까?
C5H8NNaO4 2016 년

@ C5H8NNaO4 그래서 무엇? 0?
찰스

상수에 대해 @ C5H8NNaO4가 4일까요?
찰스

1

파이썬 0

eariler를 게시했지만 조건을 사용했습니다. 조건부와 토큰을 사용하지 않고 키워드 만 사용합니다.

def g(x): return ([[lambda : g(sum(int(y) for y in list(str(x)))),lambda: 0][[False,True].index(x in[0,1,2,4,5,7,8])], lambda: 1][[False,True].index((lambda y: y in[3,6,9])(x))])()

3의 배수에 3을 더하는 숫자가 있다는 트릭을 사용합니다.

편집 : 불필요한 람다 제거

def g(x):return([[lambda: g(sum(int(y) for y in list(str(x)))),lambda:0][[False,True].index(x in[0,1,2,4,5,7,8])], lambda:1][[False,True].index(x in[3,6,9])])()

편집 : 추가 골프 (117 자) 여전히 토큰 없음

exec"g=`x:(((`:g(sum(int(y)for y in str(x)),`:0)[x in[0,1,2,4,5,7,8]],`:1)[x in[3,6,9]])()".replace('`','lambda ')

132 자에서 Python의 멋진 getitem에 대한 직접 액세스 권한이 중단 되었습니다.

exec"g={0}x:((({0}:g(sum(int(y)for y in str(x))),{0}:0{1}0,1,2,4,5,7,8]),{0}:1{1}3,6,9]))()".format('lambda ',').__getitem__(x in[')

http://www.codeskulptor.org/#user34_uUl7SwOBJb_0.py


그러나 어레이 액세스 []는 허용되지 않습니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳


글쎄, 질문은 태그 위키에서 규칙을 사용하지 않습니다. 질문에는 허용되는 작업에 제한이 있습니다. 단어를 참고하십시오 only.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 글쎄요, 파이썬도 그 고유 한 속성을 가지고 있습니다
Dylan Madisetti

0

파이썬-25 토큰

일을 시작하기 위해 첫 번째 게시물의 링크에서 답변 중 하나를 구현하는 긴 솔루션이 있습니다. n입력됩니다.

a = (n>>7)-((n&64)>>6)+((n&32)>>5)-((n&16)>>4)+((n&8)>>3)-((n&4)>>2)+((n&2)>>1)-(n&1)
print(a==0 or a==3)

or와 같습니다 ||.


0

자바 스크립트-3 토큰

브라우저 콘솔에서 테스트하십시오.

a = prompt().split('');
sum = 0;

do {
  sum = a.reduce(function(p, c) {
     return parseInt(p) + parseInt(c); 
  });

  a = sum.toString().split('');

} while(a.length > 1)

alert([3, 6, 9].indexOf(+sum) > -1)

그 결론을 어떻게 얻었습니까? 약 37 개의 토큰을 계산합니다.
nyuszika7 시간

"토큰은 상수와 변수를 제외한 위의 것 중 하나입니다." 37은 어떻게 계산 했습니까?
William Barbosa 2016 년

1
아, 알겠습니다 OP는 atomic-code-golf 의 정보 페이지에 동의하지 않는 것 같습니다 .
nyuszika7 시간

사실, 지금은 내가 옳은지 확실하지 않습니다. 원자 코드 골프 바이올린에 따르면 내 점수는 70 이상입니다.
William Barbosa 2016 년

1
문제는 토큰 수가 아니라 사용중인 작업에 관한 것입니다. toString, parseInt, 루프, 배열 등이 허용되지 않는다고 생각합니다.
aditsu

0

JavaScript
가 확실하지 않은 토큰

function mod3 (i) { return {'undefined':'100','0':'0'}[[0][i]][i.toString (3).split('').pop ()]}

또는 0에 대한 출력이 1이 될 수있는 경우;

function mod3 (i) { return '100'[i.toString (3).split('').pop ()]}


2
나는이 도전에 어떤 규칙이 적용되는지 확실하지 않다. 함수 호출 및 속성 액세스가 허용됩니까?
C5H8NNaO4 2016 년

0

Tcl , 83 바이트

proc T n {while \$n>9 {set n [expr [join [split $n ""] +]]};expr {$n in {0 3 6 9}}}

온라인으로 사용해보십시오!


실패한 outgolf : 96 바이트 proc T n {set n [expr [join [split [expr [join [split $n ""] +]] ""] +]];expr {$n in {0 3 6 9}}} 온라인으로 사용해보십시오!
sergiol

또 다른 실패 : ** 87 바이트 ** proc T n {expr {[expr [join [split [expr [join [split $n ""] +]] ""] +]] in {0 3 6 9}}} 온라인으로 사용해보십시오!
sergiol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.