สตริงเป็นไบนารี


19

นี่คือความท้าทายของรหัสกอล์ฟ เช่นเดียวกับชื่อเรื่องเขียนโปรแกรมเพื่อแปลงสตริงอักขระ ASCII ให้เป็นไบนารี

ตัวอย่างเช่น:

"Hello World!"1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001ควรเปลี่ยนเป็น

หมายเหตุ: ฉันสนใจเป็นพิเศษในการนำ pyth มาใช้


1
เรามีคำถามที่กลับรายการ: codegolf.stackexchange.com/questions/35096/…
hmatt1

1
ฉันสังเกตว่า. มีเรื่องเล็ก ๆ น้อย ๆ เกี่ยวกับสาเหตุที่ฉันถามคำถามนี้ ฉันสนับสนุนให้เพื่อนของฉันเรียนรู้การเขียนโปรแกรมและเขาเข้าชั้นเรียน Java เมื่อฤดูร้อนปีที่แล้วซึ่งนักเรียนแต่ละคนต้องเลือกโครงงาน เขาบอกฉันว่าเขาต้องการที่จะแปลข้อความเป็นไบนารี่ซึ่งฉันก็ทำ (เพื่อความผิดหวังของเขา) ในไพ ธ อน 3 ใน 1 บรรทัด (บรรทัดที่ยาวมาก) ฉันคิดว่ามันเหลือเชื่อที่ความคิดโปรเจ็กต์ของเขาสามารถกลั่นได้ถึง 8 ไบต์
ericmarkmartin

1
เยี่ยมมากขอบคุณสำหรับการแบ่งปัน! ฉันชอบคำถามที่ง่ายขึ้นเช่นนี้เพราะให้โอกาสผู้คนเข้าร่วมและสร้างเนื้อหาจำนวนมากในรูปแบบของคำตอบ
hmatt1

1
ต้องเป็น ASCII หรือไม่ กล่าวคือถ้าเทคโนโลยีไม่รองรับ ASCII ผลลัพธ์อาจสะท้อนได้หรือไม่?
Shaun Bebbers

1
เราสามารถสมมติ ASCII ที่พิมพ์ได้ 32-127 ได้ไหม? ถ้าเป็นเช่นนั้นสตริงไบนารี่สามารถเป็น 7 ตัวอักษรโดยไม่มีการเติมเต็มซ้ายได้หรือไม่?
640KB

คำตอบ:



13

Python 3, 41 ไบต์

print(*[bin(ord(x))[2:]for x in input()])

เช่นเดียวกับคำตอบ KSFT ของแต่ฉันคิดว่าฉันต้องการชี้ให้เห็นว่านอกเหนือไปจากraw_input -> inputงูใหญ่ 3 printนอกจากนี้ยังมีความได้เปรียบที่นี่เนื่องจากเครื่องหมายสำหรับ


8

Pyth, 10 ไบต์

jdmjkjCd2z

การทำแผนที่หลามและคำอธิบาย:

j           # join(                               "Join by space"
 d          #      d,                             "this space"
 m          #      Pmap(lambda d:                 "Map characters of input string"
  j         #                    join(            "Join by empty string"
   k        #                        k,           "this empty string"
    j       #                        join(        "This is not a join, but a base conversion"
     C      #                             Pchr(   "Convert the character to ASCII"
      d     #                                  d  "this character"
            #                                 ),
     2      #                             2       "Convert to base 2"
            #                            )
            #                        ),
  z         #           z)))                      "mapping over the input string"

อินพุตคือสตริงที่ต้องถูกแปลงโดยไม่มีเครื่องหมายคำพูด

ลองที่นี่


10
asdfghjlkl เป็นโปรแกรม pyth ที่ถูกต้องหรือไม่? มันทำอะไร?
ข้อบกพร่อง

@ flawr อันตรายใด ๆ ในการพยายาม? ;)
เครื่องมือเพิ่มประสิทธิภาพ

2
@flawr นั่นแปลว่าไพ ธ อนPsum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), whee d = '' และ k = '' ไม่เลยมันไม่ถูกต้องเลย
isaacg

12
@ ericmark26 มองไปรอบ ๆ ห้องหรือสำนักงานของคุณและทุบทุกอย่างที่คุณสามารถหาได้จากคีย์บอร์ดและดูว่ามันแปลความหมายหรือไม่ คิดออกว่ามันทำอะไรแล้วทำซ้ำกับวัตถุถัดไป เมื่อคุณหมดลองหมุนที่แตกต่างกัน
globby

2
@ ericmark26 ฉันคิดว่าวิธีที่ดีที่สุดในการทำความคุ้นเคยกับ Pyth คือการใช้โปรแกรม Python อย่างง่ายและแปลมันเป็น Pyth
isaacg

4

Python 3 - 43 ไบต์


print(*map("{:b}".format,input().encode()))

ไม่ใช่วิธีที่สั้นที่สุด แต่เป็นวิธีการที่น่าสนใจสำหรับ IMO มันมีข้อได้เปรียบที่เพิ่มว่าหากจำนวนบิตที่สำคัญแตกต่างกันไป EG Hi!, การเติมด้วยศูนย์เป็นเรื่องเล็กน้อย (อีก 2 ไบต์เมื่อเทียบกับ 9 สำหรับ.zfill(8)):

print(*map("{:08b}".format,input().encode()))

3

Python - 52

print" ".join([bin(ord(i))[2:]for i in raw_input()])

ฉันจะพยายามแปลสิ่งนี้เป็น Pyth มีคนอื่นที่ตอบคำถาม Pyth แล้ว

หากคุณไม่สนใจว่ามันเป็นโปรแกรมเต็มรูปแบบหรือเกี่ยวกับรูปแบบ I / O และใช้ Python 3 คุณสามารถทำได้ใน 23 ไบต์เช่นนี้

[bin(ord(i))for i in x]

x คืออินพุต

ฉันรู้ว่านี่ไม่นับเพราะล่ามไม่ได้ถูกปล่อยออกมาก่อนที่ความท้าทายจะโพสต์ แต่ที่นี่มันอยู่ใน KSFTgolf:

oan

3

Ruby, 34 28 24 ไบต์

$<.bytes{|c|$><<"%b "%c}

ใช้อินพุตผ่าน STDIN ขอบคุณ 6 ไบต์ที่บันทึกไว้สำหรับ AShelly และอีก 4 ขอบคุณ britishtea


ตัดแต่งด้วย 6 ด้วย$<.each_byte{|c|$><<"%b "%c}
AShelly

คุณสามารถโกนอักขระบางตัวมากขึ้นโดยใช้แทนString#bytes String#each_byteรูปแบบบล็อกจะเลิก แต่ก็ยังคงทำงาน :)
britishtea

@britishtea โอ้ดี ขอขอบคุณ!
Martin Ender


2

Matlab

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อ

f=@(x) dec2bin(char(x))

f('Hello World')การใช้งาน

หรือถ้าxกำหนดเป็นสตริงHello World!ในเวิร์กสเปซก็dec2bin(char(x))จะทำงาน


ฉันไม่แน่ใจเกี่ยวกับวิธีการให้คะแนนเพราะฉันไม่แน่ใจว่าฉันจะได้รับข้อมูลได้อย่างไร มีคำแนะนำอะไรมั้ย?
David

ทำไมchar? ฉันคิดว่าคุณหมายถึงdec2bin(x)-'0'
หลุยส์เมนโด

เพราะฉันไม่ฉลาด!
เดวิด

จุดของฉันคือ: char(x)เมื่อxเป็นสตริงแล้วไม่ทำอะไรเลย ดังนั้นคุณสามารถลบมันออกเพื่อประหยัดพื้นที่ ในทางกลับกันผลลัพธ์ของการdec2binเป็นสตริงและฉันคิดว่าผลลัพธ์ควรเป็นตัวเลข
Luis Mendo

ฉันเข้าใจแล้วและคุณพูดถูก Matlab ทำให้ง่ายต่อการลืมประเภทข้อมูลบางครั้ง
David

2

J - 9

1":#:3&u:

ไม่มีความคิดวิธีการทำสิ่งนี้ในแถวโดยไม่เพิ่มความยาวของรหัสฉันต้องการ J gurus เพื่อบอกฉัน :)

1":#:3&u:'Hello world!'
1001000
1100101
1101100
1101100
1101111
0100000
1110111
1101111
1110010
1101100
1100100
0100001

2
คุณสามารถเพิ่ม".ไปยังจุดเริ่มต้น มันจะประเมินผลลัพธ์ของคุณดังนั้นมันจะอยู่ในหนึ่งบรรทัดและคั่นด้วยช่องว่าง แม้สั้นคือการสร้าง base10 ตัวเลขที่มีตัวเลข base2 10#.#:3&u:นี้:
Randomra

2

Java - 148 ไบต์

public class sToB{public static void main(String[] a){for(int i=0;i<a[0].length();i++){System.out.print(Integer.toString(a[0].charAt(i) ,2)+" ");}}}

แก้ไขเพื่อรวมไฟล์เต็มแล้ว


2
ฉันคิดว่า OP ต้องการโปรแกรมเต็มรูปแบบไม่ใช่แค่ข้อมูลโค้ด นอกจากนี้ยังสามารถตีกอล์ฟได้มากขึ้น
Rodolfo Dias

นั่นคือโปรแกรมเต็มรูปแบบถ้าคุณใส่มันในคลาสหลักมันจะทำงาน สำหรับการเล่นกอล์ฟที่ดีขึ้นอาจ แต่ฉันไม่สามารถมองเห็นได้
ไบรอัน Devaney

1
โปรแกรมเต็มรูปแบบรวมถึงชั้นเรียนหลักเช่นกัน
Rodolfo Dias

อาจสั้นลงโดยใช้for(char c:a[0].toCharArray()){หรือแม้กระทั่งfor(byte b:a[0].getBytes()){เนื่องจากอินพุตเป็น ascii โดยสันนิษฐานว่าตำแหน่งของเครื่องที่ไม่ใช่ utf-16
njzk2

1
คุณสามารถกำจัดpublicและย่อชื่อโปรแกรมเป็นอักขระตัวเดียวเพื่อให้ได้จำนวนไบต์ที่มากขึ้น นอกจาก(String[]a)นี้คอมไพเลอร์ได้รับการยอมรับอย่างสมบูรณ์ทำให้คุณได้รับอีกไบต์
Rodolfo Dias

2

JavaScript ES6, 63 65ไบต์

alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))

นี่ค่อนข้างยาวเนื่องจากชื่อฟังก์ชันยาวของ JavaScript Stack Snippet ด้านล่างนี้เทียบเท่ากับ ES5 คร่าวๆดังนั้นจึงสามารถเรียกใช้ในเบราว์เซอร์ใดก็ได้ ขอบคุณ edc65 สำหรับการปรับปรุงสนามกอล์ฟ

alert(prompt().split('').map(function(e){return e.charCodeAt().toString(2)}).join(' '))


1
[for of]สั้นกว่า[...].mapการแจกแจงอักขระในสตริงเล็กน้อย:alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
edc65

คุณสามารถปิดกอล์ฟไบต์ที่สองโดยการแทนที่ด้วย.join(' ') .join` ` คุณสามารถตีกอล์ฟได้หลายไบต์โดยใช้ฟังก์ชั่นแทนprompt/alert
RamenChef

2

สกาลา - 59 - 55 ไบต์

readLine().map(x=>print(x.toByte.toInt.toBinaryString))

โดยปกติเราควรใช้ foreach และไม่ใช่ map


2

รหัสเครื่อง 8088, IBM PC DOS, 33 31 ไบต์ *

รายการ:

D1 EE           SHR  SI, 1          ; point SI to DOS PSP (80H)
AD              LODSW               ; load input string length into AL, SI to 82H 
8A C8           MOV  CL, AL         ; set up loop counter 
49              DEC  CX             ; remove leading space/slash from char count 
            LOOP_CHAR: 
B3 08           MOV  BL, 8          ; loop 8 bits 
AC              LODSB               ; load next char 
            LOOP_BIT: 
D0 C0           ROL  AL, 1          ; high-order bit into low-order bit 
B4 0E           MOV  AH, 0EH        ; BIOS display character function 
50              PUSH AX             ; save AH/AL 
24 01           AND  AL, 1          ; mask all but low-order bit 
04 30           ADD  AL, '0'        ; convert to ASCII 
CD 10           INT  10H            ; write char to display 
58              POP  AX             ; restore AH/AL 
4B              DEC  BX             ; decrement bit counter 
75 F1           JNZ  LOOP_BIT       ; loop next bit      
B0 20           MOV  AL, ' '        ; display a space 
CD 10           INT  10H            ; write space to display 
E2 E8           LOOP LOOP_CHAR      ; loop next char 
C3              RET                 ; return to DOS 

ไฟล์ COM ที่สามารถเรียกใช้งานได้ของ PC DOS สมบูรณ์อินพุตคือทางบรรทัดคำสั่ง

ด้วยศูนย์นำ:

ป้อนคำอธิบายรูปภาพที่นี่

ดาวน์โหลดและการทดสอบASCBIN.COM

หรือ39 ไบต์โดยไม่มีศูนย์นำหน้า:

ป้อนคำอธิบายรูปภาพที่นี่

ดาวน์โหลดและการทดสอบASCBIN2.COM

* เนื่องจากฉันไม่ชัดเจนว่าจะอนุญาตให้มีศูนย์นำหน้าหรือไม่ฉันกำลังโพสต์ทั้งสองเวอร์ชัน


2

MITS Altair 8800 , 0 ไบต์

สตริงอินพุตอยู่ที่หน่วยความจำ#0000H( อนุญาต ) D7-D0เอาท์พุทในไบนารีผ่านไฟแผงด้านหน้าของ I / O

ตัวอย่างทำRESETจากนั้นEXAMINEดูไบต์แรกแล้วตามด้วยการทำซ้ำEXAMINE NEXTเพื่อดูส่วนที่เหลือ

"H" = 01 001 000:

ป้อนคำอธิบายรูปภาพที่นี่

"e" = 01 100 101:

ป้อนคำอธิบายรูปภาพที่นี่

"l" = 01 101 100:

ป้อนคำอธิบายรูปภาพที่นี่

ลองออนไลน์!

แน่นอนว่าไม่ใช่การแข่งขัน :)


1

Haskell, 65

m s=tail$do c<-s;' ':do j<-[6,5..0];show$mod(fromEnum c`div`2^j)2

การใช้รายการ monad อย่างหนัก มันอาจจะไม่ได้รับการแปลงเป็น comprehentions returnรายการเพราะงบที่ผ่านมาก็ไม่ได้เป็น


1

C ++ - 119 ไบต์

พ้นความทรงจำ? นั่นอะไร?

#include<cstdio>
#include<cstdlib>
int main(int c,char**v){for(*v=new char[9];c=*(v[1]++);printf("%s ",itoa(c,*v,2)));}

(MSVC รวบรวมรหัสพร้อมคำเตือน)


1
รุ่น C สั้นกว่าmain(int c,char**v){char x[9];for(;c=*(v[1]++);printf("%s ",itoa(c,x,2)));}
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳





1

พลเรือจัตวา VIC-20 / C64 / 128 และ TheC64Mini, 101 โทเค็นพื้นฐานไบต์

นี่คือรายชื่อที่สับสนโดยใช้ตัวย่อคำหลักพื้นฐาน Commodore:

 0dEfnb(x)=sG(xaNb):inputa$:fOi=1tolen(a$):b=64:c$=mI(a$,i,1):fOj=0to6
 1?rI(str$(fnb(aS(c$))),1);:b=b/2:nEj:?" ";:nE

ที่นี่เพื่อวัตถุประสงค์ในการอธิบายคือรายการสัญลักษณ์ที่ไม่ยุ่งเหยิง:

 0 def fn b(x)=sgn(x and b)
 1 input a$
 2 for i=1 to len(a$)
 3 let b=64
 4 let c$=mid$(a$,i,1)
 5 for j=0 to 6
 6 print right$(str$(fn b(asc(c$))),1);
 7 let b=b/2
 8 next j
 9 print " ";
10 next i

ฟังก์ชั่นที่fn bประกาศในบรรทัดศูนย์รับพารามิเตอร์ตัวเลขxซึ่งANDมีค่าเป็นb; SGNที่ใช้แล้วเพื่อแปลงx and bไปหรือ10

บรรทัดแรกยอมรับอินพุตสตริงไปยังตัวแปรa$และลูปเริ่มต้น (แสดงด้วยi) ตามความยาวของอินพุตนั้น bแทนแต่ละบิตจากบิตที่ 6 ถึง 0 ยิงตัวอักษรของสตริงแต่ละตำแหน่งc$i

บรรทัดที่ 5 เริ่มต้นลูปเพื่อทดสอบตำแหน่งบิตแต่ละตำแหน่ง right$ใช้ในบรรทัดที่ 6 เพื่อลบปัญหาการจัดรูปแบบอัตโนมัติเมื่อ Commodore BASIC แสดงตัวเลขแปลงผลลัพธ์ของfn bสตริง asc(c$)แปลงอักขระปัจจุบันเป็นรหัส ascii ของมันเป็นค่าทศนิยม

บรรทัด 7 แสดงถึงค่าบิตถัดไป การวนซ้ำjจะสิ้นสุดลงก่อนที่จะพิมพ์ช่องว่างจากนั้นการวนซ้ำครั้งสุดท้ายiจะสิ้นสุดลง

C64 แปลง PETSCII เป็น Binary


1

JavaScript ES6, 71 ไบต์

alert(prompt().split('').map(c=>c.charCodeAt(0).toString(2))).join(' ')

ยินดีต้อนรับสู่ PPCG! คุณต้อง.split('')แยกสตริงที่ว่าง .split()ผลัดกันเข้าไป"abc" ["abc"]
เดนนิส

1

Forth (gforth) , 45 ไบต์

: f 0 do dup i + c@ 2 base ! . decimal loop ;

ลองออนไลน์!

รหัสคำอธิบาย

: f           \ start a new word definition
  0 do        \ start a loop from 0 to string length - 1
    dup i +   \ duplicate the address and add the loop index to get addr of current character
    c@        \ get the character at that address
    2 base !  \ set the base to binary
    .         \ print the ascii value (in binary)
    decimal   \ set the base back to decimal
  loop        \ end the loop
;             \ end the word definition


1

Gaiaขนาด 4 ไบต์

ċb¦ṡ

ค่อนข้างมีความสุขกับสิ่งนี้

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

ċ   Get a list of all the code points in the input string
b¦  Convert every number in that list to binary
ṡ   Joins the element of the list with spaces
Implicit Output 

ลองออนไลน์!



0

สถานะ 158

ฉันใช้วิธีการที่แตกต่างกว่าส่วนใหญ่ อ่านผ่านทางพรอมต์ display _request () (ย่อไปถึง di _r (r)) เขียนสตริงลงในไฟล์ชื่อ b ในโหมดข้อความ เปิด b ในโหมดไบนารีและอ่านอักขระแต่ละตัวเป็นไบต์และแปลงเป็นไบนารี ในทางเทคนิคแล้วไฟล์ b ควรจะปิดในตอนท้าย แต่มันเป็นโปรแกรมที่ถูกต้องและทำงานได้สำเร็จหากไม่มีมัน

di _r(r)
file open a using "b",w
file w a "$r"
file close a
file open a using "b",b r
file r a %1bu t
while r(eof)==0 {
loc q=t
inbase 2 `q'
file r a %1bu t
}

0

โกลัง - 68

ฉันยังใหม่กับ Go และฉันก็ไม่แน่ใจในกฎการนับตัวอักษรในภาษานี้ที่นี่เช่นกัน

นำเข้า (11 ไบต์):

import"fmt"

ฟังก์ชั่น (55 ไบต์):

func c(s string){for _,r:=range s{fmt.Printf("%b ",r)}}

คุณสามารถเรียกใช้มันนี่


0

C # จะไม่ชนะคำถามประเภทนี้ แต่นี่เป็นความพยายามโดยสมบูรณ์โดยไม่ต้องเข้ารหัส :)

C # - 84

Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));

สิ่งนี้สามารถทำให้สั้นลงได้มากโดยใช้ฟังก์ชัน lambda เช่น: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));อย่างไรก็ตามโปรดทราบว่าเนื่องจากการใช้.Select()ทั้งคำตอบที่สั้นกว่านี้และคำตอบดั้งเดิมของคุณจำเป็นต้องรวม 18 ไบต์using System.Linq;หากคุณไม่ระบุว่ากำลังใช้ Visual C # Interactive Compiler ซึ่งนำเข้า System.Linq โดยค่าเริ่มต้น
Skidsdev

นี่คือวิธีแก้ปัญหาของแลมบ์ดาโดยใช้ Interactive Compiler ซึ่งมีทั้งหมด 55 ไบต์
Skidsdev

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