İkili Dize


19

Bu bir kod golf meydan okumadır. Tıpkı başlığın dediği gibi, bir dizi ascii karakterini ikili dosyaya dönüştürmek için bir program yazın.

Örneğin:

"Hello World!" dönüşmelidir 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001.

Not: Özellikle bir pelin uygulamasıyla ilgileniyorum.



1
Onu farkettim. Bu soruyu neden sorduğum için bir fıkra var. Arkadaşımı programlama öğrenmeye teşvik ettim ve geçen yaz her öğrencinin bir proje seçmesi gereken bir java dersi aldı. Metni ikiliye çevirmek istediğini söyledi, daha sonra (satırına) python 3'te 1 satırda (çok uzun bir satır) yaptım. Proje fikrinin 8 bayta kadar damıtılabilmesini inanılmaz buluyorum.
ericmarkmartin

1
bu harika, paylaştığın için teşekkürler! Bunun gibi daha kolay soruları severim çünkü daha fazla insana katılma şansı verir ve cevap şeklinde çok sayıda içerik üretir.
hmatt1

1
ASCII olmalı mı? yani, bir teknoloji ASCII uyumlu değilse, sonuçlar bunu yansıtabilir mi?
Shaun Bebbers

1
ASCII yazdırılabilir 32-127 olduğunu varsayabilir miyiz? Öyleyse, ikili dizgiler sol sıfır dolgulu 7 karakter olabilir mi?
640KB

Yanıtlar:


13

CJam, 8 bayt

l:i2fbS*

Çantada keklik:

l:i           "Read the input line and convert each character to its ASCII value";
   2fb        "Put 2 on stack and use that to convert each ASCII value to base 2";
      S*      "Join the binary numbers by space";

Burada deneyin


13

Python 3, 41 bayt

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

Gibi KSFT cevabı , ama ben ek olarak, işaret düşündüm raw_input -> inputnedeniyle için uyarının için, Python 3 burada da bir avantaja sahiptir print.


8

Pyth, 10 bayt

jdmjkjCd2z

Python haritalaması ve açıklaması:

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"

Girdi, tırnak işaretleri olmadan dönüştürülmesi gereken dizedir.

Burada deneyin


10
Asdfghjlkl de geçerli bir pyth programı mıdır? Bu ne işe yarıyor?
Kusur

@flawr denemede herhangi bir zarar var mı? ;)
Doktor

2
@flawr Bu python için derlenir Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), whee d = '' ve k = ''. Yani hayır, hiç geçerli değil.
isaacg

12
@ ericmark26 odanızın veya ofisinizin etrafına bakın ve klavyenizde bulabileceğiniz her şeyi parçalayın ve yorumlayıp yorumlamadığını görün. Ne yaptığını anlayın ve bir sonraki nesneyle tekrarlayın. Bittiğinde farklı dönüşler dene.
globby

2
@ ericmark26 Bence Pyth'e alışmanın en iyi yolu bazı basit Python programlarını alıp Pyth'e çevirmektir.
isaacg

4

Python 3-43 bayt


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

Oldukça kısa değil, ama ilginç bir yaklaşım IMO. Ayrıca, önemli bitlerin sayısı değişiyorsa, EG Hi!, sıfırlarla doldurmanın önemsiz (9 için değil, 2 bayt daha) olması da avantajlıdır .zfill(8):

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

3

Python - 52

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

Bunu Pyth'e çevirmeye çalışacağım. Başka biri zaten bir Pyth cevabı verdi.

Tam bir program veya G / Ç formatı ile ilgilenmiyorsanız ve Python 3'ü kullanıyorsanız, bunu 23 baytta yapabilirsiniz:

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

x girdidir.

Bunun önemli olmadığını biliyorum çünkü yorumlayıcı meydan okumadan önce yayınlanmadı, ancak burada KSFTgolf'ta:

oan

3

Yakut, 34 28 24 bayt

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

STDIN ile girdi alır. AShelly için 6 bayt, britishtea sayesinde 4 bayt tasarruf etti.


trim by 6 with$<.each_byte{|c|$><<"%b "%c}
AShelly

Bunun String#bytesyerine kullanarak daha fazla karakter tıraş edebilirsiniz String#each_byte. Blok formu kullanımdan kaldırıldı, ancak yine de çalışıyor :)
britishtea

Oh, güzel. teşekkür ederim!
Martin Ender


2

Matlab

Bu anonim bir işlevdir

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

kullanımıdır f('Hello World').

Alternatif xolarak Hello World!, çalışma alanındaki dize olarak tanımlanırsa , yalnızca dec2bin(char(x))çalışır.


Nasıl puan alacağımdan emin değilim çünkü girdiyi nasıl alabileceğimden emin değilim. Herhangi bir yorum?
David

Neden char? Sanırım demek istiyorsundec2bin(x)-'0'
Luis Mendo

Çünkü ben o kadar zeki değilim!
David

Benim nokta: char(x)ne zaman x, zaten bir dizedir hiçbir şey yapmaz. Böylece yerden tasarruf etmek için onu kaldırabilirsiniz. Öte yandan, sonucu dec2binbir dizedir ve bence çıktı sayı olmalı
Luis Mendo

Anlıyorum ve haklısın elbette. Matlab bazen veri türlerini unutmayı kolaylaştırır.
David

2

J - 9

1":#:3&u:

Kodun uzunluğunu iki katına çıkarmadan bunu nasıl yapacağım hakkında bir fikrim yok, J gurusun bana söylemesine ihtiyacım var :)

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

2
".Başlangıca ekleyebilirsiniz . Sonuçlarınızı tek bir satırda ve boşluklarla ayrılmış şekilde değerlendirir. Hatta daha kısa temel2 basamağı ile Base10 numaralarını oluşturmaktır: 10#.#:3&u:.
randomra

2

Java - 148 Bayt

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)+" ");}}}

Tam dosyayı içerecek şekilde düzenlendi


2
Bence OP sadece bir pasaj değil tam bir program istiyor. Artı, çok daha fazla golf edilebilir, methinks.
Rodolfo Dias

bu tam programdır, bunu ana sınıfa koyarsanız çalışır. daha iyi golf gelince, muhtemelen ama ben nasıl nokta değil.
Bryan Devaney

1
Tam program ana sınıfı da içerir.
Rodolfo Dias

utf-16 olmayan bir makine yerel ayarı varsayarak, giriş ascii olduğu için for(char c:a[0].toCharArray()){veya daha kısa olabilirfor(byte b:a[0].getBytes()){
njzk2

1
Daha publicfazla bayt kazanmak için program adından kurtulabilir ve tek bir karaktere kısaltabilirsiniz. Artı, (String[]a)derleyici tarafından mükemmel bir şekilde kabul edilir ve size başka bir bayt kazanır.
Rodolfo Dias

2

JavaScript ES6, 63 65 bayt

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

JavaScript'in uzun işlev adları sayesinde bu oldukça uzun. Aşağıdaki Yığın Snippet'i kaba ES5 eşdeğeri olduğundan, herhangi bir tarayıcıda çalıştırılabilir. Golf geliştirmeleri için edc65'e teşekkürler.

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


1
[for of][...].mapdizelerde karakter alert([for(c of prompt())c.charCodeAt().toString(2)].join(' '))
saymaktan

Değiştirerek iki bayt kapalı yapabilirsiniz golf .join(' ')ile .join` ` . prompt/alert
RamenChef

2

Scala - 59 - 55 karakterlik

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

Normalde harita değil, foreach kullanılmalıdır.


2

8088 makine kodu, IBM PC DOS, 33 31 bayt *

Liste:

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 

Komple PC DOS çalıştırılabilir COM dosyası, giriş komut satırı üzerinden.

Baştaki sıfırlarla:

resim açıklamasını buraya girin

ASCBIN.COM'u indirin ve test edin .

Veya başında sıfır olmadan 39 bayt :

resim açıklamasını buraya girin

ASCBIN2.COM'u indirin ve test edin .

* Baştaki sıfırlara izin verilip verilmediğine dair net olmadığı açık olduğundan, sürümleri her iki şekilde de gönderiyorum.


2

MITS Altair 8800 , 0 bayt

Giriş dizesi bellek adresindedir #0000H( izin verilir ). Ön panel G / Ç ışıkları ile ikili çıkış D7-D0.

Örnek, do RESET, o zaman EXAMINEilk baytı görmek için, tekrar ardından EXAMINE NEXTkalan kısmını görmek için.

"H" = 01 001 000:

resim açıklamasını buraya girin

"e" = 01 100 101:

resim açıklamasını buraya girin

"l" = 01 101 100:

resim açıklamasını buraya girin

Çevrimiçi deneyin!

Tabii ki rakipsiz. :)


1

Haskell, 65

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

liste monad'ın yoğun kullanımı. son ifadeler bir değildi çünkü liste anlayışlarına dönüştürülemedi return.


1

C ++ - 119 bayt

Hafıza boş mu? Bu da ne?

#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 kodu uyarı ile derler)


1
C versiyonu, kısamain(int c,char**v){char x[9];for(;c=*(v[1]++);printf("%s ",itoa(c,x,2)));}
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳





1

Commodore VIC-20 / C64 / 128 ve TheC64Mini, 101 tokenize BASIC baytı

Commodore BASIC anahtar kelime kısaltmaları kullanılarak gizlenmiş liste:

 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

Burada açıklama amacıyla gizlenmemiş sembolik liste verilmiştir:

 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

İşlev fn bhattı sıfır beyan bir sayısal parametre kabul xedildiği ANDdeğeriyle ed b; SGN daha sonra veya biçimine dönüştürmek x and biçin kullanılır .10

Birinci satır, değişkene bir dize girdisini kabul eder a$ve döngü i, bu girişin uzunluğuna başlar (ile belirtilir ). b6. ila 0. bit arasındaki her biti temsil eder. c$dizenin her karakterini yerinde alır i.

çizgi 5, her bit konumunu test etmek için döngüyü başlatır; right$Commodore BASIC bir sayı görüntülediğinde ve çıktıyı fn bbir dizeye dönüştürdüğünde otomatik biçimlendirme sorununu gidermek için satır 6'da kullanılır ; asc(c$)geçerli karakteri ondalık bir değer olarak ascii koduna dönüştürür.

Satır 7, bir sonraki bit değerini temsil eder. jBoşluk yazdırılmadan önce döngü sonlanır, ardından son döngü isona erer.

C64 PETSCII'yi Binary'ye çeviriyor


1

JavaScript ES6, 71 bayt

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

PPCG'ye Hoşgeldiniz! .split('')Boş dizede bölmeniz gerekir ; .split()döner "abc"içine ["abc"].
Dennis

1

İleri (gforth) , 45 bayt

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

Çevrimiçi deneyin!

Kod Açıklaması

: 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 bayt

ċb¦ṡ

Bundan oldukça memnunum

Nasıl çalışır

ċ   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 

Çevrimiçi deneyin!



0

STATA 158

Çoğundan farklı bir yaklaşım kullandım. Ekran _request () istemi (di _r (r) olarak kısaltılmıştır) aracılığıyla okuyun. Dizeyi metin modunda b adlı bir dosyaya yazın. İkili modda b'yi açın ve her karakteri bayt olarak okuyun ve ikiliye dönüştürün. Teknik olarak b dosyası sonunda kapatılmalıdır, ancak geçerli bir programdır ve onsuz başarıyla çalışır.

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

Golang - 68

Go'da yeniyim ve burada da bu dilde karakter sayma kurallarından emin değilim.

İthalat (11 bayt):

import"fmt"

İşlev (55 bayt):

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

Buradan çalıştırabilirsiniz .


0

C # bu tür soruları asla kazanmayacak, ama burada kodlamadan tamamen deneyin. :)

C # - 84

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

Bu bir lambda işlevi kullanılarak çok daha kısa yapılabilir, yani: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));Ancak .Select(), bu kısa yanıtın ve orijinal yanıtınızın using System.Linq;kullanılması nedeniyle, Visual C # Etkileşimli Derleyiciyi kullandığını belirtmedikçe 18 bayt içermesi gerektiğini unutmayın. , System.Linq'i varsayılan olarak içe aktarır
Skidsdev

İşte İnteraktif Derleyici kullanan lambda fonksiyon çözümü, toplam 55 bayt
Skidsdev

0

Kobra - 64

Lambda olarak:

do(s='')=(for c as int in s get Convert.toString(c,2)).join(' ')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.