비트 플립과 부정


42

정수가 주어지면 0단항 부정 -및 비트 보수 ~( ~n= -n-1)를 사용하여 연산자를 오른쪽에서 왼쪽으로 적용 하여 식을 만듭니다 .

...
-3  = ~-~-~0
-2  = ~-~0
-1  = ~0
 0  = 0
 1  = -~0
 2  = -~-~0
 3  = -~-~-~0
...

당신의 표현의 중복되는 부분을 의미합니다 가능한 한 짧은으로해야합니다 ~~, --, -0, 또는 00. 표현식을 문자열 또는 문자 시퀀스로 출력하거나 인쇄하십시오.


11
그래서 ... 당신은 우리가 우리의 물건을 내려 놓고 뒤집고 뒤집기를 원합니까?
Jordan

1
~와 0 사이의 공백이 허용됩니까?
Adám

아니요, 문자열을 정확하게 출력하십시오.
xnor

답변:


17

파이썬, 32 바이트

lambda x:("-~"*abs(x))[x<0:]+"0"

익명의 람다 함수. 정수 x가 "-~"abs (x) 시간을 쓰고 x가 음수이면 첫 번째 문자를 제거하면 0이 끝에 추가됩니다.


아, 이길 수 있습니다.
mbomb007

나는 너무 같은 쓴 -로 n의 자리에 x'장소에 ":)
조나단 앨런

2
@JonathanAllan 그러면 안전하게 속임수로 간주 할 수 있습니다.
Outgolfer Erik

16

자바 스크립트 (ES6), 33 31 바이트

f=x=>x<0?"~"+f(~x):x&&"-"+f(-x)

재귀 <내장 <루프 (적어도이 경우). 기본적으로 입력을 평가하지 않습니다.

  • 0보다 작 으면 뒤집고 ~문자열 에 a 를 추가하십시오 .
  • 0보다 크면 무효화 -하고 문자열 에 a 를 추가하십시오 .
  • 정확히 0이면 0을 반환합니다.

이 패턴을 활용합니다.

 0         = 0
-1 = ~( 0) = ~0
+1 = -(-1) = -~0
-2 = ~(+1) = ~-~0
+2 = -(-2) = -~-~0
-3 = ~(+2) = ~-~-~0
+3 = -(-3) = -~-~-~0
etc.

11

Pyth, 14 13 12 바이트

_<>0Q+0sm"~-

@StevenH 덕분에 -2 바이트.

테스트 스위트

Pyth를 사용해보기로 결정했기 때문에 파이썬 답변 을 번역 했습니다. 어떤 도움을 환영합니다!

설명:

_<>0Q+0sm"~-     
        m"~-     # Map "~-" onto the input (= a list of n times "~-").
       s         # Join the list to a string.
     +0          # Add "0" in front. 
 <>0Q            # Slice off the last char if the input is negative.
_                # Reverse the whole thing.

마지막에 암시 적 입력을 사용하여 1 바이트를 저장하십시오. >0대신<Q0
Steven H.

@StevenH. 감사합니다! 이제 우리는 가장 짧은 답변을 얻었습니다!
KarlKastor

2
매우 다른 해결책 (불행히도 바이트를 절약하지 못함) :tW>0Q_+0sm"~-
Steven H.

2
@StevenH. 귀하의 솔루션을 12로 낮추었습니다 _<>0Q+0sm"~-.이 솔루션을 내 솔루션에 추가하기를 바랍니다.
KarlKastor

8

C, 46 바이트

m(x){putchar(x?x<0?126:45:48);x&&m(-x-(x<0));}

대부분의 (모두?) 다른 답변과 달리이 답변은 연산자 ~-하나씩 출력합니다 .




7

38 35 33 (-p의 경우 23 + 1) 24

s/\d+/"-~"x$&.0/e;s;--;

Dada 덕분에 -13


당신은 아마 -p대신에 의미 했습니다 -r. 또한 마지막 괄호와 세미콜론을 제거 할 수 있습니다 : if$h<0충분합니다.
Dada

고마워 나는 sed에 너무 많은 답변을 쓰고 있다고 생각합니다.
Riley

아마. (마지막 2 괄호도 제거)
Dada

$h<0&&s;.;대신에 2 바이트를 절약 할 수도 있습니다 s/.// if $h<0. ( 코드 끝에 -pa ;를 추가 하므로, last ;는 필요하지 않습니다 s;.;;. a if b대략적으로와 동일 b && a하지만이 경우 공백을 제거 할 수 있기 때문에 1 바이트를 절약 할 수 있습니다)
Dada

고마워요 -p도 추가했습니다 ;.
Riley

6

Dyalog APL , 18 바이트

'0',⍨0∘>↓'-~'⍴⍨2×|

'0',⍨ 문자 0이 추가됨

0∘> 부정성 (즉, 0 미만의 숫자의 경우 1, 0 이상의 숫자의 경우 0)

에서 떨어졌다

'-~'⍴⍨ 문자열 "~-"는 주기적으로 길이가 바뀐다

두 번

| 절대 값

+ ...을 더한

0∘< 긍정적 (즉, 0보다 큰 숫자의 경우 1)

TryAPL 온라인!


6

하스켈, 41 바이트

f n=['-'|n>0]++(tail$[1..abs n]>>"-~")++"0"

f n|n<0=tail$f(-n)|x<-[1..n]>>"-~"=x++"0"

3 바이트에 대한 nimi 덕분에


tail에 실패합니다 n=0. drop 1대신 사용할 수 있습니다 .
nimi

@nimi 감사합니다; 어떻게 그리웠는지 모르겠습니다.
BlackCap

1
그렇지 않다면 경비를 낭비하지 마십시오 : f n|n<0=tail.f$abs n|x<-[1..n]>>"-~"=x++"0".
nimi

1
저장할 2 바이트 : ...|n<0=tail$f(-n)|....
nimi

5

V , 21 바이트

/ä
é
D@"ña-~ñá0kgJó--

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

V는 숫자 지원 이 매우 제한되어 있으며 실제로 음수 개념이 없습니다. 즉, 음수 (또는 0)를 지원하려면 해킹 방법을 사용해야합니다.

설명:

/ä                  "Move forward to the first digit
é                   "And enter a newline
D                   "Delete this number, into register '"'
 @"                 "That number times:
   ñ   ñ            "Repeat the following:
    a               "  Append the string:
     -~             "  '-~'
        á0          "Append a 0
          k         "Move up a line
           gJ       "And join these two lines together
             ó--    "Remove the text '--', if it exists

5

자바 스크립트 (ES6), 39 37 바이트

x=>"-~".repeat(x<0?-x:x).slice(x<0)+0

@Neil 덕분에 2 바이트 절약


5

젤리 , 10 바이트

A⁾-~ẋḊẋ¡N0

이것은 전체 프로그램입니다. 온라인으로 사용해보십시오!

작동 원리

A⁾-~ẋḊẋ¡N0  Main link. Argument: n

A           Take the absolute value of n.
 ⁾-~ẋ       Repeat the string "-~" that many times. Result: s
       ¡    Conditional application:
     Ḋ        Dequeue; remove the first element of s...
      ẋ N     if s, repeated -n times, is non-empty.
         0  Print the previous return value. Set the return value to 0.
            (implicit) Print the final return value.

5

자바 7, 95 79 바이트

79 바이트 :

String s(int x){String t=x<0?"~":"";while((x<0?++x:x--)!=0)t+="-~";return t+0;}

언 골프 드 :

String s(int x) {
    String t = x<0 ? "~" : "";
    while((x<0 ? ++x : x--) != 0)
        t += "-~";
    return t+0;
}

이전 버전 (95 바이트) :

String s(int x){return new String(new char[x<0?-x:x]).replace("\0","-~").substring(x<0?1:0)+0;}

용법:

class A {
    public static void main(String[]a) {
        System.out.println(s(-3));
        System.out.println(s(-2));
        System.out.println(s(-1));
        System.out.println(s(0));
        System.out.println(s(1));
        System.out.println(s(2));
        System.out.println(s(3));
    }
    static String s(int x){String t=x<0?"~":"";while((x<0?++x:x--)!=0)t+="-~";return t+0;}
}

여기 사용해보십시오!

산출:

~-~-~0
~-~0
~0
0
-~0
-~-~0
-~-~-~0

안녕하세요, PPCG에 오신 것을 환영합니다! 좋은 첫 포스트!
Rɪᴋᴇʀ

PPCG에 오신 것을 환영합니다! 흠, 그것은 내 것보다 짧은 해결책이므로 대신 내 대답을 삭제하고 대신 답장을 보내겠습니다. :)
Kevin Cruijssen


3

엑셀 : 55 33 바이트

=REPT("-~",IF(A1>0,A1,ABS(A1)-1))&"0"

입력은 A1 셀에 숫자를 넣는 형태입니다. 공식은 A1을 제외한 모든 곳으로 갈 수 있습니다.


나는 그것이 음수에 대해 효과가 있다고 생각하지 않습니다 ...
pajonk

3

T-SQL, 87 바이트

select substring(replicate('-~',abs(x)),case when x<0then 2 else 1 end,x*x+1)+'0'from #

x*x+1substring 의 조건은 x^2+1>=2*abs(x)all 때문에 충분 합니다 x.

일반적으로 SQL에서 입력은 테이블에 저장됩니다.

create table # (x int)

insert into # values (0)
insert into # values (1)
insert into # values (-1)
insert into # values (2)
insert into # values (-2)

3

CJam , 18 14 바이트

Emigna의 답변 에서 4 바이트를 절약하기 위해 영감을 얻었습니다 .

li_z"-~"*\0<>0

온라인으로 사용해보십시오! (줄 바꿈으로 구분 된 테스트 스위트입니다.)

설명

li      e# Read input and convert to integer N.
_z      e# Duplicate and get |N|.
"-~"*   e# Repeat this string |N| times.
\0<     e# Use the other copy of N to check if it's negative.
>       e# If so, discard the first '-'.
0       e# Put a 0 at the end.

3

Vim-31 번의 키 스트로크

첫번째 vim 골프는, 많은 물건을 놓쳤다.

`i-~<esc>:s/-\~-/\~-/dwp<left>ii<esc><left>d$@"<esc>a0`

좋아, 클럽에 온 걸 환영 해! :) 당신이 할 수있는 :s/^-대신 :s/-\~/\~-하고 D대신d$
DJMcMayhem

이제 그것에 대해 생각하기 때문에 이것이 0을 처리한다고 생각하지 않습니다. 삭제하기 전에 증가 <C-a>하고 끝에서 두 문자를 삭제 하여이 문제를 해결할 수 있습니다 .
DJMcMayhem

@DJMcMayhem 아, 0i작동하지 않습니까?
Maltysen

안타깝게도 아닙니다. 0커서를 현재 행의 첫 번째 문자로 이동합니다. V에서 카운트로 0을 사용할 수 있습니다.
DJMcMayhem

2

Matlab, 61 바이트

x=input('');A=repmat('-~',1,abs(x));disp([A((x<0)+1:end) 48])


2

펄 6 , 25 바이트

{substr '-~'x.abs~0,0>$_}

설명:

{
  substr
    # string repeat 「-~」 by the absolute value of the input
    '-~' x .abs

    # concatenate 0 to that
    ~ 0

    ,

    # ignore the first character of the string if it is negative
    0 > $_
}

2

젤리, 14 12 바이트

@Dennis 덕분에 -2 바이트

0>‘
A⁾-~ẋṫÇ0

TryItOnline 에서 테스트

어떻게?

0>‘      - link 1 takes an argument, the input
0>       - greater than 0? 1 if true 0 if false
  ‘      - increment

A⁾-~ẋṫÇ0 - main link takes an argument, the input
      Ç  - y = result of previous link as a monad
A        - x = absolute value of input
 ⁾-~     - the string "-~"
    ẋ    - repeat the sting x times
     ṫ   - tail repeatedString[y:] (y will be 1 or 2, Jelly lists are 1-based)
       0 - implicit print then return 0

2

> <>, 18 + 3 = 22 바이트

:?!n0$-:0):1go-
-~

온라인으로 사용해보십시오! ​ -v플래그가 입력으로 스택을 초기화하기 위해 +3 바이트 . STDIN이 비어 있다고 가정하면 바이트 수가 짧습니다.

:?!ni*:0):1go-
-~

프로그램은 입력 n이 0에 도달 할 때까지 필요한대로 입력 을 계속 뒤집어 오류가 발생합니다.

[Loop]
:?!n      If n is 0, output it as a num. If this happens then the stack is now
          empty, and the next subtraction fails
0$-       Subtract n from 0
:0)       Push (n > 0)
:1go      Output the char at (n>0, 1) which is a char from the second line
-         Subtract, overall updating n -> -n-(n>0)

2

옥타브, 51 바이트

x=input('');[("-~"'*[1:abs(x)>0])((x<0)+1:end),'0']

처음에는 @pajonk에 의해 Matlab 접근 방식을 뻔뻔스럽게 복사 한 다음 일부 세부 사항을 수정하여 벡터와 문자 "-~"사이의 "외부 제품"으로 다시 작성하고 즉석 인덱싱을 남용 합니다. )를 사용하면 바이트를 절약 할 수 있습니다. 더 적은 바이트를 사용하기 위해 인덱스 표현식을 얻을 수 없다는 것이 여전히 약간 고통 스럽습니다.

Octave는 Matlab이 인덱싱 사이에 변수를 저장하기를 원하는 인덱싱을 위해 a (i1) (i2) 또는 심지어 (...) (i1) (i2)를 허용합니다.

((x<0)+1:end)

"skip first if"를 설명하기에는 너무 깁니다. 더 좋은 방법이 있어야합니다.


2

PseudoD , 688 579 521 바이트

utilizar mate.pseudo
utilizar entsal.pseudo
adquirir n
adquirir a
adquirir r
adquirir i
fijar n a llamar LeerPalabra finargs
si son iguales n y CERO
escribir {0}
salir
fin
fijar a a llamar ValorAbsoluto n finargs
fijar i a CERO
si comparar Importar.Ent.Comparar n < CERO
fijar r a {~}
sino
fijar r a {-}
fin
mientras comparar Importar.Ent.Comparar i < a
escribir r finargs
si son iguales r y {~}
fijar r a {-}
Importar.Ent.Sumar i UNO i
sino
fijar r a {~}
fin
finbucle
si son iguales r y {~}
escribir {~}
fin
escribir {0}

설명:

Read a number from STDIN;
If the number is zero (0); Then:
    Writes 0 to STDOUT and exits;
End If;
If the number is less than zero (0); Then:
    Set the fill character to "~";
Else:
    Set the fill character to "-";
End If;
For i = 0; While i is less than abs(number); do:
    Write the fill character to STDOUT;
    If the fill character is "~":
        Set the fill character to "-"
        Increment i by one
    Else:
        Set the fill character to "~"
    End if;
End for;
If the fill character is "~"; Then:
    Write "~" to STDOUT;
End If;
Write "0" to STDOUT

1
PPCG에 오신 것을 환영합니다! 그것이 작아 지는가? 아마 당신이 아마 줄일 수있는 긴 식별자 ( "relleno"를 "r", menos relleno : P)를 봅니다. 함수 또는 코드 스 니펫 인 경우 표준 lib에 대한 가져 오기를 삭제할 수 있다고 생각합니다. 출력에서 줄 바꿈을 요구하지 않으므로 마지막 EscribirLinea를 Escribir로 변경할 수 있습니다. 짧은 이름 ( adquirir e``fijar p a Escribir)에 함수를 할당 할 수 있습니까 ?
페더


1

PHP, 58 바이트

<?=((0<$a=$argv[1])?'-':'').str_pad('0',2*abs($a),'~-',0);

1

미로 , 25 바이트

`?+#~.
.  ; 6
54_"#2
  @!

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

설명

나는 이것의 제어 흐름을 정말로 좋아한다. IP는 코드를 통해 그림 8 (또는 실제로 ∞)으로 실행되어 0해당 문자를 인쇄하는 동안 입력을 천천히 줄 입니다.

코드는 왼쪽 상단에서 오른쪽으로 시작합니다. 은 `지금 아무것도하지 않습니다. ?입력을 읽고 +아래의 암시 적 0에 추가합니다. 물론 아무것도하지 않지만이 코드를 다시 실행하면 ?EOF에 있기 때문에 0 +을 누른 다음 해당 0을 제거합니다.

다음으로 #스택 깊이를 높이면 스택에 양의 값이있어 IP를 남쪽으로 돌리고 ;다시 버립니다.

"아무 조합없고 코드의 주요 지점 역할을합니다. 구별 할 세 가지 경우가 있습니다.

  • 현재 값이 양수이면 IP가 오른쪽 (서쪽)으로 바뀌고 왼쪽 루프의 한 라운드를 완료합니다.

    _45.`?+
    _45      Push 45.
       .     Print as character '-'.
        `    Negate the current value (thereby applying the unary minus).
         ?+  Does nothing.
    
  • 현재 값이 음수이면 IP가 왼쪽 (동쪽)으로 바뀌고 다음 코드가 실행됩니다.

    #26.~
    #        Push stack depth, 1.
     26      Turn it into a 126.
       .     Print as character '~'.
        ~    Bitwise NOT of the current value (applying the ~).
    

    입력 값이 0이 될 때까지이 두 값이 번갈아 나타납니다 (둘 다 입력 부호를 변경하므로). 그 시점에서 ...

  • 현재 값이 0이면 IP는 단순히 남쪽으로 계속 이동하고를 실행 한 !다음 서쪽을로 바꿉니다 @. !를 출력 0하고 @프로그램을 종료합니다.

1

GolfScript ,30 24 20 바이트

  • xnor 덕분에 6 바이트를 절약했습니다.
  • Dennis 덕분에 4 바이트를 절약했습니다.

~."-~"\abs*\0<{(;}*0

입력: -5

산출: -5 = ~-~-~-~-~0

설명

~.     # Input to integer and duplicate
"-~"   # We shall output a repetition of this string
\abs   # Move the input onto the stack and computes abs
*      # Multiply "-~" for abs(input) times
\      # Copy onto the stack the input
0<     # Is it less than 0?
{(;}*  # Yes: remove first '-' from the output
0      # Push 0

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


1
당신은 인쇄하지 않아도 2 = , 단지를 -~-~0.
xnor

1
{(;}*0대신 사용할 수 있습니다 {(;}{}if 0.
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.