แปลงจากไบนารีเป็นลบ


15

ได้รับจำนวนเต็มไบนารีอย่างรวมระหว่าง0และ1111111111111111(เช่น 16 บิตจำนวนเต็มไม่ได้ลงนาม) ขณะที่นำเข้าส่งออกเลขเหมือนกันในnegabinary

อินพุตสามารถอยู่ในรูปแบบใดก็ได้ที่สะดวกที่สุดสำหรับภาษาของคุณ ตัวอย่างเช่นหากโปรแกรมจัดการกับอินพุตด้วยตัวเลข 16 หลักได้0000000000000101ง่ายกว่า101คุณสามารถเขียนโปรแกรมเพื่อรับอินพุตด้วยวิธีนั้นเท่านั้น

ตัวอย่าง I / O

> 1
1
> 10
110
> 1010
11110
> 110111001111000
11011001110001000
> 1001001
1011001

นี่คือโปรแกรมตัวอย่างที่ฉันเขียนซึ่งทำการแปลงฐานรวมถึงฐานที่เป็นลบและไม่ใช่จำนวนเต็ม คุณสามารถใช้มันเพื่อตรวจสอบงานของคุณ


เพียงชี้แจงเพิ่มเติมอีกเล็กน้อยอินพุตและเอาต์พุตจะต้องเป็นเลขฐานสองใช่ไหม ฉันหมายถึง: สตริงอักขระของ0s และ1s ดูชัดเจนสำหรับฉัน แต่คำตอบทำให้ฉันสงสัยเล็กน้อย ...
Joanis

@ M.Joanis อินพุตเป็นไบนารี่เอาต์พุตเป็นลบ (ซึ่งดูเหมือนกับไบนารี่ - สตริงของศูนย์และวัตถุ - แต่วิธีการตีความหมายเลขนั้นแตกต่างกัน)
Peter Olson

2
ดูเหมือนว่าลิงก์จะไม่สามารถใช้งานได้ซึ่งเป็นเหตุผลสำคัญว่าทำไมเราจึงต้องการคำถามที่มีอยู่ในตัวเองวันนี้
King King

คำตอบ:


6

APL, 21 ตัวอักษร

'01'[-(16/¯2)⊤-2⊥⍎¨⍞]

ฉันใช้ Dyalog APL สำหรับสิ่งนี้โดย⎕IOตั้งค่าเป็น 0 ทำให้เราสามารถจัดทำดัชนีอาร์เรย์เริ่มต้นที่ 0 แทนที่จะเป็น 1

คำอธิบายจากขวาไปซ้าย:

  • ให้การป้อนข้อมูลของผู้ใช้เป็นเวกเตอร์อักขระ
  • ⍎¨ใช้ฟังก์ชัน execute ( ) กับ¨อักขระแต่ละตัว ( ) ของอักขระข้างต้นส่งผลให้เวกเตอร์เป็นจำนวนเต็ม 1 และ 0
  • 2⊥ ถอดรหัสเวกเตอร์จากฐาน 2 เป็นทศนิยม
  • - negates จำนวนเต็มทศนิยมที่เกิดขึ้น
  • (16/¯2)⊤เข้ารหัสเลขจำนวนเต็มฐานสิบเป็นฐาน¯2(ลบ 2) ( 16/¯2ทำซ้ำ¯2, 16เวลา, ให้ผล 16 หลักในหมายเลขของเรา)
  • - ทำให้แต่ละองค์ประกอบของจำนวนที่เข้ารหัสใหม่ของเรา (ก่อนหน้านี้ประกอบด้วย -1 และ 0 ของ) เพื่อให้เราสามารถใช้เพื่อจัดทำดัชนีเวกเตอร์ตัวละครของเรา
  • '01'[ ... ]จัดทำดัชนีอาร์เรย์อักขระ ( '01') โดยใช้ 0 และ 1 ของเวกเตอร์ negabinary negated นี่คือเพื่อให้เราได้ผลลัพธ์ที่ดีกว่า

ตัวอย่าง:

      '01'[-(16/¯2)⊤-2⊥⍎¨⍞]
10111010001
0001101011010001

4

Ruby, 32 31 ตัวอักษร

m=43690
'%b'%(gets.to_i(2)+m^m)

ใช้ช็อตคัตการคำนวณเชิงลบ


อินพุตไม่ได้เข้ารหัสอย่างหนัก 0xAAAA ไม่ใช่อินพุตรูปแบบที่จะเปลี่ยนอินพุต 0xAAAA เทียบเท่ากับ 1010101010101010 ซึ่งใช้ในการดำเนินการ XOR เพื่อแปลงเลขฐานสองเป็นเชิงลบ .. อินพุตนั้นมาจากgetsคำหลักซึ่งดึงมาจาก STDIN
Stefano Diem Benatti

เปลี่ยน 0xAAAA เป็น 43690 (ซึ่งเป็นตัวเลขเดียวกันในหน่วยทศนิยม) เพื่อลดจำนวนอักขระโดย 1 ทำให้ยากที่จะเข้าใจว่า wtf กำลังเกิดขึ้น
Stefano Diem Benatti

อ่าโอเค. ฉันไม่ได้ทับทิมดีดังนั้นฉันจึงไม่แน่ใจ ขอโทษสำหรับเรื่องนั้น.
2560

3

GolfScript, 34 29 27 ตัวอักษร

n*~]2base{.2%\(-2/.}do;]-1%

วิธี Straigt-forward ธรรมดา เป็นที่น่าสนใจทีเดียวว่ารุ่นที่สั้นที่สุดคือรุ่นที่แปลงเป็นตัวเลขก่อนแล้วกลับไปที่ฐาน -2 (อย่างน้อยก็เป็นเวอร์ชั่นที่สั้นที่สุดที่ฉันสามารถหาได้จนถึงตอนนี้) แต่สิ่งที่ดีเกี่ยวกับเรื่องนี้ก็คือว่ามันมีเกือบ %15%

แก้ไข 1:สำหรับฐาน 2 เราสามารถบันทึกหนึ่งการดำเนินการแบบโมดูโลและยังเข้าร่วมลูปทั้งสอง

แก้ไข 2:ฉันพบรหัสที่สั้นยิ่งขึ้นในการแปลงสตริงไบนารีเป็นจำนวนเต็ม


3

Haskell, 86 83 ไบต์

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=digits 2$xor(unDigits 2 n+m)m

การโทรโดยใช้ c และอาร์เรย์จำนวนเต็มสำหรับตัวเลขเช่น

c [1,1]

PS: ฉันใหม่ฉันส่งถูกต้องหรือไม่

แก้ไข: บันทึกจำนวนไบต์ด้วย Laikoni และแก้ไขความผิดพลาดบางอย่าง

EDIT2: อีกวิธีหนึ่ง c :: String -> String:

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=concatMap show.digits 2$xor(unDigits 2(map(read.(:[]))n)+m)m

สำหรับ 114 ไบต์ (แต่คุณเรียกมันด้วยสตริง: c "11")


ใช่คุณทำ! ยินดีต้อนรับสู่เว็บไซต์! หวังว่าคุณจะไปรอบ ๆ !
Rɪᴋᴇʀ

ยินดีต้อนรับสู่ PPCG! คุณสามารถวางวงเล็บรอบเพราะการประยุกต์ใช้ฟังก์ชั่นผูกแข็งแรงกว่าundigits 2 n +mนอกจากนี้คุณยังสามารถบันทึกไบต์บางอย่างโดยมีผลผูกพันในยาม:m c n|m<-0xAAAAAAAA= ...
Laikoni

2

Python (2.x), 77 ตัวอักษร

(ไม่สั้นเท่ากับโซลูชันอื่นเนื่องจากต้องเปลี่ยนฐานด้วยตนเอง ... ) ควรเป็นไปตามข้อกำหนด

i=input();d=""
while i:i,r=i//-2,i%-2;i+=r<0;d+=`r+[0,2][r<0]`
print d[::-1]

ข้อเสนอแนะสำหรับการปรับปรุงเพิ่มเติมยินดีต้อนรับ!

ป้อนด้วยค่าเริ่มต้นเช่นนี้: 0b1001001


2

JavaScript, 68 ไบต์

function(b){for(r='',n=parseInt(b,2);r=(n&1)+r,n>>=1;n=-n);return r}

น่าจะเป็น 52 ไบต์ใน ES6 แต่นั่นจะเป็นการท้าทาย:

b=>eval(`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`)

2

ความท้าทายของเยลลี่ขนาด 4 ไบต์ภาษาจะโพสต์วันที่

Ḅb-2

ลองออนไลน์!

รับอินพุตและสร้างเอาต์พุตเป็นรายการของตัวเลข

คำอธิบาย

Ḅb-2
Ḅ     Convert binary to integer
 b-2  Convert integer to base -2

นี่เป็นเพียงการแปลสเปคโดยตรงเท่านั้น


นี่ไม่ใช่การแข่งขันใช่ไหม ความท้าทายนี้มาจาก '11 ...
NoOneIsHere

ฉันคิดถึงสิ่งนั้น ฉันจะใส่บันทึกลงในส่วนหัว

1

k, 17 ไบต์ที่ไม่เข้ากัน

คุณสมบัติบางอย่างที่ใช้อาจเป็นการลงรายการบัญชีความท้าทาย

1_|2!{_.5+x%-2}\2/

อินพุตคือรายการของ 1 และ 0 และเอาต์พุตยังเป็นรายการของ 1 และ 0

ตัวอย่างการทำงานของโปรแกรม





โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.