n % 12 계산


27

부호없는 32 비트 정수에 대한 n모듈로 12를 계산 합니다.

규칙:

  • n0에서 23 사이의 모든 숫자에 대해 작동해야합니다 . 다른 숫자는 선택 사항입니다.
  • 단지 사업자 중 하나를 사용해야합니다 +-*, ~&^|또는 <<, >>일반적으로 32 명 비트하는 uint에 정의 된 바와 같다.
  • 임의의 수의 상수 uint를 사용할 수 있습니다.
  • 배열을 포함한 어떤 형태의 포인터 나 if삼항 연산자 또는 "보다 큼"연산자와 같은 if 문으로 컴파일되는 구문을 포함한 명령문을 사용할 수 없습니다 .

점수 :

  • 연산자 + -와 비트 연산자 ~ & ^ | << >>(NOT, AND, XOR은, OR, 비트 이동은)의 점수를주고 1, *점수를 제공합니다 2.
  • 총점이 가장 낮습니다.

6
C / Java 이외의 언어 사용자에 대한 연산자를 정의 할 수 있습니다. 나는 +-*더하기, 빼기, 곱하기를 이해 합니다. ~&^|비트 NOT, AND, XOR, OR; 및 << >>bitshifts입니다.
Level River St

@ steveverrill-감사합니다. 그것은 실제로 의도입니다.
nbubis 2014 년

사용할 수 있습니까 for i in x:y:z, .dostuff?
OUurous

표현식에 사용할 값과 같은 변수를 설정할 수 있습니까?
xnor

4
대부분의 컴파일러는 n % 12해커의 기쁨과 같이 곱셈과 변화에 최적화 할 것이므로 이는 사소한 일입니다. 어셈블리를 출력하고 다음을 참조하십시오
phuclv

답변:


29

4

(언어는 관련이 없습니다)

n-((48&(11-n))>>2)

우! 4에 도착했습니다.

11-n n> = 12 인 경우에만 모든 상위 비트가 설정되도록합니다.

48&(11-n) == n> 11이면 48, 그렇지 않으면 0

(48&(11-n))>>2 == n> 11이면 12, 그렇지 않으면 0

n-((48&(11-n))>>2) 답이다


1
으아 아 아아아,이 접근법으로 나를 이겼다! 나는 글을 올리는 순간에 불과했다 n - (((11 - n) & 0xC0000000) >> 28). 잘 했어, 나는 그것이 4 개 미만으로 이루어질 수 있다고 생각하지 않는다.
Runer112

1
@ Runner112 그래, 나는 내가 그것을 게시했을 때 아무도 나를 이길 것으로 기대했다. 그래도 스스로 찾아내는 것이
좋았습니다

1
굉장한 :) 4 실제로 성취입니다.
nbubis 2016 년

11

4

찾아보기 테이블이있는 솔루션 (찾아보기 i ^ (i % 12)) :

i ^ (0x1d4c000 >> (i & 0xfc) & 30)

4

다음은 4 가지 작업을 수행하는 다른 솔루션입니다.

i - ((0xffff >> (i - 12)) & 12)

비트 시프트의 카운트 피연산자는 암시 적으로 mod 32를 취한다고 가정합니다. 즉와 x >> -1동일합니다 x >> 31.

5

룩업 테이블을 사용하는 또 다른 접근법 :

i - (16773120 >> i & 1) * 12

7

배쉬 – 1

echo `seq 0 11` `seq 0 11` | awk '{print $(number+1)}'

예 :

$ echo `seq 0 11` `seq 0 11` | awk '{print $(0+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(11+1)}'
11

$ echo `seq 0 11` `seq 0 11` | awk '{print $(12+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(23+1)}'
11

1
포인터를 사용하기 때문에 유효하지 않습니다.
curiousdannii

@curiousdannii 어떤 포인터를 가리키고 있습니까? stdinstdout스트림? 물론 내부적으로는 포인터이지만 Java Integer는 많은 것을 위해 내부적으로 클래스를 사용하기 때문에 Java 자격을 잃을 수도 있습니다 .
Cole Johnson

$ ()가 실제로 포인터와 같지 않습니까?
curiousdannii

@ curiousdannii-awk 문서는 내장 변수라고 말합니다.

5

C, 리틀 엔디안-2

이것은 아마도 부정 행위이지만 규칙을 충족한다고 생각합니다 ...

union {
    int i;
    struct {
        int a:4;
        int b:2;
        int c:10;
    } s;
    struct {
        int a:2;
        int b:14;
    } t;
} u;

u.i = 11-n;
u.s.a = 0;
u.s.c = 0;
result = n-u.t.b;

어떻게 작동합니까?
nbubis 2016 년

1
Sorta 부정 행위, = 0 대신 에을 (를) 사용하고 있으므로 & 0x0추가로 2 회 계산해야합니다. 그러나 창의성에 +1 :)
nbubis

4

PHP-0 점

나는 아무도 내 앞에 이것을 가지고 올 수 없었는지 궁금하다! !!

$n = 18;
$s = str_repeat("a", $n);
$s2 = preg_replace('/aaaaaaaaaaaa/', '', $s);
echo strlen($s2);

2
좋은. 배열이 허용되지 않기 때문에 문제가있을 수 있다고 생각합니다. 그래도 정말 좋습니다.
AJMansfield

@AJMansfield One은 이것이 배열이 아니라 문자열이라고 주장 할 수 있습니다 (예, 낮은 수준의 문자열은 바이트 배열입니다). :)
seequ

1
@seequ One은 또한 RAM을 사용하기 때문에 이것이 유효하지 않다고 주장 할 수 있습니다 (예, 램은 기술적으로 인덱스 배열입니다) ¯_ (ツ) _ / ¯
Stan Strum

2

C, 5 점

23 이상으로 작동하지만 그 이상 보장되지는 않습니다.

( ((n+4)>>2)&4 ) + n & 15

((n+4)>>2)&4n> = 12에 대해 4를 반환합니다. 이것을 n에 더하면 최하위 4 비트에서 정답을 얻은 다음 다른 비트를 자릅니다.


잘 했어!! 이제 누군가가 4에 도착할 수 있는지 보자.
nbubis

2

어떤 언어 : 5

이길 수는 없지만 재미 때문에 참여하고 다른 사람들보다 이해하기 쉽기 때문에 참여하십시오.

n - ((n+20)>>5)*12

이것은

n - (n>11)*12

이것은 20에서 12를 더할 때 32를 얻으므로 5 번째 비트가 1이되기 때문에 동일합니다. 이것은 32가 5 번째 비트가 1이되는 가장 작은 수인 n> 1 일 때만 해당됩니다.

또한 더 많은 범위에서 쉽게 확장 할 수 있습니다.

n - ((n+20)>>5)*12 - ((n+41)>>5)*12

35까지 범위에 도달


1

파이썬 2.x-4

j=input();m=lambda a,b:a*b;a=(m(j,357913942)>>32);print j-m(12,a)

인가 =운영자는?

이 경우 점수는 6입니다.

j-12*(j*357913942>>32)

BTW @steveverrill의 솔루션은 Python에서도 직접 사용할 수 있습니다.

0 ~ 23 범위에서 작동

무슨 일이야? 357913942를 곱하고 2 ^ 32 (또는 오른쪽 시프트 32)로 나눕니다.


함수를 사용하여 한 번만 곱하는 방법이 마음에 듭니다. 그러나 imho는 곱셈의 이름을 m (,) 함수로 바꿨습니다.
Pinna_be 2016 년

규칙을 해석하는 방법을 따라 다르지만 유효한 시점이
윌렘


0

코브라-2 (또는 3)

def modulo12(n as uint32) as uint32
        for i in 11:n to int64:12,n-=12
        return n

이것은 규칙을 약간 구부릴 있지만 요청하고 이것을 사용할 수있었습니다.

그것은 또한 어떤 숫자에서도 작동합니다.


0

코나 -5

층 연산자가 허용되는지 확실하지 않기 때문에 유효하지 않을 수 있지만 2 *와 마이너스가 있습니다.

mod:{x-(_0.08333*x)*12}

어떤 정수에 대해서도 작동합니다.


플로어 연산에 대해 잘 모르겠지만 첫 번째 곱셈이 32 비트 정수 이외의 다른 연산에서 작동한다고 확신합니다.
Runer112

@ Runer112 : OP는 입력 이 32 비트 여야하고 연산자는 일반적으로 32 비트 uint로 정의 된대로라고 말합니다. 코드에서 정수가 아닌 값에 대해서는 아무 것도 말하지 않습니다.
Kyle Kanos

내가 오해하지 않는 한 0.08333은 32 비트 uint가 아니기 때문에 0.08333 * x는 32 비트 uint에 정의 된 곱셈처럼 보이지 않습니다.
Runer112

1
"임의의 정수를 임의로 사용할 수 있습니다." 즉, 임의의 부동 소수점을 사용할 수 없습니다.
nbubis 2016 년

1
@nbubis : 그 줄은 실제로 수레에 제한을 두지 않습니다.
Kyle Kanos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.