Справка: иностранные программисты говорят только на ASCII


22

Установка сцены:

Это средний день, так как вы расслабляетесь после долгого дня, занимаясь своим любимым времяпрепровождением: отвечая на множество увлекательных вопросов о PPCG. Это был не хороший день для тебя; эти проклятые программисты Pyth продолжают получать лучший ответ, и это убивает ваше настроение. Неожиданно вы замечаете, что новый вопрос был опубликован! Вы решаете; не в этот раз CJammers. Яростно, вы начинаете печатать, рождая поток символов; плод славной петли BrainFuck, которым станет ваш конечный продукт. Вы печатаете и печатаете. Быстрее! Еще быстрее! Вы настолько сосредоточены, что даже не замечаете, что огни на вашем экране начинают мигать и выключаться. Внезапно монитор светится зеленым, на рабочем столе изображен символ, похожий на пришельца. Используя свои безупречные навыки, выcat ~/Desktop/aliensymbolи получить с кучей чисел, сообщение! Будучи проницательным программистом PPCG, вы заметили, что это похоже на ASCII. Неважно для тебя, ты print(chr(i) for i in file)и расшифруй сообщение. Ваша первая мысль: «Мне нужно поделиться этим с сообществом!».

...

Кто бы мог подумать? Что первыми, кто вступит в контакт с инопланетянами, будут скромные программисты PPCG. Почему нас? Может быть, это потому, что мы являемся воплощением человеческого интеллекта. Или, может быть, потому что BrainFuck примерно так же близок, как мы, к иностранному языку. Тем не менее, инопланетяне - будучи сверхинтеллектуальными формами жизни, которыми они являются - хотят проверить, должны ли они классифицировать человеческую расу как разумную или нет. В качестве проверки нашего умственного мастерства инопланетяне попросили нас отправить им несколько компьютерных программ, чтобы продемонстрировать, что мы технологически развиты. Вопрос в том, что единственный человеческий язык, который они понимают, это числовой ASCII!

Помогите человечеству показать тем существам, которые являются настоящей интеллектуальной альфой. Нам нужно отправить им скрипт, который преобразует наши текстовые исходные коды в их числовые версии ASCII. К сожалению, из-за нашей неразвитой технологии (спасибо Обаме), мы должны отправить как можно меньшую программу перевода. Хорошо, что они решили связаться с PPCG!

Соревнование:

Суть этой задачи проста: вы должны написать программу, которая будет брать исходный код любой программы (или любой общий текстовый файл в этом отношении) и выводить его разделенную пробелами версию с переводом ASCII ниже каждой строки. То есть, учитывая ввод текстового файла, вам необходимо вывести каждую строку этого файла, за которой следует строка, содержащая представление ASCII каждого символа в строке над ним (с каждым числом, совпадающим с символом, который он представляет).

Пример очень прояснит это. Принимая исходный код печально известного hello worldв качестве ввода:

#include <stdio.h>

int main() {
    printf("hello, world\n");
    return 0;
}

ваша программа должна вывести:

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   (   )       {
105 110 116 32  109 97  105 110 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

Детали реализации:

Вы можете выбрать ввод данных в любой форме, которую пожелаете (открытие файла, конвейер командной строки, параметр функции и т. Д.), И вам следует вывести на стандартный вывод или вернуть вывод из функции.

Что нужно отметить

  • Каждый символ в выходных данных разделен символом '\ t', чтобы обеспечить возможность размещения строки из 3 цифр в строке ниже (мы будем предполагать, что для вашей вкладки установлено значение 4 или более пробелов).
  • Новые строки отображаются в строке, в которой была нажата клавиша возврата (обратите внимание на 10 в примере)
  • Требования к печати '\ t' и '\ n' невелики. Ваш вывод должен, в общем смысле, выглядеть приятным для глаз (нужно показать, что у этих инопланетян есть и эстетический смысл), и если вы сможете согнуть два предыдущих пункта, сохраняя визуальную целостность, вы будете прощены.
  • Вы можете предположить, есть ли новая строка в конце последней строки.

счет

Это код-гольф, поэтому выигрывает самая короткая программа. Обратите внимание, что даже если ваша программа не самая короткая, но использует действительно изящные приемы относительно языка, который вы используете, многие +1 вам!

Удачи. Межгалактический рейтинг человечества лежит на ваших плечах.

Примечание: пожалуйста, прости сюжетные дыры. Я не писатель : D


8
Может быть, отказаться или значительно упростить «сюжет» и просто оставить вызов. Я, честно говоря, не собираюсь читать 3 абзаца предыстории. Я просто собираюсь прочитать вызов, потому что для этого я здесь.
mbomb007

1
@YetiCGN Разрыв строки действует как разрыв строки (вы не можете видеть символ, представляющий его, но вы можете видеть разрыв), и вам все еще нужно явно записать его в версии ascii. Думайте об этом так, как будто вы регулярно просматриваете исходный код для поиска \ n Везде, где будет выделен ваш поиск, вы должны написать 10. Вот пример из vim (игнорируйте последний).
Gowrath

26
@ mbomb007 tbh, это была довольно эпическая предыстория. Мне это нравилось
Maltysen

7
@ mbomb007 Те, кто хочет читать, могут, а те, кто не может, сразу переходят к заданию; Такова красота субтитров.
Gowrath

1
Я читаю это как «первыми, кто вступит в контакт с людьми , будут скромные программисты PPCG».
marczellm

Ответы:


5

Dyalog APL , 14 байтов

Принимает список строк, которые включают последовательности новой строки (10 или 13 10 и т. Д.)

↑(⊢,[.5]⎕UCS

Матрифицировать список списков, состоящий из

(... для каждой строки возврата ...

сам текст

,[.5] затем в новом измерении перед первым измерением

⎕UCSU nicode С haracter S ET кодовые точки

Попробуй APL онлайн!


Разве вы не вызываете это один раз для каждой строки вместо того, чтобы принимать все входные данные сразу?
Стивен Х.

1
@StevenH. Нет, функция (самая правая часть) содержит цикл, но в целом она вызывается только один раз. Посмотрите пример TryAPL, который fвызывается непосредственно на входе. Чтобы вызвать функцию один раз в строке, если бы сказал .
Адам

9

Пиф, 17 13 байт

Еще один из тех программистов Pyth. Сожалею.

Новый код требует, чтобы каждая строка была заключена в кавычки и экранирована (включая новые строки, если вы хотите, чтобы они были напечатаны), но добавляет дополнительную новую строку между строкой и ASCII.

jjLC9smCMBd.Q

Попробуйте онлайн!

Объяснение:

           .Q  Evaluate all input lines
      m        For each of those lines:
         Bd     Return the line and
       CM       the line mapped to ASCII characters
     s         Sum all these together to begin alternating between line and mapped line
 jLC9          Join all the characters and numbers in the lines and mapped lines on tabs
j              And join all of those on newlines

Я держу старый код и его объяснение ниже.

#Jw
jKC9J
jK+CMJT

Попробуйте онлайн! или используйте более легкий для чтения контрольный пример .

Объяснение:

#                  Until we run into an error:
 Jw                 Read in the next line of input and call it J.
                     (When there is no line of input, error is thrown that ends program.) 

j                  Join: 
    J               all characters in input line
 KC9                and insert tab characters (C9), which we can refer to later as K.
                        (Setting it to a variable doesn't save or lose bytes.)

                   Implicit print that join with trailing newline.

j                  Join:
   CMJ              the mapping of ASCII numbers to characters in the input,
 K                  inserting tab characters in between every number
  +   T             And with a trailing 10 for the newline at the end.

1
Я думаю, что ваша первая ссылка не работает так же хорошо, как вторая (я не думаю, что она печатает новые строки). Вы можете обновить код в нем.
gowrath

8

Python 2, 105 байт

Это использует немного другой подход, чем ответ ОП. Обратите внимание, что ТАК портит мои буквенные вкладки с пробелами.

def f(s):
 o=x=''
 for c in s:
    o+=c+"  ";x+="%s    "%ord(c)
    if"\n"==c:print o[:-1],x;o=x=''
 print o+"\n"+x

Попробуйте онлайн


Не x+=ord(c)+" "будет короче чем "%s "%ord(c)?
DJMcMayhem

@DJMcMayhem Нельзя добавить целое число в строку. x+=`ord(c)`+" "такой же длины.
mbomb007

8

Vim, 86, 77 нажатий клавиш

:g/^/norm A<C-v><C-v>10<C-v><esc>Yp:s/./\=char2nr(submatch(0))."\t"/g<C-v><cr>k:s/./&\t/g<C-v><cr>
:%s/<C-v><cr>0<cr>

Это слишком долго, но это то, что вы получаете, когда используете evalфункцию vim ( \=).


6
Не могу сказать \=, объясняет ли ваша функция eval, или грустное лицо, потому что вы используете функцию eval ...
AdmBorkBork

2
@timmyD Первый. Это мое грустное лицо. D;
DJMcMayhem


6

Perl, > 33 31 байт

Включает в себя +3 for -F(нельзя комбинировать с -eкодом ', поэтому есть пробел и -тоже учитываются).

Запустить с вводом по STDIN или дать одно или несколько имен файлов в качестве аргумента

perl -M5.010 asciidump.pl <<< "Hoi"

asciidump.pl

#!/usr/bin/perl -F
$"=v9;say"@F@{[unpack'W*']}"

Вывод неэстетичен, если текст содержит вкладку или нет заключительного перевода строки


5

Pyth, 21 байт

j.imjC9d.zmjC9+CMdT.z

Вот запись от одного из "этих проклятых программистов Pyth" ;)

Программа, которая принимает ввод многострочной строки без кавычек в STDIN и печатает результат. Это предполагает, что весь ввод имеет завершающий символ новой строки. Если вы хотите, чтобы он <работал без завершающего символа новой строки, добавьте его в начале программы и )_3в конце.

Попробуйте онлайн

Вывод для тестового примера трудно увидеть в онлайн-интерпретаторе, поэтому я включил его здесь:

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   t   (   )       {
105 110 116 32  109 97  105 110 116 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

Как это работает

j.imjC9d.zmjC9+CMdT.z  Program. Input: .z (All of STDIN split on newlines)
     C9                 Yield tab character by taking chr(9)
    j                   Join on tab
   m   d.z             Map that over .z
               CM       Map ord()
              +   T     Append 10
           jC9          Join on tab
          m      d .z  Map that over .z
 .i                    Interleave the results of the two mappings
j                      Join on newlines
                       Implicitly print

Вы можете сэкономить 2 байта, избавившись от .zи приняв ввод как список строк
Maltysen

1
@ Maltysen Судя по вопросу и другим ответам, я думаю, что разделение на новые строки является частью проблемы.
TheBikingViking

5

C 136 117 114 байт

#define p(s)while(l[i])printf(s,l[i++]);i=0;puts("")
char l[99];i;f(f){while(fgets(l,99,f)){p("%c\t");p("%d\t");}}

char l[99];i;f(f){while(fgets(l,256,f)){i=0;while(l[i])printf("%c\t",l[i++]);i=0;puts("");while(l[i])printf("%d\t",l[i++]);puts("");}}

Можно проверить как это

infile;
main(c,v)char**v;
{
    infile=fopen(v[1],"r");
    f(infile);    
}

Наличие char**vвнутри main()спасло бы вас там 2 персонажа ..
Алексис Уилк

Я считаю только 114 байтов в этом коде. Я думаю, что вы используете CRLF вместо LF (117-> 115), плюс у вас есть завершающий символ новой строки (115-> 114).
Тим Час

4

PowerShell v2 +, 85 байт

gc $args|%{$a=$b='';$_-split'(.)'-ne''|%{$a+="$_`t";$b+="$(+[char]$_)`t"};$a;$b+"10"}

Ввод осуществляется через путь к файлу. Затем мы Get-Content(псевдоним gc) на этот файл, который автоматически разделяется на новые строки. Мы зациклились на каждом из них |%{...}. Начните с настройки$a и $bна пустую строку - это наши символы ASCII и кодовые точки соответственно. Затем мы -splitвводим строку для каждого символа, сохраняя его(.) и удаляя пустые значения -ne''(это происходит из-за того, как .NET выполняет синтаксический анализ), а затем отправляем их в другой цикл.

В каждом внутреннем цикле мы соединяем строку текущего символа с вкладкой `tи добавляем его на $a. Точно так же, за $bисключением того, что мы явно приводим как a, charа затем как int+ .

Вне внутреннего цикла мы помещаем полученный результат $aи $b(с указателем перевода строки, так как это никогда не будет появляться в нашем цикле) в конвейер. Те собираются с неявным Write-Outputпри завершении программы.

пример

(с пониманием, что у меня завершающий перевод строки и Markdown меняет символ табуляции)

PS C:\Tools\Scripts\golfing> .\aliens-only-understand-ascii.ps1 '.\aliens-only-understand-ascii.txt'
#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >   
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   t   (   )       {   
105 110 116 32  109 97  105 110 116 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   w   ,       w   o   r   l   d   \   n   "   )   ;   
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 119 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;   
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}   
125 10

Черт, я только что написал ответ PowerShell, хотя каким-то образом удалось полностью пропустить этот! Всегда рад видеть шикарный, хотя! :)
Бриантист

4

> <> (Рыба), 48 байт

>i:0(?v::oa=?v9o
2';'oa<.20r  <~p3
o9nv?=0l
voa<

Задача, на которой сияет язык! Я уверен, что мог бы сыграть в гольф немного больше, но это была длинная неделя. Могу взглянуть на это позже, хотя.

Попробуйте онлайн!

Альтернативно, попробуйте онлайн, что, на мой взгляд, выглядит лучше, но перенос текста немного запутан для ввода с длинными строками, как в тестовом примере.


4

PHP, 131 115 байт

Просто FGITW, может быть, я могу улучшить это больше. Оказывается, я могу!

Первая версия в 131 байт:

<?$s=file($argv[1]);foreach($s as$l){$a=str_split(trim($l));echo join(' ',$a).'
';$i=0;while($c=ord($l{$i++}))echo$c.'  ';echo'
';};

Имя файла указывается в качестве первого аргумента после имени скрипта: php aliens.php helloworld.c

Вторая версия на 115 байтов:

function($s){foreach($s as$l){$a=str_split($l);echo join('  ',$a);$i=0;while($c=ord($a[$i++]))echo$c.'  ';echo'
';}};

Первая версия учитывает пропущенные символы новой строки в конце строки, но после дополнительного разъяснения мы можем оставить этот код и поместить все в функцию, чтобы сэкономить 16 байт.

Пробельные символы join(' ',$a)как и внутри echo$c.' 'являются символами табуляции = \t. Новые строки в коде специально.


3

Python 3, 89 77 байт

более гольф версия, основанная на той же идее:

def f(s):
 for a in s:print(*map('{:>4}'.format,[*a,*a.encode()]),end='\n\n')

Если есть «\ т это на входе, а затем изменить 4к 9.

Предыдущая версия:

def f(s):
 for l in s:
  print(*l,sep='\t',end='');print(*l.encode(),sep='\t',end='\n\n')

Принимает список строк, каждая из которых заканчивается на \ n.


protip: вы можете оставить печатные заявления в конце for l in siefor l in s:print(*l,sep='\t',end='');print(*l.encode(),sep='\t',end='\n\n')
Destructible Lemon

Я не проверял это, но я думаю, что можно снять с 8lambda s:'\n\n'.join(*map('{:>4}'.format,[*a,*a.encode()])for a in s)
DJMcMayhem

3

Powershell, 56 байт

gc $args|%{($a=[char[]]$_)-join"    ";[int[]]$a+10-join"    "}

Скрипт принимает путь к файлу в качестве ввода. Get-Content автоматически разбивает входные данные на массив строк, разделенных на новые строки в источнике.

Оттуда я ввожу foreach, приводим к массиву символов и устанавливаю его в $ a, соединяю его с вкладками и печатаю его. Далее, но все еще в пределах foreach, я преобразую массив символов в массив целых чисел, добавляю перевод строки и снова соединяюсь с вкладкой.

Звонок выглядит так:

PS C:\PretendFolder> .\aoua.ps1 ".\aoua.txt"

и вот выходной образец

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   (   )       {
105 110 116 32  109 97  105 110 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

2

JavaScript (ES6), 94 байта

s=>s.replace(/(.*)\n?/g,(s,n)=>n&&[...s].join`␉`+`
${[...n].map(c=>c.charCodeAt()).join`␉`}
`)

Где ␉ обозначает буквальный символ табуляции. Работает до тех пор, пока ввод не содержит символов табуляции. 81-байтовая версия, которая также требует, чтобы ввод имел завершающий перевод строки:

s=>s.replace(/.*\n/g,s=>[...s].join`␉`+[...s].map(c=>c.charCodeAt()).join`␉`+`
`)

Я думаю, .split().map()может победить .replace(). После того, как экранированные символы были оптимизированы с помощью обратных кавычек, это должно быть 85 байт: s=>s.split('\n').map(c=>(s=[...c]).join('\t')+'\n'+s.map(c=>c.charCodeAt()).join('\t')).join('\n')(Извините, я не знаю, можно ли / как добавить обратные кавычки в комментарии.)
Арно

@Arnauld не работает для (например) голого символа новой строки. Кроме того, чтобы включить обратные пометки в комментарии, поставьте перед ними обратную косую черту.
Нил

2

C #, 64 63 байта

s=>{foreach(int c in s+(s=""))s+=c+(10==c?"\n":"    ");return s;};

-1 байт с использованием фактического символа табуляции вместо \t . Примечание: визуализируется как 4 пробела сверху и 2 пробела в негольфированной версии ниже.

Ungolfed:

/*Func<string, string> Lambda =*/ s =>
{
    // Enumerate the ascii (int) values of the chars in s, 
    // but at the same time set input s to "" to use at the output var.
    // +(s="")   is 2 bytes less than   var o="";
    foreach (int c in s + (s=""))
        // Append the string representation of the ascii value,
        // Append new line if c was new line, otherwise append tab. 
        s += c + (10==c ? "\n" : "  ");
    return s;
};

Полученные результаты:

(Примечание: Visual Studio использовал \r\nдля новых строк, когда я вставлял ввод, отсюда и 13 10окончания строк в выводе)

Input:

#include <stdio.h>

int maint() {
    printf("hello, world\n");
    return 0;
}

Output:

35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  13  10
13  10
105 110 116 32  109 97  105 110 116 40  41  32  123 13  10
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  13  10
32  32  32  32  114 101 116 117 114 110 32  48  59  13  10
125 

2

CJam, 27 байт

qN/{_1/9c*N+\{is9c}%+}%AN+*

Попробуйте онлайн!

объяснение

q       e# Take the whole input
N/      e# Split on newlines
{       e# Map this block to every line:
_        e# Duplicate
1/       e# Split into characters
9c*      e# Join with tabs (ASCII code 9)
N+       e# Append a newline
\        e# Swap top elements
{is9c}%  e# Map each character to its ASCII code plus a tab character
+        e# Concatenate the two lines
}%      e# (end of block)
AN+*    e# Join with "10" plus a newline

1/И sне нужно.
Мартин Эндер

2

PowerShell, 61 59 байт

gc m|%{$b="$_
"[0..$_.Length]
$b-join'    '
[int[]]$b-join' '}

Что следует отметить:

  • Читает входные данные из файла с именем m в текущем каталоге.
  • Все разрывы строк, (включая тот, который вставлен в строку после первого $_ ), являются только буквальными переводами строки (0xA), поэтому по одному байту каждый.
  • Содержимое строк сразу после -joinоператоров представляет собой символ табуляции (независимо от того, как он отображается здесь).

Ungolfed

Get-Content m | ForEach-Object -Process { # Read the file line by line
    $b = "$_`n"[0..$_.Length]   # Line by line processing strips line endings, so add a newline
                                # Index operator on a [string] returns a [char], or given a [range], a [char[]]
                                # Using $_.Length automatically accounts for the extra linebreak (0 based index)
    $b -join "`t"               # PowerShell displays [char] as the printable character by default, so join the array with a tab
    [int[]]$b -join "`t"        # We need to convert the [char]s to an [int]s so we can display it as a number
                                # So cast the [char[]] as [int[]], then join with tab again

}

Ваш код печатает ascii 13, символ новой строки вместо 10, возврат каретки, как в примере с выходным
заданием

@Chirishman PowerShell поддерживает использование только ASCII 10 для разрыва строки в файлах .ps1, но это может быть непросто сделать в Windows с большинством текстовых редакторов. Используя SCiTE или Notepad ++ или другие редакторы, понимающие конец строки, вы можете убедиться, что он использует окончания unix. Как только вы убедитесь, что файл не содержит 13, он напечатает 10.
Бриантист

0

Java, 202 байта

s->{for(String g : s.split("\n")){g.chars().forEach(c->System.out.print((char)c+"   "));System.out.println();g.chars().forEach(c->System.out.print(c+(c<10?"  ":c<100?"  ":" ")));System.out.println();}};

Я даже не могу быть обеспокоен тем, чтобы сделать это короче ..



-1

Python 3, 92 97 107 байт

для i в списке (open (input ()). read (). split ("\ n")): для j в i: печать (i + "\ n" + ord (j))

p=print
for i in list(open(input()).read().split("\n"))
    s=t=''
    for j in i:
        r=str(ord(j))
        s+=j+' '*len(r)
        t+=r+' '
    p(s)
    p(t)

Это не проверено, но должно работать.

Спасибо @gowrath за указание на то, что код не работает так, как указано в вопросе.


Почему бы нет? Все, что input()делает команда - получает имя файла, который нужно открыть.
sonrad10

@ Хорошо, хорошо.
sonrad10

Это не перекрывает текст и вывод ascii, как в спецификации вопроса; просто печатает номера.
Gowrath

@ Gowrath спасибо, я исправлю это как можно скорее.
sonrad10

@ sonrad10 Удалить до исправления.
mbomb007
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.