부호를 출력하십시오


67

숫자 N이 주어지면 N의 부호 를 출력하십시오 .

  • N이 양수이면 출력 1
  • N이 음수이면 출력 -1
  • N이 0이면 출력 0

N은 선택한 언어에서 표현 가능한 정수 범위 내의 정수입니다.


45
이것은 많은 사소한 해결책으로 사소한 도전입니다. 그러나 사소한 해결책도 있습니다. 유권자에게 : 내장 함수 를 찬성 하기 전에이 메타 포스트첫 문장을 읽으십시오 .
Stewie Griffin

8
아마도 리더 보드를 사용할 수 있습니다.
Martin Ender

2
@MrLister는 원하는 방식으로 찬성하지만 실제로는 코드 길이 대신 창의성을 찾아야합니다.
FlipTack

3
@FlipTack 아, 나는 그것이 codegolf라고 생각했습니다.
Mr Lister

3
@MrLister는 객관적인 승리 기준입니다. 그러나 s부호 내장 을 입력 하거나 영리한 비트 시프 팅 / 수학을 사용 하여 실제로 해결하는 데 더 많은 노력이 필요합니까? 한 번 봐 가지고 이 메타 포스트
FlipTack

답변:


46

레티 나 , 9 바이트

[1-9].*
1

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

0이 아닌 숫자와 그 뒤의 모든 문자를로 바꿉니다 1. 이것은 잠재적 인 선행을 -그대로두고 0자신을 제외한 모든 숫자 를 절대 값으로 변경합니다 1.


이것은 매우 영리합니다 :)
Mego

정수의 과학적 표기법 (예 :)과 함께 작동합니까 0.42e2?
Egor Skriptunoff

@EgorSkriptunoff 아니요,하지만 필수는 아닙니다.
Martin Ender

9
@ EgorSkriptunoff는 로마 숫자도 지원하지 않습니다. 도전 과제가 지원해야 할 특정 비표준 형식을 명시 적으로 언급하지 않는 한, 일반적인 가정은 선택한 언어에서 자연스러운 단일 형식을 처리하는 것이 좋습니다.
Martin Ender

3
@EgorSkriptunoff Retina에는 숫자 개념이 없습니다. 순전히 문자열 기반 언어입니다.
Martin Ender

42

C (GCC), 24 23 22 18 바이트

바이트를 저장해 준 @aross와 @Steadybox에게 감사합니다!

f(n){n=!!n|n>>31;}

모든 시스템 또는 컴파일러에서 작동한다고 보장 할 수는 없으며 TIO 에서 작동합니다 .


7
@betseg 그것은 빌트인의 upvotes가 이제 눈살을 찌푸 리기 때문이다.
Outgolfer Erik

4
이러한 1 바이트로 저장return n>>16|!!n;
aross

5
int의 @GB 크기는 아마도 2 (16, x86) 또는 4 (32, x86_64) 일 것입니다. 그러나 필요한 것은 그것이 유효한 아키텍처 뿐입니다 . 이것은 스택 오버플로가 아니며 이식성이 중요하지 않습니다.
cat

2
f(n){n=n>>31|!!n;}작동합니다. 그러나 이것은 언어 기능이 아닌 컴파일러의 단점입니다.
GB

2
@GB 컴파일러 쿼크는 쿼크가 작동하는 컴파일러가 있다는 것이 입증 될 수있는 한 완벽하게 유효합니다. 운 좋게도, gcc 에는 문제가 있습니다.
Mego

34

Mathematica, 4 바이트

Clip

내장을 사용하지 않고 Sign여전히 4 바이트를 스코어링하는 것은 어떻습니까? ;)

Clip하나의 인자 클립 (또는 클램프)의 입력 값으로 -1하고 1. 입력은 정수일 뿐이므로를 사용하는 것과 같습니다 Sign.


29

암소 225 213 201 바이트

oomMOOmoOmoOmoOmoOMoOMoOmOomOomOoMoOMMMmoOMMMMOOMOomOo
mOoMOomoOmoOmoomOomOoMMMmoOmoOmoOMMMMOOOOOmoOMOoMOomOo
mOomOoMoOMMMmoOMMMMOOMOomOomOoMoOmoOmoOmoomoOmoomOomOo
mOomoomoOMOOmoOmoOmoOMOoMMMOOOmooMMMOOM

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

이 코드가 작동하는 방식은 더 큰 숫자를 더하거나 빼고 마지막으로 작동 한 숫자를 확인하여 부호를 결정하는 것입니다. 0이 아닌 정수가 주어지면 먼저 1을 빼고 2를 더한 다음 3을 빼면 결국 0에 도달합니다. 0에서 시작하는 값으로 2를 더하고 빼서 상태를 추적하십시오. 예:

-5  - 1  = -6  (current state: 0 + 2 = 2)
-6  + 2  = -4  (current state: 2 - 2 = 0)
-4  - 3  = -7  (current state: 0 + 2 = 2)
-7  + 4  = -3  (current state: 2 - 2 = 0)
-3  - 5  = -8  (current state: 0 + 2 = 2)
-8  + 6  = -2  (current state: 2 - 2 = 0)
-2  - 7  = -9  (current state: 0 + 2 = 2)
-9  + 8  = -1  (current state: 2 - 2 = 0)
-1  - 9  = -10 (current state: 0 + 2 = 2)
-10 + 10 =  0  (current state: 2 - 2 = 0)
value is now at 0.  state - 1 = 0 - 1 = -1
sign of original number is -1

완료되면 주에서 1을 빼고 양수 또는 음수 부호를 얻습니다. 원래 숫자가 0이면이 작업을 방해하지 않고 0 만 인쇄하십시오.

상해:

oom                                        ;Read an integer into [0]
MOO                                        ;Loop while [0] is non-empty
    moOmoOmoOmoOMoOMoOmOomOomOo            ;    Decrement [4] twice
    MoOMMMmoOMMM                           ;    Increment [1], then copy [1] to [2]
    MOO                                    ;    Loop while [2] is non-empty
        MOomOomOoMOomoOmoO                 ;        Decrement [0] and [2]
    moo                                    ;    End loop now that [2] is empty
    mOomOoMMMmoOmoOmoOMMM                  ;    Navigate to [0], and copy to [3]
    MOO                                    ;    Perform the next steps only if [3] is non-zero
        OOOmoOMOoMOomOomOomOoMoOMMMmoOMMM  ;        Clear [3], increment [4] twice, increment [1], and copy it to [2]
        MOO                                ;        Loop while [2] is non-empty
            MOomOomOoMoOmoOmoO             ;            Decrement [2] and increment [0]
        moo                                ;        End loop now that [2] is empty
    moO                                    ;        Navigate back to [3]
    moo                                    ;    End the condition
    mOomOomOo                              ;    Navigate back to [0]
moo                                        ;End loop once [0] is empty.
moO                                        ;Navigate to [1]. If [1] is 0, then input was 0.  Otherwise, [4] contains (sign of [0] + 1)
MOO                                        ;Perform the next steps only if [1] is non-zero
    moOmoOmoOMOoMMMOOO                     ;    Navigate to [4], copy it to the register, and clear [4].
moo                                        ;End condition
MMMOOM                                     ;If the register contains something (which is true iff the condition ran), paste it and print it.  Otherwise, no-op and print 0.

나는 아직도 골프를 실험하고 있습니다 (COW에서의 골프는 다소 어렵다는 사실에 놀랄 것입니다). 이는 앞으로 몇 바이트 더 떨어질 수 있습니다.


1
그리고 'moo'-언어가 있습니까? ...
Mukul Kumar

1
@MukulKumar 그것은 bf가하지 않는 몇 가지를 허용하는 COW라는 brainfuck 파생물입니다
Gabriel Benamy

이것을 "나쁜 마법사"언어라고 부를 수도 있습니다. OUT OF MANA!!!
Magic Octopus Urn

18

Cubix , 10 바이트

(W0^I?>O2@

온라인으로 테스트하십시오!

이 코드는 다음 큐브 네트에 래핑됩니다.

    ( W
    0 ^
I ? > O 2 @ . .
. . . . . . . .
    . .
    . .

그런 다음을 시작으로 I동쪽을 향한 IP (명령 포인터)로 코드를 실행합니다 . ISTDIN에서 부호있는 정수를 입력하여 스택으로 푸시합니다.

다음 명령은입니다 ?.이 명령은 최상위 항목의 부호에 따라 IP 방향을 변경합니다. 입력이 0이면 다음 코드를 통해 계속 같은 방향으로 이동합니다.

  • >-IP가 동쪽을 가리 키도록합니다. (우리가 이미 동쪽으로 가고 있기 때문에 No-op.)
  • O -상단 항목을 정수로 출력합니다.
  • 2-2를 스택으로 밉니다. 이것은 실질적으로 아무런 문제가 없습니다. 왜냐하면 ...
  • @ -프로그램을 종료합니다.

입력이 음수이면 IP가 왼쪽에서 왼쪽으로 바뀝니다 ?. 이것은 큐브이므로 IP는 0두 번째 행에서 동쪽으로 이동합니다. 0리터럴 0을 푸시하면이 코드가 실행됩니다.

  • ^ -IP 북쪽을 가리 킵니다.
  • W -왼쪽의 한 지점에서 IP를 "측면"합니다.
  • ( -최상위 항목을 줄입니다.

TOS는 이제 -1이고 IP는 큐브에 .닿을 때까지 큐브를 감싸지 않습니다 >. 위에서 언급 한 것과 동일한 출력 코드를 실행하여 outputting -1합니다.

입력이 양수인 경우 하나의 예외를 제외하고 음수 입력과 동일한 상황이 발생합니다. IP가에서 왼쪽 대신에 오른쪽으로 바뀌고 ?큐브를로 감싸서 2리터럴 2를 푸시합니다. 그러면 1이 감소합니다. 출력으로 보냈습니다.


4
프로그램 흐름의 애니메이션은 매우 좋습니다!
Luis Mendo

좋은 언어. 더 짧을 수 있습니까? 4 흐름 제어가 많이 보인다. 연산 카운트에서 다른?를 도입하여 8 바이트가 될 수 있지만 이제는 큐브의 아래쪽 절반을 사용합니다. ..1nI? ..> O @ .........?
BlackShift

첫 번째 후에 출력을 무시하면 6이 가능합니다. / I? nO1 그런데 사양에 따라 0 대신 온라인 인터프리터에서 -1을 반환하기 때문에 작동합니다.
BlackShift

@BlackShift 관심을 가져 주셔서 감사합니다! 귀하의 제안이 마음에 들지만 개선 방법을 잘 모르겠습니다. 적은 명령을 사용하는 것이 가능합니다. 까다로운 부분은 큐브를 덜 사용하고 있습니다 ... ;-) 그리고 -1 버그를 지적 해 주셔서 감사합니다. 곧 수정 될 것입니다.
ETHproductions

@ETHproductions IMO 버그가 아니며, I소문자처럼 입력이 끝나면 -1을 반환 하는 것이 좋습니다 i.
FlipTack

16

자바 스크립트 (ES6), 9 바이트

Math.sign

똑바로.

내장되지 않은 가장 짧은 것은 13 바이트입니다.

n=>n>0|-(n<0)

@Neil 덕분에 이것은 바이트 단위로 골프를 칠 수 있지만 32 비트 정수로만 작업해야합니다.

n=>n>0|n>>31

아니면 할 수 있습니다

n=>n>0?1:!n-1

더 골프 타는 것 같지만 어떻게 해야할지 모르겠습니다.


2
32 비트 부호있는 정수의 경우 12 바이트로 기본 제공되지 않음 n: n=>n>>31|!!n.
Neil

@Neil n>>31은 정말 똑똑합니다. 감사합니다!
ETHproductions

Javascript는 숫자에 배정 밀도 부동 소수점을 사용하기 때문에 세 번째 솔루션이 유효하다고 생각하지 않습니다. 그러나 나는 틀릴 수 있습니다.
Mego

@Mego 당신이 맞습니다. 나는 이것을 게시물에서 명확히했다.
ETHproductions

1
@Mego 죄송합니다. 귀하의 의견을 놓쳤습니다. 비트 연산자를 사용할 때 JS는 암시 적으로 피연산자를 부호있는 32 비트 정수로 캐스트하므로 세 번째 솔루션은 작동하지만 -2147483648에서 2147483647까지의 숫자에서만 작동합니다.
ETHproductions

15

APL (Dyalog APL) , 1 바이트

복소수에서도 작동하며 1∠ θ를 반환합니다 .

×

TryAPL 온라인!


해당 내장 기능이 없으면 정수 (OP 당) :

¯11⌊⊢

¯1⌈ 부정적인 것 중 가장 큰 것

1⌊ 하나의 가장 작은

논쟁 거리

TryAPL 온라인!

... 그리고 일반적인 것 :

>∘0-<∘0

>∘0 0보다 큰

- 마이너스

<∘0 0보다 작은

TryAPL 온라인!


1
당신은 실제로 1 바이트로 그것을했습니다 ... 당신은 전설입니다. Jon Skeet이 자랑 스러울 것입니다.

@ 망고 농담이지? 이 문제에 대한 소수의 1 바이트 답변이 있습니다.
Adám

1
나는 냉소적이었다, 또한 이것이 내가 본 첫 번째 바이트 응답이기 때문에 말했다.

14

> <> , 9 8 바이트

바이트 저장을위한 Sp3000에 감사합니다.

'i$-%n/

에 인쇄 할 수없는 항목 0x01/있습니다.

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

설명

이것은 내 문자 코드 기반 Labyrinth answer 의 포트입니다 .

'     Push the entire program (except ' itself) onto the stack, which ends 
      with [... 1 47].
i     Read the first character of the input.
$-    Subtract the 47.
%     Take the 1 modulo this value.
n     Output the result as an integer.
0x01  Unknown command, terminates the program.

프로그램을 올바르게 종료하기 위해 ;인쇄 할 수없는 대신 법적으로 사용할 수 있다고 생각합니다.)0x01
Erik The Outgolfer

@EriktheOutgolfer 어쨌든 0x01밀어야 1합니다.
마틴 엔더

2
오,로 제안을 테스트 한 것 같습니다 123. 교훈 : 더 많은 사례로 테스트합니다.
Outgolfer Erik

14

Vim, 22 바이트

xVp:s/-/-1^M:s/[1-9]/1^M

@DJMcMayhem 덕분에 1 바이트를 절약했습니다 !

여기에, ^M리터럴 개행 문자입니다.

따라 @ nmjcman101는 의견에서 지적, 하나의 정규식 (사용할 수있는 :s/\v(-)=[^0].*/\11^M20 바이트)를 대신하지만, 이것은 망막 대답이 될 것으로 기본적으로 동일하기 때문에, 나는 내 자신의 방법을 고수하고있다.

설명:

xVp                        Delete everything except the first character. If the number is negative, this leaves a -, a positive leaves any number between 1 and 9, and 0 leaves 0.
   :s/-/-1^M               Replace a - with a -1
            :s/[1-9]/1^M   Replace any number between 1 and 9 with 1.

음수 (이전 버전)로 실행되는 gif는 다음과 같습니다.

부정으로 달리기

다음은 0으로 실행됩니다.

제로로 달리기

긍정적으로 달리기 :

긍정적으로 달리기


1
나는 당신의 방법을 정말로 좋아하지만 단일 정규식에서 가능합니다 ::s/\v(-)=[^0].*/\11
nmjcman101

디더링 된 콘솔 GIFs ... ??
Desty

12

///, 52 36 바이트

/a/\/1\/\///2a3a4a5a6a7a8a9a10a11/1/

언 골프, 설명 :

/2/1/
/3/1/
/4/1/
/5/1/
/6/1/
/7/1/
/8/1/
/9/1/
/10/1/
/11/1/

기본적으로 MapReduce 구현입니다. 즉 두 단계가 있습니다.

  • 숫자의 모든 항목을 바꿉니다 2- 9에 의해 1, 예를 들면 1230405->1110101
  • 11또는 쌍 101반복해서 줄입니다 ( 예 : 1110101->).1

-처음에 앞에 가 있으면 그대로 유지되고 출력은입니다 -1. 단일 0은 교체되지 않으므로 결과적으로 자체가됩니다.

업데이트 : Martin Ender 덕분에로 앨리어싱 //1/하여 16 바이트를 추가로 절약하십시오 a.

테스트 사례와 함께 온라인으로 사용해보십시오


2
이것은 매우 영리합니다!
Mego


11

미로 , 10 바이트

?:+:)%:(%!

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

설명

Labyrinth의 제어 흐름 시맨틱은 실제로 숫자의 부호를 결정하는 "자유로운"방법을 제공합니다. 3 방향 포크에서 선택한 경로는 부호가 음수인지 0인지 양수인지에 따라 달라지기 때문입니다. 그러나 지금까지 12 바이트 미만으로 접합이있는 프로그램을 맞출 수 없었습니다 (가능하더라도).

대신, 여기에는 분기가 필요없는 닫힌 양식 솔루션이 있습니다.

Code    Comment             Example -5      Example 0       Example 5
?       Read input.         [-5]            [0]             [5]
:+      Double.             [-10]           [0]             [10]
:)      Copy, increment.    [-10 -9]        [0 1]           [10 11]
%       Modulo.             [-1]            [0]             [10]
:(      Copy, decrement.    [-1 -2]         [0 -1]          [10 9]
%       Modulo.             [-1]            [0]             [1]
!       Print.              []              []              []

그런 다음 명령 포인터가 막 다른 골목에 도달하고 돌아 서서 %0으로 나누기를 시도하면 종료됩니다 .

입력을 두배로하는 입력이 작업을 할 필요가있다 1하고 -1, 그렇지 않으면 두 개의 모듈로 작업 중 하나가 이미 0으로 나누기를 시도 할 것이다.


1
당신의 코드는 행복하고 슬퍼합니다:D
Stefan

2
@Stefan 원하는 경우 순서를 변경할 수 있습니다. ;)
Martin Ender

9

PHP, 16 바이트

새로운 우주선 연산자를 사용합니다.

<?=$argv[1]<=>0;

이것이 PHP7 답변이라는 것을 잊지 마십시오. 그리고를 사용하고 있기 때문에 더 이상 바이트를 <?=사용 $_GET[n]하지 않는를 사용해야 합니다. 를 사용하려면 <?=웹 서버 (Apache와 같은) 내부에 있어야하며에 액세스 할 수 없습니다 $argv. <?php var_dump($argv);Apache를 통해 PHP 파일에서 실행 을 시도 하면이 표시 NULL됩니다.
Ismael Miguel

1
"<? =를 사용하려면 Apache와 같은 웹 서버 내부에 있어야합니다."아니요. <?=운영자는 명령 줄에서 제대로 작동합니다.
Alex Howansky

실행 php -r '<?=1'나는 얻을 PHP Parse error: syntax error, unexpected '<' in Command line code on line 1. 그러나 파일에서 제대로 작동하는 것 같습니다. 당신 말이 맞아요
Ismael Miguel

-r플래그는 코드를 실행하는 것입니다. 이것은 완전한 소스입니다. 파일에 저장 한 다음 실행php file.php
Alex Howansky

나는 이미 알아 냈습니다. (암시 적) -f매개 변수를 사용하여 파일에서 작동한다는 것을 실제로 알지 못했습니다 .
Ismael Miguel

9

Brain-Flak 74 42 40 바이트

1000000000 덕분에 2 바이트 절약

{([({}<([()])>)]<>(())){({}())<>}}{}({})

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

설명:

{                                }       # if 0 do nothing
   (          )                          # push:                           
    {}<     >                            # the input, after 
       (    )                            # pushing:
        [  ]                             # negative:
         ()                              # 1

 (                    )                  # Then push:
  [            ]                         # the negative of the input
                <>                       # on the other stack with:
                   ()                    # a 1 
                  (  )                   # pushed under it

                       {        }        # while 1: 
                        ({}())           # increment this stack and...
                              <>         # switch stacks

                                 {}      # pop the top (the counter or 0 from input)
                                   (  )  # push:
                                    {}   # the top (this is a no-op, or pushes a 0)


주위에 제로 모나드를 제거하여 2 바이트를 절약 할 수 있습니다(())
0 '


8

C, 24 20 19 18 바이트

이 두 가지 C 익스플로잇을 남용하여 골프를 쳤다. 이것은 C (GCC)입니다.

f(a){a=a>0?:-!!a;}

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


개정 이력 :

1) f(a){return(a>0)-(a<0);}// 24 바이트

2) f(a){a=(a>0)-(a<0);}// 20 바이트

3) f(a){a=a>0?:-1+!a;}// 19 바이트

4) f(a){a=a>0?:-!!a;}// 18 바이트


개정 1 : 첫 번째 시도. 간단한 논리

개정 2 : GCC에서 메모리 / 스택 버그 를 남용합니다. 내가 알 수있는 한 반환되지 않는 함수는 특정 경우에 마지막으로 설정된 변수를 반환합니다.

개정 3 : 정의되지 않은 결과가 조건부 결과를 반환하는 삼항 동작 남용 ( 제 삼항에 대한 실제 리턴이 0이 아닌 이유 )

개정 4 : 개정 2에서 참조 !!하기 위해 삼항 조건부 대체에서 부울 캐스트 ( )를 뺍니다 nil.


7

루비, 10 바이트

->x{x<=>0}

겠습니까 0.<=>도 작동, 또는 당신은 루비에서 그런 방법을 참조 할 수 없습니다?
Nic Hartley

.<=>1 개의 인수를 기대하므로 결국 0.<=> x더 길어집니다.
Seims

@QPaysTaxes 0.method:<=>루비에서 메소드 호출은 괄호를 사용하지 않으며 0.<=>인수가 너무 적은 메소드 호출로 해석되므로 필요합니다.
Cyoce

7

펄, 9 바이트

-E추가 비용없이 필요합니다 .

say<><=>0

용법

perl -E 'say<><=>0' <<< -9999
-1
perl -E 'say<><=>0' <<< 9999
1
perl -E 'say<><=>0' <<< -0
0

나는 물고기 연산자에 만족합니다!


1
실제로 "필수"는 아니지만 -E파일 대신 CLI에서 호출하는 경우에만 추가 비용이 들지 않는다고 생각합니다.
nyuszika7h

@ nyuszika7h 참으로 필요 내가 통해 테스트 방식에 맞춰 -e작동하지 않습니다,하지만 -E보다 더 이상으로 허용됩니다 -e. 메타에 대한 합의에 따라. 나는 그것이 조금 도움이되기를 바랍니다!
Dom Hastings

예, 스크립트가 파일에서 정상적으로 실행될 때 정상적으로 작동하기 때문에 추가 비용이 필요하지 않습니다.
nyuszika7 시간

7

스택 고양이 , 6 + 4 = 10 바이트

_[:I!:

​ -nm플래그의 경우 +4 바이트 n숫자 I / O 용이며 Stack Cats는 프로그램이 회 문식이어야 m하므로 소스 코드를 암시 적으로 미러링하여 원본 소스를 제공합니다.

_[:I!:!I:]_

온라인으로 사용해보십시오! 기본적으로 모든 좋은 스택 캣츠 골프와 마찬가지로, 이것은 무차별적인 힘으로 발견되었으며, 긴 시도로 수동 시도를 이기고 더 큰 프로그램에 쉽게 통합 할 수 없습니다.

D단계별 프로그램 추적을 보려면 플래그를 추가 하십시오 (예 : -nmDSTDERR / debug로 실행 및 확인).


스택 고양이는 바닥에 0으로 암시 적으로 채워진 스택 테이프를 사용합니다. 프로그램 시작시 모든 입력은 입력 스택에 푸시되며 입력은 -1암시 적 0에서 입력을 분리하기 위해베이스에 입력됩니다. 프로그램이 끝나면 현재 스택이 출력 -1됩니다 ( 기본이있는 경우 제외) .

관련 명령은 다음과 같습니다.

_           Perform subtraction [... y x] -> [... y y-x], where x is top of stack
[           Move left one stack, taking top of stack with you
]           Move right one stack, taking top of stack with you
:           Swap top two of stack
I           Perform [ if top is negative, ] if positive or don't move if zero. Then
                negate the top of stack.
!           Bitwise negate top of stack (n -> -n-1)

이러한 모든 명령은 반전이 가능하며 명령의 미러가됩니다. 이것은 스택 고양이의 전제입니다. 길이가 긴 프로그램도 자체 취소되므로 모든 사소한 종료 프로그램의 길이는 홀수입니다.

우리는 시작합니다

               v
               n
              -1
...  0    0    0    0    0  ...

_, 감산 상단을 -1-n[결과 하나의 스택을 왼쪽으로 이동 :

           v
       -1-n   -1
...  0    0    0    0    0  ...

:I스택 맨 위가 이제 0이므로 맨 위 2를 바꾸고 아무 것도 수행하지 않습니다. !그런 다음 비트 단위로 상위 0을 a -1:무시하고 상위 2를 다시 바꿉니다. !다음 비트는 회전 상단을 부정 -1-n으로 다시 n다시 :

          v
          n
         -1   -1
...  0    0    0    0    0  ...

이제 우리 I는 원래에 적용 되는를 기반으로 분기합니다 n.

  • 경우 n음, 우리는 하나의 스택을 왼쪽로 끝으로 이동 -n암시 제로에. :스왑하고 0을 맨 위에 놓고 방금 움직 ]인 0의 맨 위에 0을 이동시킵니다 -1. _그런 다음 빼고 최종 스택을와 같이 남겨두고 밑 이 무시 되므로 [-1 -1]하나만 -1출력 -1됩니다.

  • 경우 n제로, 우리는 이동하지 않는 :퍼팅, 스왑을 -1상단에. ]그런 다음 이것을 왼쪽 -1위로 오른쪽 -1으로 이동하고 _빼서 최종 스택을 남기고 [-1 0]0을 출력하고 밑을 무시합니다 -1.

  • 경우 n긍정적, 우리는 함께 올바른 스택과 끝을 이동 -nA의 -1. :스왑하고, -1맨 위에 놓고, 암시 적 0 위로이 오른쪽으로 ]이동 -1합니다. _그런 다음 빼고 0 - (-1) = 1최종 스택을 주고 남기고 [1]출력됩니다.


7

TI 기본, 8 바이트

median({1,Ans,~1

대체 솔루션 (자세한 의견 제안) :

max(~1,min(Ans,1               8  bytes
0:If Ans:Ans/abs(Ans           9  bytes
(Ans>0)-(Ans<0                 10 bytes

되어야하는 것은 무엇입니까 ~?
Conor O'Brien

TI-Basic의 빼기 기호를 구분하기위한 @ ConorO'Brien 음수 기호. Cemetech SC ~도이 토큰을 나타내는 데 사용한다는 것을 알고 있습니다.
Timtech

오, 멋지다. 나는 몰랐다.
Conor O'Brien

@ ConorO'Brien 글쎄, 지금 당신은 알고있다. 문의 해 주셔서 감사합니다 :)
Timtech

1
이 유효하지 않습니다 - 사용하는 Ans입력으로 유효한 기본 I / O 방법 인 기준을 충족하지 않는 (이 downvotes 두 배 많은 upvotes가 없습니다 - 현재는 + 19 / -12에서이다).
Mego

7

MATL , 6 바이트

0>EGg-

입력은 숫자 또는 배열 일 수 있습니다. 결과는 숫자 또는 해당 값을 가진 배열입니다.

온라인으로 사용해보십시오! 또는 배열 입력을 사용하여 여러 경우테스트하십시오 .

설명

내장 부호 기능 ( ZS)을 사용하지 않아도됩니다 .

0>   % Take input implicitly. Push 1 if positive, 0 otherwise
E    % Multiply by 2
Gg   % Push input converted to logical: 1 if nonzero, 0 otherwise
-    % Subtract. Implicitly display

MATL은 MatlabOctave 보다 깁니다 !
Adám

4
그는 ZS대답에서 말하는 것처럼 내장 기능을 사용할 수도있었습니다 .
Stewie Griffin


6

Mathematica, 4 바이트

Sign

주석에서 정확히 말한 내용


바이트를 저장sgn
Adám

3
WolframAlpha는 Mathematica와 동일하지 않습니다. 모호한 / 자연어 입력의 자동 해석을 포함합니다.
Greg Martin

그래서이 별도의 답변을 제출해야합니까?
Adám

나에게 합리적인 것 같습니다 ...
Greg Martin

6

옥타브, 26 24 바이트

f=@(x)real(asin(x))/pi*2

이것은 내 첫 번째 옥타브 답변입니다. 골프 팁은 높이 평가됩니다!

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

를 가져 asin오는 아이디어 는 다음과 같은 질문에서 나옵니다. output the sign:)

설명

참고 : 숫자를 나누고 pi곱하는 것은 2전체 숫자를 나누는 것과 같습니다.pi/2

사례 0:

asin(0)수율 0. 그것의 실제 부분을 취하고 그것을 나누는 것은 pi/2출력에 아무런 영향을 미치지 않습니다.

사례 positive:

asin(1)수율 pi/2. + 복잡한 숫자를 제공하는 asin것보다 큰 숫자 그 실수 부분을 제공 촬영 하고 그 분할에 의해 부여1pi/2pi/2pi/21

사례 negative:

asin(-1)수율 -pi/2. + 복소수 를 제공하는 asin것보다 작은 수의 그 실수 부분을 제공 촬영 하고 그 분할에 의해 부여-1-pi/2-pi/2pi/2-1


@LuisMendo N will be an integer나는 그것이 운이 좋다 :)
Kritixi Lithos

아, 나는 그 부분을 읽지 않았다 :)
Luis Mendo

1
C 리터 전자 V 전자의 R!
flawr

f=나머지는 유효한 비 재귀 함수 식인 경우 필요하지 않습니다 .
Cyoce

@Cyoce 죄송하지만 익명의 기능을 선호하지 않습니다
Kritixi Lithos

6

실제로 1 바이트

s

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

주석에서 정확히 말하는 또 다른 경우 s는 부호 기능입니다.

내장되지 않은 경우 (4 바이트) :

;A\+

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

;A\입력의 절대 값을 입력으로 나눕니다. 결과 -1는 음의 입력과 1양의 입력입니다. 불행히도, 0입력 0이 스택에 2 초 남았 기 때문에 실제로 오류 처리 (일이 잘못되면 명령이 무시 됨) 로 인해. +그것들을 추가하여 수정합니다 (다른 문제가 발생하여 무시됩니다).


6

Piet, 188 53 46 41 바이트

5bpjhbttttfttatraaearfjearoaearbcatsdcclq

온라인 통역사가 제공됩니다.

이 piet 코드는 기본적 (n>0)-(n<0)으로 부호 검사가 없으므로 표준을 수행합니다 . 실제로 내장 된 것보다 적지 않으므로이 방법에 대한보다 정확한 설명은 다음과 같습니다 (n>0)-(0>n).

위의 텍스트는 이미지를 나타냅니다. 인터프리터 페이지의 텍스트 상자에 이미지를 붙여 넣어 이미지를 생성 할 수 있습니다. 편의상 코덱 크기가 31 픽셀 인 이미지를 아래에 제공했습니다. 그리드는 가독성을 위해 존재하며 프로그램의 일부가 아닙니다. 또한이 프로그램은 흰색 코덱을 교차하지 않습니다. 프로그램 경계를 따르기 위해 이미지 테두리 주위의 컬러 코드를 따르십시오.

설명

프로그램

Instruction    Δ Hue   Δ Lightness   Stack
------------   -----   -----------   --------------------
In (Number)    4       2             n
Duplicate      4       0             n, n
Push [1]       0       1             1, n, n
Duplicate      4       0             1, 1, in, in
Subtract       1       1             0, in, in
Duplicate      4       0             0, 0, in, in
Push [4]       0       1             4, 0, 0, in, in
Push [1]       0       1             1, 4, 0, 0, in, in
Roll           4       1             0, in, in, 0
Greater        3       0             greater, in, 0
Push [3]       0       1             3, greater, in, 0
Push [1]       0       1             1, 3, greater, in, 0
Roll           4       1             in, 0, greater
Greater        3       0             less, greater
Subtract       1       1             sign
Out (Number)   5       1             [Empty]
[Exit]         [N/A]   [N/A]         [Empty]

파일 크기를 더 줄이려면 실제로 했던 것처럼 파일을 압축하는 대신 실제로 프로그램 (gasp)을 변경해야합니다 . 나는 이것을 36으로 골프화하는 하나의 행을 제거하고 싶습니다. 실제로 코드를 더 작게 만들기 위해 코드를 변경하는 것이 코드 골프가 아니기 때문에 훨씬 작은 입력 형식을 갖는 자체 인터프리터를 개발할 수도 있습니다.

mods는 전체 파일 크기가 Piet 코드에 중요하다고 말했습니다. 인터프리터는 텍스트를 유효한 입력으로 받아들이고 원시 텍스트는 이미지보다 훨씬 적은 바이트 수를 가지므로 텍스트가 확실한 선택입니다. 나는 이것에 대해 건방진 사과를하지만 규칙을 만들지 않습니다. 이것에 대한 메타 토론 은 그 문제에 대한 나의 의견을 분명히합니다.

그것이 Piet의 정신에 위배된다고 생각하거나 어떤 이유로 든 이것을 더 논의하고 싶다면 meta에 관한 토론을 확인하십시오 .


2
Piet의 관례는 모든 코덱 을 세는 입니다.
SuperJedi224

@ SuperJedi224 그것은 메타 포스트에서 결정된 것이 아니며 이미지의 바이트 수처럼 보이는 것입니다.
Mike Bufardeci

6

Pushy , 7 바이트

이것은 아마도 내가 작성한 가장 이상한 프로그램 일 것입니다 ...

&?&|/;#

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

제로 나누기 오류를 피하기 위해 sign(x) = abs(x) / x명시 적으로 사용 sign(0) = 0합니다.

          \ Take implicit input
&?   ;    \ If the input is True (not 0):
  &|      \  Push its absolute value
    /     \  Divide
      #   \ Output TOS (the sign)

때문에 작품 x / abs(x)이다 x는 긍정적이고 -1x가 음수입니다. 입력이 0이면 프로그램이 출력 명령으로 이동합니다.


4 바이트 (비경쟁)

휴일과 시간이 너무 많아서 Pushy 통역사를 완전히 다시 작성했습니다. 위의 프로그램은 여전히 ​​작동하지만 0 / 0이제 기본값은 0이므로 다음이 더 짧습니다.

&|/#

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


1
나는 또한 사용 abs에 대해 생각하고 있었지만 0. 잘 했어!
Kritixi Lithos

5

R, 25 바이트

'if'(x<-scan(),x/abs(x),0)

숫자를 STDIN으로 가져갑니다. 그런 다음 0이 아닌지 확인 x/|x|하여 둘 중 하나 1를 반환 -1하고 0이면 0을 출력합니다 x=0.

이것은 sign물론 내장 을 사용하지 않습니다 .


1
내장 사용은 물론 짧지 만 재미는 없습니다 sign(scan()).
Billywob

죄송합니다. 내장을 피하는 것을 명시 적으로 언급해야합니다.
JAD

5

V 14 12 바이트

2 바이트에 대해 @DJMcMayhem에게 감사합니다. reg-ex를 사용하여 대체를 수행합니다. 내장되어 있지 않기 때문에 재미 있습니다. 더 재미있는 기능이 있지만 예상 한대로 작동하지 않습니다.

ͨ-©½0]/±1

테스트 사례 확인

이것은 :%s/\v(-)=[^0].*/\11하나 이상의 -다음에 0이 아닌 다른 숫자 와 일치 하는 횟수로 변환됩니다. 첫 번째 일치 (따라서 -또는 아무것도 아님) 및 a 로 대체됩니다 1. 정규식은 0과 일치하지 않으므로 그대로 유지됩니다.

더 재미있는 방법 (21 바이트)

é
Àé12|DkJòhé-òó^$/a

TryItOnline

이것은 입력을 버퍼가 아닌 인수로 받아들입니다.

é<CR> 새 줄을 삽입하십시오.

À인수를 V 코드로 실행하십시오. a -는 커서를 이전 줄로 옮기고, 어떤 숫자라도 다음 명령의 카운트가됩니다.

é1삽입 (계산) 1

2| 두 번째 열로 이동

D 두 번째 열부터 모든 문자를 삭제하십시오 (한 문자 만 남음).

kJ 두 줄을 합치십시오.

òhé-ò" hé-중단까지 실행"으로 번역됩니다 . 1이 두 번째 줄에 있으면 h 직후에 끊어집니다. 첫 번째 줄에 있으면 나누기 -전에 a 를 삽입합니다 .

ó^$/a이 사실 수정 -1, 0, 1빈을 떠나을 인수 레지스터와 빈을 대체합니다.


그 페이지를 더 잘 읽어야한다는 것을 알았습니다. 실제로는 짧지 않습니다-0을 잊어 버렸지 만 인수로 숫자를 가져 와서 시도했습니다 Àé1. 양수는 1의 문자열을 제공하고 음수는 1 행의 문자열을 제공해야하며 0은 아무 것도 제공하지 않습니다. 음수 비트는 작동 À하지 않았지만d$@"
nmjcman101

아 작동하지 않는 이유는 다른 행이 없기 때문입니다. 추가 é<cr>하면 두 개의 빈 줄이 생겨 작동 합니다. 당신이 완전한 답을 얻기 위해 그것을 사용할 수 있는지 확실하지 않습니다
DJMcMayhem

나는 또 다른 줄을 가졌으며, 내 의견에 명시 적으로 말하지 않았습니다. --당신이 추가 한 주장 은 무엇입니까 ?
nmjcman101

1
"옵션 끝"을 의미합니다. -6docopt (명령 행 옵션을위한 파이썬 라이브러리)는 플래그로 시작 하므로 인수가 아니라 명령 행 플래그라고 생각합니다. 옵션을 추가 --하는 것이 아니라는 신호 만 추가 합니다. 그렇지 않으면 유효하지 않은 명령 행 호출로 인해 전혀 실행되지 않습니다.
DJMcMayhem

5

C #, 16 15 바이트

Neil 덕분에 개선 된 솔루션

n=>n>0?1:n>>31;

또는 내장 메소드의 길이 가 1 바이트 더 깁니다.

n=>Math.Sign(n);

테스트 케이스가 포함 된 전체 프로그램 :

using System;

public class P
{
    public static void Main()
    {
        Func<int,int> f =
        n=>n>0?1:n>>31;

        // test cases:
        for (int i=-5; i<= 5; i++)
            Console.WriteLine(i + " -> " + f(i));
    }
}

2
n>>31대신 사용해보십시오 n<0?-1:0.
Neil

1
내장이 가장 짧은 솔루션이 아닌 경우 조금 슬프다.
Mego

C #이 다소 장황한 것으로 알려져 있다고하자.
adrianmp

1
A) ;람다는 진술이 아니라 표현이므로 후행이 필요하다고 생각하지 않습니다 . B) Math.Sign또는 Math::Sign이와 유사한 것이 유효한 제출물입니까? C #이 특히 메소드를 처리하는 방법을 잘 모르겠습니다. 기본적으로 올바른 유형으로 초기화 된 x = Math.Sign;경우 유효한 C # 문 x입니까?
Cyoce
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.