나는 무례한 번호입니까?


72

한동안 나는 손가락으로 셀 때 특히 10까지 셀 수 없다는 문제에 부딪쳤다. 이 문제에 대한 나의 해결책은 내 손가락에 이진법으로 세어 내 엄지 손가락을 하나, 내 엄지 손가락을 두 개, 엄지 손가락과 집게 손가락을 세 개 등으로 올리는 것이 었습니다. 그러나 우리는 숫자 4 특히, 우리는 가운데 손가락을 올려야하므로 다소 불행한 몸짓이되는데 이는 일반적으로 사회에서 받아들이지 않습니다. 이 유형의 숫자는 무례한 숫자 입니다. 우리는 36 초에 다음 번 무례한 숫자에 도달합니다. 우리는 초침과 첫 손의 가운데 손가락에 엄지 손가락을 올립니다. 무례한 숫자의 정의는 계산이 시스템에서, 우리의 결과가 퍼팅, 임의의 숫자입니다 어떤 손의 가운데 손가락. 1023을 통과하면 (한 사람이 도달 할 수있는 최대 수, 5 개의 손가락 두 손으로 각각), 세 번째 손을 계속하고 필요에 따라 추가 손을 추가한다고 가정합니다.

당신의 작업 :

입력이 무례한 지 여부에 따라 입력을 받고 참 / 거짓 값을 출력하는 프로그램 또는 함수를 작성하십시오.

입력:

0에서 10 9 사이의 정수 (포함).

산출:

입력이 무례한 지 여부를 나타내는 참 / 거짓 값입니다.

테스트 사례 :

Input:    Output:
0   --->  falsy
3   --->  falsy
4   --->  truthy
25  --->  falsy
36  --->  truthy
127 --->  falsy
131 --->  truthy

채점 :

이것은 이므로 바이트 단위의 최저 점수가 이깁니다.


43
assume we continue with a third hand, 무례하게 될 때 팀워크는 꿈을 실현시킵니다.
Veskah

5
@Veskah는 질문의 범위에 대해 주어진 숫자를 만들기 위해 3 명만 필요하다는 것이 밝혀졌습니다. 물론 손가락을 세는 오래된 종류를 능가합니다.
그리폰

12
당신이 영국인이라면 더 나쁩니다-6도 무례합니다!
매튜

1
10이 아닌 다른 입력을 입력해도 괜찮습니까?
wastl

2
5도 꽤 무례한 것 같습니다. "아, 그녀는 엄지 손가락을,
어요.

답변:



17

정규식 (ECMAScript), 37 바이트

입력은 xs 문자열의 길이로 단항 입니다.

^((?=(x+)(\2{31}x*))\3)*(x{32})*x{4}$

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

^
(
    (?=(x+)(\2{31}x*))    # \2 = floor(tail / 32); \3 = tool to make tail = \2
    \3                    # tail = \2
)*                        # Loop the above as many times as necessary to make
                          # the below match
(x{32})*x{4}$             # Assert that tail % 32 == 4

13
나는 정규식을 알고 있다고 생각했지만 분명히 그렇지 않습니다.
CT Hall



8

루비, 36 19 바이트

->n{n.to_s(32)[?4]}

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

@tsh 메소드로 17 바이트를 저장했습니다 .


이것은의 이진 표현이있는, 2207에 대해 true를 반환100010011111
무지의 실시 예

@ 무지의 구현 올바른 결과입니까, 그렇지 않습니까? 초침은 00100입니다.
손잡이

나는 루비를 못해요. 그런데 왜 안 되 ->n{n.to_s(32)=~/4/}겠어요?
tsh

1
내가 당신만큼 영리하지 않기 때문에 @tsh :)
Doorknob

내가 질문을 이해하지 못한다면 용서하십시오.하지만 2207의 첫 번째 손 10001, 두 번째 00111및 세 번째가 11아닌가? 그들 중 어느 누구도 가운데 손가락만을
올리지

8

APL + WIN, 10 바이트

정수 입력을위한 프롬프트

4∊(6⍴32)⊤⎕

10 ^ 9는 기본 32 표현의 6 개 요소로 구성된 벡터로 변환하기 위해 6 개의 손이 있어야하며 4가 어떤 요소에 있는지 확인합니다.




6

x86 머신 코드, 17 바이트

6A 20 59 85 C0 74 09 99 F7 F9 83 FA 04 75 F4 91 C3

상기 바이트는에 입력으로서 숫자를 취하는 함수 정의 EAX레지스터와의 부울 결과의 값을 EAX레지스터 ( EAX== 0 입력인지 하지 ; 무례 수 EAX! = 0 입력이있는 경우 이다 무례한 수가 ).

사람이 읽을 수있는 어셈블리 니모닉 :

; Determines whether the specified number is a "rude" number.
; Input:    The number to check, in EAX
; Output:   The Boolean result, in EAX (non-zero if rude; zero otherwise)
; Clobbers: ECX, EDX
IsRudeNumber:
    push    32           ; \ standard golfing way to enregister a constant value
    pop     ecx          ; /  (in this case: ECX <= 32)
CheckNext:
    test    eax, eax     ; \ if EAX == 0, jump to the end and return EAX (== 0)
    jz      TheEnd       ; /  otherwise, fall through and keep executing
    cdq                  ; zero-out EDX because EAX is unsigned (shorter than XOR)
    idiv    ecx          ; EAX <= (EAX / 32)
                         ; EDX <= (EAX % 32)
    cmp     edx, 4       ; \ if EDX != 4, jump back to the start of the loop
    jne     CheckNext    ; /  otherwise, fall through and keep executing
    xchg    eax, ecx     ; store ECX (== 32, a non-zero value) in EAX
TheEnd:
    ret                  ; return, with result in EAX

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


1
idiv그래도 재미있는 아이디어를 사용하십시오 . 이것에 대한 점진적 개선은 보이지 않습니다. 그러나 내 대답 : 14 바이트는 MOV / AND / SUB / JZ를 사용하여 낮은 5 비트를 무례하게 검사하는 시프트 루프입니다.
Peter Cordes

4

줄리아 1.0 , 25 바이트

f(n)=n%32==4||n>0<f(n>>5)

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

줄리아 1.0 , 26 바이트

1 문자는 짧지 만 1 바이트는 길지만 유니 코드에서는 3 바이트 가 걸리는 대안입니다 .

n->'4'string(n,base=32)

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


n->n%32...2 바이트 더 짧은 첫 번째 답변에 사용할 수 있습니까?
주세페

@Giuseppe, 불행히도, 그 기능은 재귀 적입니다.
Kirill L.


4

가톨릭 , 4 바이트

ǔ?QǑ

숫자를 base-256 문자열로 사용합니다.

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

테스트 스위트


2
흠, 이것이 허용된다면, 대신에 밑 32의 숫자를 받아 들일 수 있습니까?
재귀

@recursive 당신의 숫자를 둘러싸고 수 <<>>시험 스위트에서와 같이 그것은 그 255보다 큰 숫자 수 있습니다.
Okx

1
그것은 도전에 대한 질문으로 의도되었지만 매우 명확하지 않았습니다.
재귀

4

C # (Visual C # 대화식 컴파일러) , 31 바이트

n=>{for(;n>0;n/=n%32==4?0:32);}

예외를 발생시켜 출력합니다. 한 숫자를 10 진수에서 다른베이스로 변환하는 방법은 10 진수를 해당베이스로 반복해서 나누고 나머지를 숫자로 취하는 것입니다. 이것이 우리가하는 일이며, base-32에서 숫자 중 4가 있는지 확인합니다.

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


27? 보너스로 이상한 방식으로 출력되지 않습니다
ASCII 전용

1
또한 tplig 란 무엇입니까
ASCII 전용

n>31n>0
@ASCII


1
프로그램 정지 여부 는 허용되는 출력 방법아닙니다 . 예외를 통한 출력 이 허용됩니다.
데드 코드


3

R , 50 48 바이트

any(2^(0:4)%*%matrix(scan()%/%2^(0:34)%%2,5)==4)

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

이제 깔끔한 매트릭스 기반 접근 방식을 사용합니다 (@Giueseppe 제공). 5x7 비트 매트릭스를 생성하고이를 일련의 기본 32 정수로 변환하고 4를 확인합니다.


@ 주세페 죄송합니다. 실망스럽게도 19 바이트 더 길지만 지금 작동합니다. 베이스 R에 16 진수와 8 진수 이외의 strtoi에 대한 역함수가 없다고 생각합니다.
Nick Kennedy

매트릭스 매직이있는 48 바이트 나는 비트 변환이 이상이라고 생각 intToBits하지만, 우리는 작업 할 수 ints대신 raw예를 들어 볼 - 바이트를 저장 끝나는하는 이와 함께intToBits
주세페

@ 주세페 그것은 내 것과 완전히 다른 (그리고 깔끔한) 솔루션입니다-내 것을 업데이트 하시겠습니까?
Nick Kennedy

당신은 그것을 자유롭게 가져옵니다. :-)
주세페

1
물론 432 자릿수의 숫자 가 있는지 테스트하는 많은 답변 중 하나를 포팅하는 것은 29 바이트 입니다.
주세페



2

, 6 바이트

№⍘N³²4

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. -숫자가 얼마나 무례한 지에 따라 s를 출력합니다 . 설명:

  N     Input as a number
 ⍘      Convert to base as a string
   ³²   Literal 32
№       Count occurrences of
     4  Literal string `4`

나는에 대한 숫자 리터럴을 분리하는 것을 피하기 위해 문자열 기반 변환을 사용 32하고 4.




2

Cubix , 26 바이트

u!@-W14;OIS%/\;;,p;?wO@u/s

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

다음과 같이 모서리 길이가 3 인 큐브에 랩

      u ! @
      - W 1
      4 ; O
I S % / \ ; ; , p ; ? w
O @ u / s . . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

달려 봐

모든 리디렉션이없는 상당히 기본적인 구현 :

  • IS 입력과 32를 스택으로 밀어 프로그램을 시작합니다.
  • %4-! 나머지를 가져 와서 뺄셈으로 4인지 확인합니다.
  • 1O@ 4 인 경우 출력 1 및 정지
  • ;;, 스택을 정리하고 정수 나누기
  • p;? 스택의 바닥을 정리하고 div 결과를 0으로 확인하십시오.
  • O@ div 결과가 0으로 출력되지 않고 멈추는 경우
  • s 스택 상단을 교체하고 위의 2 단계에서 다시 시작


2

배치, 77 45 바이트

@cmd/cset/a"m=34636833,n=%1^m*4,(n-m)&~n&m*16

이 비트 트위들 링 해킹을 기반으로 합니다 . 설명 : 지원해야하는 입력의 제한된 범위 (30 비트)로 인해 6 개의 손만 확인하면됩니다. 매직 넘버 m111111베이스 32 와 동일 하므로 첫 번째 연산은 입력 번호에서 무례한 비트를 토글합니다. 그런 다음 6 개의 핸드 중 어느 것이 현재 0인지 찾아야합니다.


2

x86 기계 코드, 14 바이트

동일한 머신 코드는 16 비트, 32 비트 및 64 비트에서 작동합니다. 16 비트 모드에서는 32 및 64 비트 모드에서 EAX 및 EDI 대신 AX 및 DI를 사용합니다.

알고리즘 :로 낮은 5 비트를 확인한 x & 31 == 4다음 5 비트 씩 오른쪽 시프트하고, 시프트 결과가 0이 아닌 경우 반복하십시오.

char isrude(unsigned n);x86-64 시스템 V 호출 규칙에 따라 C에서 호출 할 수 있습니다. 0은 진실이며 0이 아닌 것은 거짓입니다 (이것은 C 1이 아닌 asm입니다 ).

 line   addr    code bytes
  num
     1                             ; input:  number in EDI
     2                             ; output: integer result in AL: 0 -> rude, non-zero non-rude
     3                             ; clobbers: RDI
     4                         isrude:
     5                         .check_low_bitgroup:
     6 00000000 89F8               mov    eax, edi
     7 00000002 241F               and    al, 31          ; isolate low 5 bits
     8 00000004 2C04               sub    al, 4           ; like cmp but leaves AL 0 or non-zero
     9 00000006 7405               jz    .rude            ; if (al & 31 == 4) return 0;
    10                         
    11 00000008 C1EF05             shr    edi, 5
    12 0000000B 75F3               jnz   .check_low_bitgroup
    13                             ;; fall through to here is only possible if AL is non-zero
    14                         .rude:
    15 0000000D C3                 ret


    16          0E             size:  db $ - isrude

op al, imm8AND 및 SUB에 대한 짧은 형식 인코딩을 활용합니다 . XOR al,4평등에서 0을 생성하는 데 사용할 수 있었지만 SUB는 JZ를 사용하여 Sandybridge 제품군의 단일 하위 분기 지점으로 매크로 융합 할 수 있기 때문에 더 빠릅니다.

재미있는 사실 : P6 계열에서 1 이상의 교대 결과를 사용하면 P6 계열 (변속이 중단 될 때까지 프론트 엔드 마구간)이 느려 지지만 괜찮습니다.


각주 1 : 이것은 어셈블리 언어 기능이며, 86 ASM은 모두가 jz하고 jnz있으므로, 메타 따라 나도 방법을 선택할 수 있습니다. 나는 이것이 C 진실 / 거짓과 일치하지 않을 것입니다.

EFLAGS 대신 AL로 반환하는 것이 편리했기 때문에 래퍼없이 C 컴파일러에 함수를 설명 할 수 있지만 C 호출자를 사용하여 테스트 할 때 진실 / 거짓의 선택이 제한되지는 않습니다.


2

ES6, 31 30 26 바이트

b=>b.toString(32).match`4`

더 줄일 수있는 방법에 대한 아이디어를 말씀하십시오.


PPCG에 오신 것을 환영합니다!
Laikoni

함수 이름을 계산할 필요는 없지만을 사용하여 바이트를 저장할 수 있다고 생각하지만 test실제로 4숫자로 일치 시키고 match문자열로 변환 한 다음 RegExp을 사용하여 두 바이트를 저장할 수 있습니다 .

1

레티 나 0.8.2 , 31 바이트

.+
$*
+`(1+)\1{31}
$1;
\b1111\b

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 숫자가 무례하지 않으면 0을 출력합니다. 입력을 단항으로 변환 한 다음 단항 인코딩 된 기준 32로 변환 4하고 결과에서 s 수를 계산하여 작동합니다 .




1

Wolfram Language (Mathematica) , 37 바이트 36 바이트 29 바이트

Jonathan Frech의 -2 바이트

#~IntegerDigits~32~MemberQ~4&

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

31 바이트 솔루션 :

MemberQ[IntegerDigits[#,32],4]&

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


PPCG에 오신 것을 환영합니다. 그대로 표현은 단일 부울 값입니다. 정식 프로그램 또는 기능 (대부분 ...#...&Mathematica에서 사용됨)으로 답을 수정하십시오 .
Jonathan Frech

안녕하세요. 이게 네가 뜻한 바냐?
Rainer Glüge

pls는 유효한 수학 코드인지 확인하기 위해 W | A 대신 tio.run/#mathematica 를 사용합니다 .P[n] 는 마지막에 &. 또한 게시물에는 편집 기록이 있으므로 이전 항목을 제외하는 것이 좋으며 이전 점수의 규칙은<s>40</s> <s>36</s>
ASCII 전용

예. 이것이 내가 의미 한 바입니다. 29 바이트 .
Jonathan Frech

함수형 프로그래밍 스타일에 익숙해 져야한다고 생각합니다.
Rainer Glüge

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.