รหัสที่สั้นที่สุดในการสลับสตริงไบนารีแบบชาญฉลาด


79

ฉันคิดว่ามีคำถามง่าย ๆ ไม่เพียงพอที่นี่ที่ผู้เริ่มต้นสามารถลอง!

ความท้าทาย: กำหนดสตริงอินพุตแบบสุ่มของ 1 และ 0 เช่น:

10101110101010010100010001010110101001010

เขียนโค้ดที่สั้นที่สุดที่ให้ผลในทางกลับกันแบบบิตฉลาด:

01010001010101101011101110101001010110101

คำตอบ:


88

J, 5 ไบต์

bถือว่าสายป้อนที่อยู่ในตัวแปร

b='0'

สิ่งนี้ไม่ได้ทำในภาษาส่วนใหญ่ ...

ตัวดำเนินการเปรียบเทียบ J เป็นเพียง=( =:และ=.เป็นระดับโลกและระดับท้องถิ่นตามลำดับ) อย่างไรก็ตาม=ไม่ทำงานเหมือน==โอเปอเรเตอร์ปกติ: มันเปรียบเทียบ item-by-item 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) ในกรณีนี้อย่างไรก็ตามพฤติกรรมนี้เป็นเลิศเพราะเราต้องการสตริงของและศูนย์หรือ จริงและเท็จ ตั้งแต่ bools เจมี 1และ0นี้ส่งผลในอาร์เรย์ของ1'และ0(นั่นไม่ใช่สตริงและอักขระอื่นทุกตัวที่นอกเหนือจาก1นี้จะส่งผลให้ใน0อาร์เรย์นี้) ไม่จำเป็นต้องพิมพ์: J จะพิมพ์ผลลัพธ์ของนิพจน์โดยอัตโนมัติ ฉันหวังว่านี่เป็นคำอธิบายที่เพียงพอถ้าไม่โปรดขอสิ่งที่ยังไม่ชัดเจนในความคิดเห็น คำตอบนี้อาจเป็นไปได้'0'&=(หรือ=&'0') แต่ฉันรู้สึกว่าb='0'ชัดเจน


1
ฉันได้ลองเจไม่สามารถงอใจของฉันกับมัน เดาฉันไม่พบเอกสารที่ดี ที่นี่มี +1 เป็นคนบ้า
Seequ

1
และนี่คือเหตุผลที่ฉันจะไม่ใช้ J.
Qix

2
@Qix เนื่องจาก J ไม่สามารถอ่านได้จริง ๆ แล้วภาษานี้มีเหตุผลสำหรับฉันและภาษาอื่น ๆ ที่มีโอเปอเรเตอร์ที่ใช้เวกเตอร์ LHS และสเกลาร์ RHS นั้นมีพฤติกรรมคล้ายกัน
hvd

1
อะไร? ไม่ส่งคืนผลลัพธ์ที่ถูกต้องใช่ไหม ผลที่ควรจะได้รับสตริงข้อความ (ไม่มีช่องว่าง) แต่มีความรู้ จำกัด ของฉัน J ผมคิดว่านี่จะกลับรายการบูลด้วยรูปแบบการแสดงผลของ 0 1 0 1 0 ...
อดัม

4
สิ่งนี้ไม่ได้รับอนุญาตเพราะคุณไม่สามารถสันนิษฐานได้ว่าอินพุตถูกเก็บไว้ในตัวแปรที่แน่นอน =&'0'ทำงานสำหรับจำนวนไบต์เดียวกัน
แยกผลไม้

43

GolfScript 5 ไบต์

{1^}%

ลองออนไลน์

มันทำงานอย่างไร

  • GolfScript อ่านอินพุตทั้งหมดจาก STDIN และวางลงบนสแต็กเป็นสตริง

  • {}% ผ่านตัวละครทั้งหมดในสตริงและดำเนินการบล็อกรหัสสำหรับพวกเขาทั้งหมด

  • 1^ คำนวณรหัส ASCII แบบเอกสิทธิ์เฉพาะบุคคลหรืออักขระด้วย 1“ 0” สอดคล้องกับรหัส ASCII 48,“ 1” ถึงรหัส ASCII 49

    ตั้งแต่48 ^ 1 = 49และ49 ^ 1 = 48สิ่งนี้จะเปลี่ยน 0 เป็น 1 และ 1 เป็น 0

  • เมื่อเสร็จแล้ว GolfScript จะพิมพ์สตริงที่ถูกดัดแปลง


6
เดี๋ยวก่อนGolfscript ?
ToonAlfrink

ฉันตีความคำถามของคุณผิด แก้ไขแล้ว
Dennis

1
@tolos: ฉันได้แก้ไขคำตอบของฉัน
Dennis

5
@ToonAlfrink ภาษาการเล่นกอล์ฟเช่น GolfScript ได้รับการยอมรับในทุกความท้าทายตราบใดที่พวกเขามีความหมาย 'วัตถุประสงค์ทั่วไป' ที่พวกเขาไม่ได้ออกแบบมาสำหรับความท้าทายที่เฉพาะเจาะจง
kitcar2000

4
@ kitcar2000 ฉันคิดว่าเขาแปลกใจมากขึ้นที่ภาษานั้นมีอยู่จริงมากกว่าที่จะมีใครบางคนที่กล้าที่จะใช้ GolfScript ในคำถามเกี่ยวกับการเขียนโค้ดกอล์ฟ);
Chris Cirefice

35

CJam - 4

q1f^

xor นี้เป็นตัวละครทุกตัวที่มี 1
ซึ่งแตกต่างจากคำตอบ CJam อื่น ๆ ฉันไม่ได้สมมติว่าอินพุตอยู่ในสแต็ก

ลองที่http://cjam.aditsu.net/


2
ดังนั้นนั่นคือfวิธีที่คุณใช้
Dennis

@Dennis แน่นอน คุณสามารถใช้ฟอรั่มเอสเอฟเพื่อถามคำถาม btw :)
aditsu

30

รหัสเครื่อง x86 บน DOS - 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 หากคุณต้องการออก ใน VM ด้วย DOS 6.0 แต่จะทำงานตามที่ต้องการ

แหล่งที่มาของ 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 ไบต์

สิ่งนี้ยอมรับอินพุตจากบรรทัดคำสั่ง ทำงานอย่างราบรื่นเป็นไฟล์. COM ใน DosBox

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,axคือ 1 ไบต์สั้นกว่าmov dl,al
ninjalj

@ninjalj: woa ขอขอบคุณ! มันไม่ได้รับสั้นหลังจากที่ทุกคน!
Matteo Italia

26

Bash + coreutils 8 ไบต์

tr 01 10

รับอินพุตจาก STDIN


หรือ

sed, 8 ไบต์

y/01/10/

2
ผมเพิ่งทำเล่นกอล์ฟชุดห้องสมุด / นามแฝงสำหรับทุบตีgithub.com/professorfish/bash-shelf คุณสามารถกำจัดถ่านหนึ่งตัวด้วย:y 01 10

1
BASH เกี่ยวข้องกับที่นี่ที่ไหน? BASH เฉพาะเจาะจงคืออะไร ทุกเปลือกสามารถโทรtr...
เยติ

1
@yeti ไม่ใช่ทุก ๆ เชลล์ที่เรียกคำสั่งเช่น bash หรือ zsh ในเชลล์บางตัวรหัสอย่างเดียวเป็นข้อผิดพลาดทางไวยากรณ์
mniip

5
มันอาจจะปลอดภัยที่จะคิดว่า "หอย" หมายถึง "เปลือก POSIX ได้" ที่นี่ ...
หิ่งห้อย

@professorfish คุณกำจัดถ่านหนึ่งตัว แต่เพิ่ม 48 โดยรวมถึงฟังก์ชั่น การชนะเป็นอย่างไร
Steven Penny

20

CJam , 4 ไบต์

:~:!

ถือว่าสตริงเดิมอยู่ในสแต็กแล้ว พิมพ์สตริงที่แก้ไข

ลองออนไลน์โดยวางรหัสต่อไปนี้:

"10101110101010010100010001010110101001010":~:!

มันทำงานอย่างไร

  • :~ประเมินอักขระแต่ละตัวของสตริงกล่าวคือแทนที่อักขระ 0 ด้วยจำนวนเต็ม 0

  • :!คำนวณ NOT ตรรกะของแต่ละจำนวนเต็ม นี่จะเปลี่ยน 0 เป็น 1 และ 1 เป็น 0


19

Brainfuck ( 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 กับ 4 * 4 * 3
Cruncher

เพิ่ม @Cruncher แล้ว
kitcar2000

ทำไมมันใช้เวลานานขึ้น? เป็นเพราะการ "แก้ไขข้อผิดพลาด" หรือไม่?
Cruncher

1
@Cruncher ใช่ฉันมีการแก้ไขข้อผิดพลาดที่มันจะส่งออกสำหรับa 11
kitcar2000


11

Pancake Stackขนาด 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 "".

มันจะถือว่าอินพุตถูกยกเลิกด้วยอักขระ null กลยุทธ์มีดังนี้:

  • ใช้อักขระของอินพุต
  • ลบค่า ascii ของ1จากมัน
  • ลบออกจาก0(ให้ผล1ถ้าเรามี0หรือ0ถ้าเรามี1)
  • เพิ่มค่า ascii ของ0มัน
  • พิมพ์ถ่าน
  • ทำซ้ำ

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! ฉันจะไม่ใช้สิ่งนั้นเนื่องจากเป็นวิธีแก้ปัญหาซ้ำ ๆ มากกว่าแบบเรียกซ้ำ ฉันไม่ต้องการรับเครดิตสำหรับมัน เป็นที่น่าสังเกตว่าการแทนที่คุณwhileด้วยforผลลัพธ์ที่มีความยาว 28 ตัวอักษร
millinon

6
ตามที่คุณชอบ. ไม่ขอโซลูชันแบบเรียกซ้ำและในความคิดของฉันเมื่อใดก็ตามที่เป็นไปได้โซลูชันที่วนซ้ำจะดีกว่าโซลูชันแบบเรียกซ้ำ ขอให้สนุกใช้สายเรียกซ้ำนี้กับสตริง 10k
edc65

1
เนื่องจากการโทรทุกครั้งยกเว้นการโทรสุดท้ายเป็นการโทรแบบเรียกซ้ำแบบหางฉันจะเดิมพันว่าคอมไพเลอร์จะแปลงเป็นลูปเพื่อใช้เฟรมสแต็กอีกครั้ง
millinon

1
@ Millinon พิสูจน์!
deed02392

9

Python 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'')

และสามารถใช้ backticks แทน str()

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

ลดลงเหลือ 44 จาก 34 ด้วยตัวชี้จาก @TheRare

การค้นหาส่วนประกอบของตัวใดตัวหนึ่งเป็นเรื่องยากในไพ ธ อนเนื่องจากbin(-int)ส่งกลับค่า -0bxxx ดังนั้นจึงเป็นข้างต้น


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

@TheRare ฉันไม่ได้ขอบคุณสำหรับ :) ว่า
Bassem

1
สำหรับบันทึก: ศูนย์เป็นเท็จและไม่ใช่ศูนย์จริง สำหรับลำดับใด ๆ (รายการสตริง ... ) ใช้กฎเดียวกัน แต่จะตรวจสอบจากความยาวของลำดับ ดังนั้น'' == Falseและ'hi' == True
seequ

1
ดูเหมือนว่าคุณจะพลาดช่องว่าง นอกจากนี้ backticks สามารถนำมาใช้เพื่อแทนที่ repr () ''.join(`1-int(x)`for x in'')
seequ

1
Fyi repr(x)สำหรับ x <maxint เท่ากับstr(x)
seequ

7

Perl, 9 ตัวอักษร

'y/10/01/'

อักขระที่ 9 คือการตั้งค่าสถานะ 'p'

การใช้งาน:

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

2
ยังทำงานเป็นสคริปต์ sed y/10/01/แต่ตัวอักษรตัวหนึ่งสั้นกว่าเพราะไม่ต้องการแฟล็กใด ๆ

4
คุณไม่ต้องการคำพูดเดียวที่นี่
Konrad Borowski

7

Javascript ( 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

@GaurangTandon มันจะต้องมี(p=prompt)(p().replace(/./g,x=>x^1))ความยาวเท่ากัน
ขีดล่าง

@ ตัวเลขฉันก็คิดว่ามันจะเป็นอย่างนั้น แต่มันก็ใช้ได้โดยไม่ต้องใช้วงเล็บเช่นกัน
Gaurang Tandon

7

เขาวงกต 6 ไบต์

(เขาวงกตนั้นใหม่กว่าความท้าทายนี้ดังนั้นคำตอบนี้จะไม่แข่งขัน - ไม่ใช่ว่ามันจะชนะอยู่ดี ... )

1,
.$@

รหัสนี้อนุมานว่า STDIN มีเฉพาะตัวเลข (โดยเฉพาะอย่างยิ่งไม่มีการขึ้นบรรทัดใหม่)

ตัวชี้คำแนะนำ (IP) เริ่มต้นที่มุมซ้ายบนไปทางขวา ในขณะที่มีตัวเลขที่จะอ่านมันจะวนเป็นวงวนแน่นผ่านบล็อก 2x2 ทางซ้าย: 1กด 1 ,อ่านตัวเลข$XOR ด้วย 1 เพื่อสลับบิตสุดท้าย.พิมพ์ผลลัพธ์ IP ใช้ลูปนี้เนื่องจากด้านบนสุดของสแต็กเป็นบวกหลังจาก XOR เช่นนั้นจะเลี้ยวขวา เมื่อเรากด EOF ให้,ส่งคืน-1แทน จากนั้น XOR จะให้ผลลัพธ์-2และด้วยค่าลบนี้ IP จะเลี้ยวซ้ายเข้าสู่@และโปรแกรมจะสิ้นสุดลง

วิธีการแก้ปัญหานี้ควรจะดีที่สุดสำหรับเขาวงกต: คุณต้องการ,และ.สำหรับ I / O วนและ@เพื่อยุติโปรแกรม คุณต้องมีอักขระอย่างน้อยสองตัว (ที่นี่1และ$) เพื่อสลับบิตสุดท้าย และคุณต้องการ newline อย่างน้อยหนึ่งรายการสำหรับลูปที่สามารถยกเลิกได้

เว้นแต่ ... ถ้าเราเพิกเฉย STDERR นั่นคืออนุญาตให้ยกเลิกด้วยข้อผิดพลาดที่เราสามารถบันทึกได้@และเราก็ไม่จำเป็นต้องสลับไปมาระหว่างสองเส้นทาง เราแค่อ่านและพิมพ์ต่อไปเรื่อย ๆ จนกว่าเราจะพยายามพิมพ์ค่าลบ ( -2) สิ่งนี้ช่วยให้โซลูชัน 5 ไบต์อย่างน้อยสองตัว:

1,
.$
,_1$.


5

รหัสเครื่องจักรทัวริง 32 ไบต์ (1 สถานะ - 3 สี)

การใช้ไวยากรณ์ตารางกฎที่ต้องการโดยโปรแกรมจำลอง TM ออนไลน์นี้ ยืมมาจากโพสต์ที่ฉันทำกับบล็อกผู้ใช้ของ Google Googology Wiki ไม่กี่เดือนหลัง

0 0 1 r *
0 1 0 r *
0 _ _ * halt

คุณสามารถทดสอบสิ่งนี้ได้โดยใช้การติดตั้งจาวานี้


4

Python 2.x - 44 ไบต์

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

ทำไมต้องทำให้มันซับซ้อนหรือใช้ตัวแปร cheaty?


print''.join('1-int(x)'for x in'input()')มันเป็นไปได้ที่จะบันทึกตัวอักษรพิเศษบางอย่างเช่นนี้ ฉันไม่สามารถรับ backticks ในรหัสความคิดเห็นดังนั้นแทนที่ด้วย '
วิลเล็ม

@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"

4

APL (Dyalog Unicode) , 7 ไบต์SBCS

โปรแกรมเต็มรูปแบบ แสดง stdin

∊⍕¨~⍎¨⍞

ลองออนไลน์!

 พร้อมรับคำ stdin

⍎¨ รันตัวละครแต่ละตัว

~ ตรรกะไม่

⍕¨ จัดรูปแบบอักขระแต่ละตัวเป็นข้อความ

ϵ รายการ (แผ่)



3

TI-BASIC ขนาด 7 ไบต์

นี่คือฟังก์ชั่นที่รับสตริงไบนารี (ผ่านAns) เป็นอินพุตและส่งคืนเอาต์พุตเป็นสตริงกลับหัว (ไม่กลับด้าน) ตามที่ระบุ สำหรับความช่วยเหลือเพิ่มเติมคุณสามารถอ่านรายการแอปพลิเคชันโดยใช้not(บน TI-BASIC wiki ฉันกำลังใช้เวอร์ชั่นที่คอมไพล์แล้วเพราะมันเล็กกว่า:

»*r>Õ¸r

ในรูปหกเหลี่ยม:

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

Haskell, 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 เป็นเทอร์มิเนเตอร์ null

>~1+:#v_ เป็นอินพุตวนซ้ำมันอ่าน ascii เพิ่ม 1 ตรวจสอบ EOF + 1 = 0

^ -1< มิฉะนั้นจะลบ 1 และออกจากค่า ascii ที่กดไว้บนสแต็ก

$>:#,_@ ปล่อยสำเนาพิเศษของศูนย์ที่ด้านบนของสแต็กจากนั้นพิมพ์ไบนารีสตริงบนลงล่าง

ถ้าสแต็กที่ว่างเปล่าอ่าน 0 ให้บันทึก 2 ไบต์ด้วย

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

รุ่นประมาณ 15 ไบต์เป็นไปได้โดยใช้อัลกอริทึมเดียวกันนี้ถ้า EOF = 0 แต่ฉันไม่มีการติดตั้งที่สะดวกในการทดสอบ




2

Python3, 39

Methinks Python ไม่ใช่ภาษาที่ดีที่สุดสำหรับสิ่งนี้ :)

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

หากคุณสนใจที่จะมีการขึ้นบรรทัดใหม่หลังผลลัพธ์นี่คือตัวเลือก 43 ตัวอักษร:

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

รหัสจะทำงานโดยไม่ได้end=''เป็นเพียงแค่,จะทำ :) - ถ้าคุณดูแลเกี่ยวกับการไม่มีการเว้นวรรค
แฮร์รี่พิธีการ

@BritishColour ไม่นั่นคือ Python2 printฟังก์ชันของ Python3 ต้องการ tweaking endพารามิเตอร์เพื่อหยุดการขึ้นบรรทัดใหม่เมื่อสิ้นสุดการพิมพ์แต่ละครั้ง นอกจากนี้ตามข้อกำหนดของ OP ฉันคิดว่าฉันสนใจว่าไม่มีที่ว่าง :) ขอบคุณสำหรับความคิดเห็น แต่!
DLosc

อ๋อฉันไม่รู้หรอก! ฉันทำงานส่วนใหญ่ใน 2.7: /
Harry Beadle

2

J - 11 ตัวอักษร

ค่าบูลีนใน J ถูกแทนด้วยจำนวนเต็ม0และ1แน่นอนว่าเป็นดัชนีที่ถูกต้องในอาร์เรย์ (ในกรณีนี้คืออาร์เรย์ 2 อักขระ'01')

'01'{~'0'&=

ฉันคิดว่าคำตอบนี้เป็นเทคนิคที่ถูกต้องมากกว่าคำตอบ J ด้านบนซึ่งออกอาเรย์บูลีนแทนสตริง
gar

จริง ๆ แล้วฉันไม่ได้สังเกตวิธีแก้ปัญหา J อันดับสูงสุดเมื่อฉันโพสต์ (ไม่ทราบว่าฉันพลาดมัน แต่ฉันทำ) เพื่อให้เกิดความเป็นธรรมกับโซลูชันนั้นจะกล่าวอย่างชัดเจนว่า "สิ่งนี้ไม่ได้ทำในสิ่งที่โซลูชันอื่นทำ" BTW อีกวิธีในการแสดงโซลูชันนี้ (ตัวอักษรเอาต์พุต) ใน 11 ตัวอักษรคือ [:, ": @ = & '' 0 ''
Dan Bron

สวัสดีขอบคุณสำหรับรหัสอื่น! ฉันจะได้เรียนรู้เจมากขึ้นจากพวกคุณ เกี่ยวกับคำแถลงนั้นฉันคิดว่าเขาหมายถึงเครื่องหมายเท่ากับว่ามันเปรียบเทียบแต่ละรายการแทนการมอบหมาย
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.