Рядок до Бінарного


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, де кожен учень мав вибрати проект. Він сказав мені, що хоче перекласти текст у бінарне, що я тоді зробив (на його розсуд) у python 3 в 1 рядку (дуже довгий рядок). Мені здається неймовірним те, що його проектну ідею можна перегнати до 8 байт.
ericmarkmartin

1
це здорово, дякую за обмін! Мені подобаються такі прості питання, як це, тому що це дає більше людей можливість брати участь і генерує багато контенту у формі відповідей.
hmatt1

1
Чи повинен це бути ASCII? тобто, якщо технологія не сумісна з ASCII, чи можуть результати відображати це?
Shaun Bebbers

1
Чи можемо ми вважати, що 32-127 для друку ASCII? Якщо так, то чи можуть двійкові рядки становити 7 знаків із лівою нульовою підкладкою?
640 Кб

Відповіді:



13

Python 3, 41 байт

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

Як і відповідь KSFT , але я вважав, що хочу зазначити, що, крім raw_input -> inputPython 3, тут також є перевага завдяки плюсу за print.


8

Pyth, 10 байт

jdmjkjCd2z

Відображення та пояснення Python:

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

@flawr якась шкода при спробі? ;)
Оптимізатор

2
@flawr, який компілюється в python Psum(d).append(Pfilter(lambda T:gte(head(join(Plen(k),Plen()))))), whee d = '' і k = ''. Так ні, це зовсім не дійсно.
isaacg

12
@ ericmark26 огляньте свою кімнату чи офіс і розбийте все, що ви можете знайти на клавіатурі, і подивіться, чи вона інтерпретує. З’ясуйте, що це робить, а потім повторіть із наступним об’єктом. Коли ви закінчитеся, спробуйте різні обертання.
глобус

2
@ ericmark26 Я думаю, що найкращий спосіб звикнути до Pyth - це взяти кілька простих програм Python та перекласти їх на Pyth.
isaacg

4

Python 3 - 43 байти


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

Не зовсім короткий, але цікавий підхід ІМО. Він має додаткову перевагу в тому, що якщо кількість значущих бітів змінюється, EG Hi!, заливка нулями є тривіальною (ще 2 байти, на відміну від 9 для .zfill(8)):

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

3

Пітон - 52

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

Я буду працювати над перекладом цього на Pyth. Хтось уже зробив відповідь Pyth.

Якщо вам не байдуже, що це повноцінна програма або формат вводу-виводу та використання Python 3, ви можете зробити це в 23 байтах, як це:

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

x є вхід.

Я знаю, що це не зараховується, оскільки перекладач не був звільнений до опублікування виклику, але ось він знаходиться в KSFTgolf:

oan

3

Рубі, 34 28 24 байти

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

Здійснює вхід через STDIN. 6 байтів зберегли подяку за AShelly та ще 4 завдяки britishtea.


обрізання на 6 с$<.each_byte{|c|$><<"%b "%c}
Ашеллі

Ви можете поголити ще кілька символів, використовуючи String#bytesзамість них String#each_byte.
Блокова

@britishtea О, приємно. Дякую!
Мартін Ендер


2

Матлаб

Це анонімна функція

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

використання є f('Hello World').

Крім того, якщо xце визначено як рядок Hello World!у робочій області, то просто dec2bin(char(x))буде працювати.


Я не впевнений у тому, як це зробити, тому що я не впевнений, як я можу отримати вклад. Будь-які коментарі?
Давид

Чому char? Я думаю, ти маєш на увазіdec2bin(x)-'0'
Луїс Мендо

Бо я не такий розумний!
Девід

Моя думка: char(x)коли xвже струна, нічого не робить. Таким чином, ви можете видалити його, щоб заощадити місце. З іншого боку, результат dec2bin- рядок, і я думаю, що вихід повинен бути цифрами
Луїс Мендо,

Я розумію, і ти маєш рацію, звичайно. Matlab дозволяє легко іноді забувати про типи даних.
Давид

2

J - 9

1":#:3&u:

Не маю ідеї, як це зробити підряд, не подвоюючи довжину коду, мені потрібні J гуру, щоб сказати мені :)

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
Я думаю, що ОП хоче повну програму, а не лише фрагмент. Плюс до цього можна пограти в гольф набагато більше.
Родольфо Діас

це повна програма, якщо ви помістите її в основний клас, вона запуститься. що стосується кращого гольфу, напевно, але я не міг помітити як.
Брайан Девані

1
Повна програма включає і основний клас.
Родольфо Діас

може бути коротше за допомогою for(char c:a[0].toCharArray()){або навіть for(byte b:a[0].getBytes()){тому, що вхід є ascii, якщо припустити, що локальний автомат не-utf-16
njzk2

1
Ви можете позбутися publicі скоротити назву програми до одного знака, щоб набрати більше байтів. Плюс, (String[]a)відмінно прийнятий компілятором, заробивши вам ще один байт.
Родольфо Діас

2

JavaScript ES6, 63 65 байт

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

Це досить довго, завдяки довгим іменам JavaScript. Фрагмент стека нижче - приблизний еквівалент 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` ` . Ви можете promptalert
покататись

2

Скала - 59 - 55 байт

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

Зазвичай слід використовувати foreach, а не карту.


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 

Повний комп'ютерний файл DOS, виконаний у форматі COM, введення здійснюється через командний рядок.

З провідними нулями:

введіть тут опис зображення

Завантажте та протестуйте ASCBIN.COM .

Або 39 байт без провідних нулів:

введіть тут опис зображення

Завантажте та протестуйте ASCBIN2.COM .

* Оскільки явно мені не було зрозуміло, чи дозволені провідні нулі чи ні, я публікую версії обома способами.


2

MITS Altair 8800 , 0 байт

Рядок введення знаходиться за адресою пам'яті #0000H( дозволено ). Виводиться двійковою допомогою підсвічування вводу / виводу передньої панелі D7-D0.

Наприклад, зробіть RESET, EXAMINEщоб побачити перший байт, а потім повторити, EXAMINE NEXTщоб побачити решту.

"H" = 01 001 000:

введіть тут опис зображення

"e" = 01 100 101:

введіть тут опис зображення

"l" = 01 101 100:

введіть тут опис зображення

Спробуйте в Інтернеті!

Без конкуренції, звичайно. :)


1

Хаскелл, 65

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

велике використання монади списку. його не вдалося перетворити на список відомостей, оскільки останні заяви не були 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

Commodore VIC-20 / C64 / 128 і TheC64Mini, 101 токенізований байків BASIC

Ось неясний список, використовуючи скорочення ключових слів Commodore BASIC:

 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в 1або0 .

Перший рядок приймає рядковий вхід до змінної a$, і цикл починається (позначається i) довжиною цього входу. bпредставляє кожен біт від 6-го до 0-го біта. c$приймає кожен символ рядка в положенняi .

рядок 5 починає цикл для перевірки кожного бітового положення; right$використовується в рядку 6 для усунення проблеми з автоматичним форматуванням, коли Commodore BASIC відображає число, перетворюючи висновок у fn bрядок;asc(c$)перетворює поточний символ у його код ascii у вигляді десяткового значення.

Рядок 7 представляє наступне бітове значення. Цикл jзакінчується перед друком пробілу, потім iзакінчується останній цикл .

C64 перетворення PETSCII в двійковий


1

JavaScript ES6, 71 байт

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

Ласкаво просимо до PPCG! Вам потрібно .split('')розділити на порожній рядок; .split()перетворюється "abc"на ["abc"].
Денніс

1

Четвертий (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




0

СТАТА 158

Я використовував інший підхід, ніж більшість. Читайте через підказку _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))));

Це може бути значно коротше за допомогою функції лямбда, тобто: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2)));Однак зауважте, що завдяки використанню .Select()і цієї коротшої відповіді, і вашої оригінальної відповіді потрібно включати 18 байт, using System.Linq;якщо ви не вказали, що він використовує Visual C # Interactive Compiler , яка імпортує System.Linq за замовчуванням
Skidsdev

Ось рішення функції лямбда з використанням інтерактивного компілятора, всього 55 байт
Skidsdev

0

Кобра - 64

Як лямбда:

do(s='')=(for c as int in s get Convert.toString(c,2)).join(' ')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.