이진 문자열을 비트 단위로 반전하는 가장 짧은 코드


79

초보자가 시도 할 수있는 쉬운 질문이 충분하지 않다고 생각합니다.

도전 과제 : 1과 0의 임의의 입력 문자열은 다음과 같습니다.

10101110101010010100010001010110101001010

다음과 같이 비트 단위의 역수를 출력하는 가장 짧은 코드를 작성하십시오.

01010001010101101011101110101001010110101

답변:


88

J, 5 바이트

입력 문자열이 variable이라고 가정합니다 b.

b='0'

이것은 대부분의 언어에서 할 수있는 일은하지 않습니다 ...

J 개의 비교 연산자는 단지 인 =( =:그리고 =., 각각의 글로벌 및 로컬 할당하다). 그러나 =일반 ==연산자 처럼 작동하지 않습니다 . 항목별로 비교합니다. 배열은 다음과 같이 구성 0 2 3 2 3 1 2 3 4됩니다. 예를 들어 2 = 0 2 3 2 3 1 2 3 4제공 0 1 0 1 0 0 1 0 0합니다. 이 문자열 비슷 'a'='abcadcadda'단지 반환하지 않습니다 0그것을 반환, 1 0 0 1 0 0 1 0 0 1(이것은 의미하는 것으로 추정 할 수 0와 함께 */기본적으로 의미한다 all, 그러나이 경우.) 우리는 1과 0의 문자열을 원하기 때문에이 문제가, excelent, 또는 참과 거짓. J의 bools 이후 이다 10,이 배열의 결과 1S '및0(문자열 이 아니며이 배열을 1생성하는 것 이외의 다른 모든 문자 0입니다.) 인쇄 할 필요가 없습니다. J는 표현식의 결과를 자동으로 인쇄합니다. 나는 이것이 적절하지 않은 설명이기를 바랍니다. 그렇지 않은 경우 의견에 아직 명확하지 않은 것을 요청하십시오. 이 답변은 '0'&=(또는 =&'0') 있었을 수도 있지만 b='0'더 명확 하다고 느꼈습니다 .


1
나는 J를 시도했다. 그것에 나의 마음을 구부릴 수 없다. 좋은 문서를 찾지 못했습니다. 여기, 미친 사람으로 +1하십시오.
seequ

1
그리고 이것이 제가 절대 J를 사용하지 않는 이유입니다.
Qix

2
@Qix J처럼 읽을 수없는 것처럼 이것은 실제로 의미가 있으며 벡터 LHS와 스칼라 RHS를 취하는 연산자가있는 다른 언어도 비슷하게 작동합니다.
hvd

1
뭐? 올바른 결과를 반환하지 않습니까? 결과는 공백이없는 텍스트 문자열이어야하지만 J에 대한 제한된 지식으로 표시 형식이 0 1 0 1 0 인 부울 목록을 반환한다고 생각합니다.
Adám

4
입력이 특정 변수에 저장되어 있다고 가정 할 수 없으므로 허용되지 않습니다. =&'0'같은 바이트 수로 작동합니다.
Esolanging 과일

43

GolfScript , 5 바이트

{1^}%

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

작동 원리

  • GolfScript는 STDIN에서 전체 입력을 읽고 스택에 문자열로 배치합니다.

  • {}% 문자열의 모든 문자를 거치고 모든 문자에 대해 코드 블록을 실행합니다.

  • 1^ "0"은 ASCII 코드 48에 해당하고 "1"은 ASCII 코드 49에 해당합니다.

    48 ^ 1 = 49및 이므로 49 ^ 1 = 480을 1로, 1을 0으로 바꿉니다.

  • 완료되면 GolfScript는 수정 된 문자열을 인쇄합니다.


6
잠깐만, golfscript ?
ToonAlfrink

나는 당신의 질문을 잘못 해석했습니다. 지금 수정했습니다.
데니스

1
@ tolos : 내 답변을 편집했습니다.
데니스

5
@ToonAlfrink GolfScript와 같은 골프 언어는 특정 목적에 맞게 설계되지 않은 '일반 목적'인 한 모든 문제에 적용됩니다.
kitcar2000

4
@ kitcar2000 코드 골프 문제에서 GolfScript를 사용하는 사람을 놀라게하기보다는 그러한 언어가 존재한다는 사실에 더 놀랐다고 생각합니다.)
Chris Cirefice

35

CJam-4

q1f^

이 xor의 모든 문자는 1입니다.
다른 CJam 답변과 달리 입력이 이미 스택에 있다고 가정하지 않습니다.

http://cjam.aditsu.net/ 에서 시도 하십시오


2
그래서 그건 당신이 사용하는 방법 f.
데니스

@Dennis Indeed. 당신은 sf 포럼을 사용하여 질문 btw :)
aditsu

30

DOS의 x86 기계 코드- 14 13 11 바이트

글쎄, 그것은 다시 짧아졌다! 관련이없는 문제에 대한 솔루션을 작성한 후에도 동일한 트릭이 여기에도 적용될 수 있음을 알았습니다. 그래서 우리는 간다 :

00000000  b4 08 cd 21 35 01 0a 86  c2 eb f7                 |...!5......|
0000000b

주석이 달린 어셈블리 :

    org 100h

section .text

start:
    mov ah,8        ; start with "read character with no echo"
lop:
    ; this loop runs twice per character read; first with ah=8,
    ; so "read character with no echo", then with ah=2, so
    ; "write character"; the switch is performed by the xor below
    int 21h         ; perform syscall
    ; ah is the syscall number; xor with 0x0a changes 8 to 2 and
    ; viceversa (so, switch read <=> write)
    ; al is the read character (when we did read); xor the low
    ; bit to change 0 to 1 and reverse
    xor ax,0x0a01
    mov dl,al       ; put the read (and inverted character) in dl,
                    ; where syscall 2 looks for the character to print
    jmp lop         ; loop

이전 솔루션-13 바이트

나는 이것보다 훨씬 짧지 않다고 생각합니다.실제로 그렇습니다! 바이트를 하나 더 줄인 @ninjalj에게 감사합니다.

00000000  b4 08 cd 21 34 01 92 b4  02 cd 21 eb f3           |...!4.....!..|
0000000d

이 버전은 고급 인터랙티비티 기능을 제공 합니다. 명령 행에서 실행 한 후 입력 숫자 (반향되지 않음)를 쓰는 한 "반전 된"문자를 뱉어냅니다. 종료하려면 Ctrl-C를 수행하십시오.

이전 솔루션과 달리 DosBox에서 실행하는 데 약간의 문제가 있습니다. DosBox 가 Ctrl-C를 올바르게 지원하지 않기 때문에 종료하려면 DosBox 창을 닫아야합니다. 대신 DOS 6.0이 설치된 VM에서는 의도 한대로 실행됩니다.

NASM 소스 :

org 100h

section .text

start:
    mov ah,8
    int 21h
    xor al,1
    xchg dx,ax
    mov ah,2
    int 21h
    jmp start

오래된 솔루션- 27 25 22 바이트

이것은 커맨드 라인으로부터의 입력을 받아 들였다; DosBox에서 .COM 파일로 부드럽게 실행됩니다.

00000000  bb 01 00 b4 02 8a 97 81  00 80 f2 01 cd 21 43 3a  |.............!C:|
00000010  1e 80 00 7c f0 c3                                 |...|..|

NASM 입력 :

    org 100h

section .text

start:
    mov bx, 1
    mov ah, 2
loop:
    mov dl, byte[bx+81h]
    xor dl, 1
    int 21h
    inc bx
    cmp bl, byte[80h]
    jl loop
exit:
    ret

2
코드가 +1이면 많은 사람들이 이해하지 못할 것입니다.
Knerd

1
xchg dx,ax1 바이트보다 짧은mov dl,al
ninjalj

@ninjalj :와, 고마워요! 그것은 않았다 결국 짧아!
Matteo Italia

26

Bash + coreutils, 8 바이트

tr 01 10

STDIN에서 입력을받습니다.


또는

sed, 8 바이트

y/01/10/

2
최근에 Bash github.com/professorfish/bash-shelf에 대한 골프 라이브러리 / 별명을 설정했습니다 . 다음과 같이 한 문자를 깎을 수 있습니다.y 01 10

1
여기서 BASH는 어디에 관련되어 있습니까? BASH는 무엇입니까? 모든 쉘은 다음을 호출 할 수 있습니다 tr.
yeti

1
@yeti 모든 쉘이 bash 또는 zsh와 같은 명령을 호출하는 것은 아닙니다. 일부 쉘에서는 코드 자체만으로 구문 오류가 발생합니다.
nini

5
"쉘"이 "POSIX 호환 쉘"을 의미한다고 가정하는 것이 아마 안전 할 것입니다 ...
FireFly

@professorfish 당신은 하나의 문자를 면도 한 다음 기능을 포함하여 48을 추가합니다. 어떻게이기는거야?
Steven Penny

20

CJam , 4 바이트

:~:!

원래 문자열이 이미 스택에 있다고 가정합니다. 수정 된 문자열을 인쇄합니다.

다음 코드 를 붙여 온라인 으로 사용해보십시오 .

"10101110101010010100010001010110101001010":~:!

작동 원리

  • :~문자열의 각 문자를 평가합니다. 즉, 문자 0을 정수 0으로 바꿉니다 .

  • :!각 정수의 논리 NOT을 계산합니다. 이것은 0을 1로, 1을 0으로 바꿉니다.


19

브레인 씨발 ( 70 71)

>,[>,]<[<]>[<+++++++[>-------<-]<+>>[++<]<[>]++++++++[>++++++<-]>.[-]>]

설명:

>,[>,]                       Read characters until there are none left.
<[<]                         Return to start
>[<                          Loop as long as there are characters to invert
  +++++++[>-------<-]        Subtract 49 (ASCII value of 1)
  >[++<]                     If not 0, add 2
  +++[<++++>-]<[>>++++<<-]>> Add 48
  .                          Print
  [-]                        Set current cell to 0
>]                           Loop

1
++++++++ [<++++++>-] 왜 48이 아닌가? 8 * 6 vs. 4 * 4 * 3
Cruncher

@Cruncher가 추가되었습니다.
kitcar2000 2018 년

왜 더 길어 졌습니까? "버그 수정"때문입니까?
Cruncher 2018 년

1
@Cruncher 예,에 a대해 출력되는 버그를 수정해야했습니다 11.
kitcar2000

16

PHP-19 바이트

<?=strtr($s,[1,0]);

정말 독창적이지는 않습니다.


11

팬케이크 스택 , 532 바이트

Put this tasty pancake on top!
[]
Put this delicious pancake on top!
[#]
Put this  pancake on top!
How about a hotcake?
If the pancake is tasty, go over to "#".
Eat all of the pancakes!
Put this supercalifragilisticexpialidociouseventhoughtheso pancake on top!
Flip the pancakes on top!
Take from the top pancakes!
Flip the pancakes on top!
Take from the top pancakes!
Put this supercalifragilisticexpialidociouseventhoughthes pancake on top!
Put the top pancakes together!
Show me a pancake!
If the pancake is tasty, go over to "".

입력이 널 문자로 종료되었다고 가정합니다. 전략은 다음과 같습니다.

  • 입력의 성격을 취하십시오
  • 1그것 의 ASCII 값을 빼 십시오.
  • 에서 빼기 0( 1우리가 0가진 0경우 또는 우리가 가진 경우 1)
  • 0그것 의 ASCII 값을 추가하십시오
  • 문자를 인쇄하십시오.
  • 반복

10

C : 29

i(char*s){*s^=*s?i(s+1),1:0;}

여기에서 온라인으로 사용해보십시오 .

XOR 트릭을 지적 해 주셔서 감사합니다. Dennis.


8
더 간단하고 짧음 :i(char*s){while(*s)*s++^=1;}
edc65

1
감사합니다, @ edc65! 그러나 재귀 적 솔루션이 아닌 반복 솔루션이므로 사용하지 않을 것입니다. 나는 그것을 인정하고 싶지 않다. 그것은 당신을 대체하는 것을 주목할 필요가 whilefor28 자 길이의 여전히 발생합니다.
millinon

6
당신이 원하는대로. 재귀 솔루션은 요청되지 않으며 가능한 한 언제든지 반복 솔루션이 재귀 솔루션보다 낫습니다. 이 재귀 호출을 10k 문자열에 재미있게 적용하십시오.
edc65

1
마지막 호출을 제외한 모든 호출은 꼬리 재귀 호출이므로 컴파일러가 스택 프레임을 재사용하기 위해 루프로 변환 할 것입니다.
millinon 2016 년

1
@millinon 증명!
deed02392

9

파이썬 2.7 – 34 *

아,이 첫 번째 물건이 얼마나 빨라요. 꽤 추한 것입니다. 63 자

print''.join([bin(~0)[3:] if x == '0' else bin(~1)[4:] for x in ''])

이것은 조금 나아지지만 여전히 멋진 것은 아닙니다. 44 자

print''.join([str(int(not(int(x)))) for x in ''])

이후 int(x) and 1수익률 int(x)은 0, 그렇지 않으면 거짓이 아니라면. 이 솔루션은 36 문자로 더 줄일 수 있습니다.

print''.join([str(1-int(x)) for x in ''])

이후 join()발전기 걸리는 브래킷을 제거 할 수있다. 32 자

print''.join(str(1-int(x))for x in'')

대신 백틱을 사용할 수 있습니다 str()

print''.join(`1-int(x)`for x in'')

@TheRare의 포인터 덕분에 34에서 44로 줄었습니다.

bin(-int)-0bxxx를 반환하므로 위 의 내용을 보완하기가 쉽지 않습니다.


2
Ya'know,(int(x) and 1) == int(x)
seequ

@TheRare 나는하지 않았다 :)
Bassem

1
레코드의 경우 : 0은 거짓이고 0이 아닌 것은 참입니다. 모든 종류의 시퀀스 (목록, 문자열 ...)에 대해 동일한 규칙이 적용되지만 시퀀스 길이에서 확인됩니다. 따라서 '' == False'hi' == True
seequ

1
공백이없는 것 같습니다. 또한, 백틱을 사용하여 repr ()을 대체 할 수 있습니다. ''.join(`1-int(x)`for x in'')
seequ

1
repr(x)x <maxint에 대한 Fyi 는 다음과 같습니다str(x)
seequ

7

펄, 9 자

'y/10/01/'

9 번째 문자는 'p'플래그입니다

용법:

$ echo '10101001' | perl -pe 'y/10/01/'

2
또한 sed 스크립트로 작동 y/10/01/하지만 플래그가 필요하지 않기 때문에 하나의 문자가 더 짧습니다.

4
여기에는 작은 따옴표가 필요하지 않습니다.
Konrad Borowski 2016 년

7

자바 스크립트 ( ES6 ) 36

alert(prompt().replace(/./g,x=>x^1))

가정에서 입력 s, s.replace(/./g,x=>x^1)22 개 문자이다.
Oriol

2
실제로 출력하고 입력하고 싶습니다.
nderscore

@nderscore 2 개의 문자 저장 :p=prompt(p().replace(/./g,x=>x^1))
Gaurang Tandon

@ Garangrangand는 (p=prompt)(p().replace(/./g,x=>x^1))길이가 같아야합니다.
nderscore

@nderscore 나도 그렇게 생각했지만 괄호없이 이상하게 작동했습니다.
Gaurang Tandon

7

미로 , 6 바이트

(미로는이 도전보다 새로운 것이므로이 답변은 경쟁이 아닙니다. 어쨌든 승리하지는 않습니다 ...)

1,
.$@

이 코드는 STDIN 에 숫자 포함 된 것으로 가정합니다 (특히 후행 줄 바꿈 없음).

명령 포인터 (IP)는 왼쪽 상단에서 오른쪽으로 시작합니다. 읽을 숫자가있는 동안 왼쪽 2x2 블록을 통해 꽉 루프로 순환 1합니다 .1을 ,누르고 숫자를 읽은 다음 $1로 XOR하여 마지막 비트를 토글 .하고 결과를 인쇄하십시오. XOR 이후 스택의 상단이 양수이므로 IP는이 루프를 사용합니다. EOF를 누르면 대신 에 ,리턴 -1합니다. 그런 다음 XOR -2은이 음수를 산출 하고이 음수 값으로 IP가 좌회전 @하여 프로그램이 종료됩니다.

이 솔루션은 Labyrinth에 최적이어야합니다 . I / O 루프 가 필요 ,하고 프로그램을 종료해야합니다. 마지막 비트를 토글하려면 두 문자 (여기 및 )가 필요합니다 . 그리고 종료 할 수있는 루프에는 적어도 하나의 줄 바꿈이 필요합니다..@1$

그렇지 않으면 ... STDERR을 무시하면, 예를 들어 오류로 종료를 허용하면 저장할 수 @있으며 두 경로 사이를 전환하는 방법이 필요하지 않습니다. 실수로 음수 값 ( -2) 을 인쇄하려고 할 때까지 계속 읽고 인쇄합니다 . 이를 통해 최소 두 개의 5 바이트 솔루션이 가능합니다.

1,
.$
,_1$.



4

파이썬 2.x-44 바이트

print''.join(`1-int(x)`for x in raw_input())

왜 복잡하게 만들거나 치어 리딩 변수를 사용합니까?


다음과 같은 추가 문자를 저장할 수 있습니다 print''.join('1-int(x)'for x in'input()'). 주석 코드에서 백틱을 얻지 못하여 '로 대체했습니다.
Willem

@willem 나중에 참조 할 수 있도록 백 슬래시를 사용하여 이스케이프 처리 할 수 ​​있습니다 : `a\`b`-> a`b.
nyuszika7h

@willem 0으로 시작하는 입력 또는 maxint보다 큰 입력 (base10)에서는 작동하지 않습니다.
seequ

감사 @의 nyuszika7h 그 경우에 대해 생각하지 않았다 당신의 솔루션이 좋은 너무 TheRare
윌렘

@willem 정말 그런 것들을 잊기 쉽습니다. :)
seequ

4

R, 27 자

chartr("01","10",scan(,""))

용법:

> chartr("01","10",scan(,""))
1: 10101110101010010100010001010110101001010
2: 
Read 1 item
[1] "01010001010101101011101110101001010110101"



3

TI-BASIC, 7 바이트

이 함수는 입력으로 이진 문자열 Ans을 사용하고 지정된대로 출력을 반전 된 (역전되지 않은) 문자열로 반환 하는 함수입니다 . 추가 도움이 not(필요하면 TI-BASIC 위키에서 목록 애플리케이션을 읽을 수 있습니다 . 컴파일 된 버전이 작기 때문에 사용하고 있습니다.

»*r>Õ¸r

16 진수로 :

BB 2A 72 3E D5 B8 72

설명

»*r -함수 입력을 문자열로 받아리스트로 변환

> -리스트를 다음 연산자에게 파이프

Õ¸r -리스트의 역수를 반환


마지막에 모든 공백은 »*r>Õ¸r 무엇입니까?
kitcar2000

@ kitcar2000 죄송합니다. 그 후 HEX를 사용했습니다. 하지만 이사 한 후 공간을 제거하는 것을 잊었습니다.
Timtech

다음 사항에 유의하십시오. 1. 계산기에서 이것은 다음과 같이 표시됩니다 expr(Ans:Returnnot(Ans. 2. 문자열은 쉼표로 구분되지 않고 a로 시작하지 않으므로 {목록이 아닌 1000010011과 같은 정수로 줄어 듭니다. 3. Return당신이 쓴 방식으로 작동하지 않습니다; 4. 이것은 문자열이 아닌 목록으로 출력을 제공합니다.
lirtosiast

3

하스켈, 22 바이트

map(\c->"10"!!read[c])

나는이 도전에 대한 Haskell 솔루션의 부족에 놀랐다. 문자열을 가져와 그 역수를 반환하는 함수로 평가됩니다.

설명

여기서 멋진 것은 없습니다.

map(\c->             )  -- For each character c in the input string:
                  [c]   -- wrap c into a string,
              read      -- convert to integer,
        "10"!!          -- and index the string "10" with it.

3

Befunge 93, 25 바이트

0>~1+:#v_$>:#,_@
 ^   -1<

빈 스택과 EOF가 모두 -1이라고 가정합니다.

0 널 종료 자로 \ 0을 푸시합니다.

>~1+:#v_ 입력 루프이며, ASCII를 읽고, 1을 더하고, EOF + 1 = 0을 확인하고,

^ -1< 그렇지 않으면 1을 빼고 푸시 된 ASCII 값을 스택에 그대로 둡니다.

$>:#,_@ 스택의 맨 위에 여분의 0을 복사 한 다음 이진 문자열을 위에서 아래로 인쇄합니다.

빈 스택이 0을 읽는 경우 2 바이트를

>~:1+#v_$>:#,_@
^   -1<

EOF = 0 인 경우 동일한 알고리즘을 사용하여 약 15 바이트 버전이 가능하지만 테스트하기에 편리한 구현은 없습니다.


3

자바 스크립트 ES6, 26 자

s=>s.replace(/\d/g,x=>x^1)

3
왜 / \ d / g가 /./g가 아니라
l4m2


2

파이썬 3, 39

Methinks 파이썬은 이것에 가장 적합한 언어가 아닙니다. :)

for i in input():print(1-int(i),end='')

출력 후에 줄 바꿈이 필요한 경우 43 자 대안이 있습니다.

print(''.join("01"[i<"1"]for i in input()))

코드가없이 작동 end=''단지가 ,:) 할 것입니다 - 당신이 걱정하지 않는 한이 공백 인하지에 대해
해리 교구

@BritishColour, 아니요, Python2입니다. Python3의 print함수는 end매개 변수를 조정하여 각 인쇄가 ​​끝날 때 줄 바꿈을 억제 해야합니다 . 또한 OP의 사양에 따르면 공백이 없어야한다고 생각합니다. :) 댓글 주셔서 감사합니다!
DLosc 2018 년

앗, 쿨, 난 몰랐어! 저는 주로 2.7에서 일합니다 : /
Harry Beadle

2

J-11 자

J 부울 값은 정수로 표현 0하고 1도 물론 배열에 유효한 지표이다 (이 경우, 2 문자 배열 '01')

'01'{~'0'&=

이 답변은 문자열 대신 부울 배열을 출력하는 최상위 J 답변보다 기술적으로 더 정확하다고 생각합니다.
gar

실제로 게시 할 때 최상위 J 솔루션을 알지 못했습니다 (어떻게 놓쳤는 지 모르지만 그랬습니다). 그 해결책에 공평하게하기 위해, 그것은 "다른 해결책들이하는 일을하지 않는다"고 명시 적으로 말합니다. 11 문자로이 (리터럴 출력) 솔루션을 표현하는 또 다른 방법 인 BTW는 [:, ": @ = & ''0 ''입니다.
Dan Bron

안녕하세요, 다른 코드 감사합니다! 나는 너희들에게서 더 많은 J를 배우게 될 것이다. 그 진술에 대해, 그는 그가 등호 대신에 할당 대신 각 항목을 비교한다고 생각합니다.
gar

2

C #, 131 바이트

파티에 조금 늦었지만 여기에 내 것이 있습니다. :)

using System;class R{static void Main(string[]a){foreach(var v in a[0].ToCharArray()){Console.Write(int.Parse(v.ToString())^1);}}}

2

MATLAB, 13 바이트

@(x)[97-x '']

위를 실행 한 후 입력 문자열로 함수를 호출하면 반전 된 문자열을 얻을 수 있습니다. 예를 들어 다음을 실행하십시오.

ans('10101110101010010100010001010110101001010')

인쇄물:

01010001010101101011101110101001010110101

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