Создать; # код

36

Связанный с: Сделать интерпретатор; #

В вышеупомянутой связанной задаче стояла задача создать переводчика для эзотерического языка ;#.

;#язык

Язык имеет ровно две команды: ;и #(все остальные символы игнорируются интерпретатором):

;: Увеличить аккумулятор

#: По модулю аккумулятора на 127, выведите соответствующий символ ASCII и сбросьте аккумулятор на 0.

Вызов

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

вход

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

Выход

Выводом является сгенерированная ;#программа путем возврата или печати в стандартный вывод. Пока программа действует, она может содержать иные , чем лишние символы #и , ;как и все остальные символы игнорируются.

Примеры

Input: Hello, World!
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Input: ABC
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Input: ;#
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Leaderboard

kalsowerus
источник
9
Brilliant! Рад видеть, # привлекает внимание!
Кэрд coinheringaahing
1
Вы можете проверить свой вывод здесь , так как; # + - это расширенный набор; #.
Адам
3
Может ли вывод содержать дополнительный символ? ;#игнорирует все остальные символы, поэтому сгенерированная программа все равно будет работать.
Деннис
2
@ Benoît: модуль не имеет значения при генерации кода, так как всегда проще генерировать код, использующий минимальное количество ;. Во-вторых, 127 правильно, как указано в связанном вопросе, который содержит спецификацию языка; #.
Джои
2
На самом деле это не так. «Generate #; code» - лучший заголовок. Я собираюсь изменить это на это.
Mego

Ответы:

49

; # + , 61 байт

Конг Оф Брайен

;;;;;;;(~;;;;;~-;-)~>:~;;;;(~;;;;;;~-;-)~>~-*((;~<#~):<#-:-*)

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

Обратите внимание, что вход имеет завершающий нулевой байт.

овс
источник
12
Очки за стиль.
Чоулетт
1
Я одобряю этот ответ: D определенно правильный язык для работы
Конор О'Брайен
34

; # + , 40 байт

;;;;;~+++++++>~;~++++:>*(-(;~<#~):<#-*:)

Попробуйте онлайн! Ввод завершается нулевым байтом.

объяснение

Код разбит на две части: генерация и итерация.

поколение

;;;;;~+++++++>~;~++++:>

Это помещает константы ;и #в память как таковую:

;;;;;~+++++++>~;~++++:>
;;;;;                     set A to 5
     ~                    swap A and B
      +++++++             add B to A 7 times
                          (A, B) = (5*7, 5) = (35, 5)
             >            write to cell 0
              ~           swap A and B
               ;          increment A
                ~         swap A and B
                          (A, B) = (35, 6)
                 ++++     add B to A 4 times
                          (A, B) = (59, 6)
                     :    increment cell pointer
                      >   write to cell 1

итерация

*(-(;~<#~):<#-*:)
*                    read a character into A
 (            * )    while input is not a null byte:
  -                  flip Δ
   (     )           while A != 0
    ;                decrement
     ~               swap A and B
      <              read ";" into A
       #             output it
        ~            swap A and B
           :         decrement cell pointer
            <        read "#" into A
             #       output it
              -      flip Δ
               *     take another character from input
                :    increment cell pointer
Конор О'Брайен
источник
1
Все это из шутливого языка, который я сделал, когда мне было скучно. Я польщен.
caird coinheringaahing
@RandomUser: D - это забавная концепция, с которой можно поиграть
Conor O'Brien
да. Что если я хочу, чтобы программа выводила нулевой байт; #?
Tuskiomi
#@tuskiomi. Попробуйте онлайн!
Конор О'Брайен
@ ConorO'Brien, как бы я включил это в вашу программу?
Tuskiomi
12

Желе , 10 8 7 байт

O”;ẋp”#

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

O”;ẋp”#  Main Link
O        Map over `ord` which gets the codepoint of every character
 ”;ẋ     Repeat ';' the required number of times
     ”#  '#'
    p    Cartesian Product; this puts a '#' at the end of each element in the array

Implicit Output shows as a single string

-2 байта благодаря @Emigna
-1 байту благодаря @Dennis

HyperNeutrino
источник
Не могли бы вы сделать O”;ẋ;€”#вместо этого?
Эминья
@ Emigna Ах, да, спасибо. Я не совсем понимаю, как это работает, но я вроде понимаю это. Благодарность!
HyperNeutrino
4
;€может стать p.
Деннис
@ Денис О, теперь я понимаю, как это работает. Благодарность! :)
HyperNeutrino
11

GS2 , 6 байт

■•;2•#

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

Обратимая hexdump (xxd)

0000000: ff 07 3b 32 07 23                                ■•;2•#

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

■       Map the rest of the program over  all code points C of the input.
 •;         Push ';'.
   2        Multiply; repeat ';' C times.
    •#      Push '#'.
Деннис
источник
2
= какого черта?
Эрик Outgolfer
1
2такое команда умножения? GS2 странный: P
ETHproductions
1
@EriktheOutgolfer выполняет код для каждой кодовой точки входного символа o_O
г-н Xcoder
@EriktheOutgolfer Звучит причудливее, чем есть на самом деле. это просто карта , а GS2 реализует строки в виде списков целых чисел.
Деннис
@ETHproductions GS2 не основан на символах; он интерпретирует исходный код как необработанный поток байтов, и обычно нет никакой связи между инструкцией и символом CP-437, который кодирует байт. В байт-коде x86_64 2есть XOR ...
Деннис
10

Такси, 779 байтов

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.[c]Switch to plan "e" if no one is waiting.Pickup a passenger going to Charboil Grill.Go to Charboil Grill:n 1 l 3 l 3 l.Pickup a passenger going to The Underground.Go to Writer's Depot:w 1 r.[p]; is waiting at Writer's Depot.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.Go to The Underground:n 1 r 1 l.Switch to plan "n" if no one is waiting.Pickup a passenger going to The Underground.Go to Zoom Zoom:n 3 l 2 r.Go to Writer's Depot:w.Switch to plan "p".[n]# is waiting at Writer's Depot.Go to Writer's Depot:n 3 l 2 l.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.Go to Chop Suey:n 1 r 1 l 4 r 1 l.Switch to plan "c".[e]

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

Ungolfed:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
[c]
Switch to plan "e" if no one is waiting.
Pickup a passenger going to Charboil Grill.
Go to Charboil Grill: north 1st left 3rd left 3rd left.
Pickup a passenger going to The Underground.
Go to Writer's Depot: west 1st right.
[p]
; is waiting at Writer's Depot.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.
Go to The Underground: north 1st right 1st left.
Switch to plan "n" if no one is waiting.
Pickup a passenger going to The Underground.
Go to Zoom Zoom: north 3rd left 2nd right.
Go to Writer's Depot: west.
Switch to plan "p".
[n]
# is waiting at Writer's Depot.
Go to Writer's Depot: north 3rd left 2nd left.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
Switch to plan "c".
[e]

Объяснение:

Pick up stdin and split it into characters.
Covert each character to ASCII.
Print ";" as you count down from that ASCII to zero.
Print "#".
Pickup the next character and repeat until done.
Инженер Тост
источник
+1 Я просто обожаю такие языки, как Морнингтон и Полумесяц, код такой красивый!
Карл-Йохан Шегрен
9

Brainfuck, 43 байта

+[+[<]>->++]--[>--<+++++++]>-<,[[<.>-]>.<,]

Нулевой байт завершает программу.

объяснение

+[+[<]>->++]          59 (semicolon) location 5
--[>--<+++++++]>-       35 (hash) location 7
<,[                     input location 6
    [   while input byte not 0
        <.>     print semicolon
        -       decrement input byte
    ]
    >.< print hash
,]  loop while input not null
Мика Ламми
источник
Это впечатляюще мало для Brainf * ck.
MD XF
почти конкурирует с ответом питона. Впечатляет.
раддиш0
7

Python 3 , 39 байт

[print(";"*ord(s)+"#")for s in input()]

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

Дрянная Монахиня
источник
2
for s in input():print(";"*ord(s)+"#")на один байт короче.
овс
1
@ovs тот момент, когда вы предполагаете, что понимание списка короче.
г-н Xcoder
1
Это не принимает строку с новой строкой, не так ли?
Тим
5

> <> , 22 байта

i:0(?;\"#"o
o1-:?!\";"

Попробуйте онлайн или на рыбной площадке

Вход STDIN, выход STDOUT. В> <> символы и ASCII-коды - это одно и то же, поэтому все, что нам нужно сделать, это прочитать символ, вывести ";"и уменьшить значение символа до его 0, затем распечатать "#"и зациклить, пока не останется ввода.

Не дерево
источник
5

F #, 79 байтов

let c i=System.String.Join("#",Seq.map(fun c->String.replicate(int c)";")i)+"#"

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

расширенный

// string -> string
let convert input =
    System.String.Join(
        "#",      // join the following char seq with "#"
        input     // replicate ";" n times where n = ASCII value of char c
        |> Seq.map (fun c-> String.replicate (int c) ";") 
    ) + "#" // and add the last "#" to the output

convert принимает входную строку и выводит программу; #

использование

convert "Hello, World!" |> printfn "%s"
convert "ABC" |> printfn "%s"
convert ";#" |> printfn "%s"
Brunner
источник
4
Нам нужно больше ответа F #
aloisdg говорит: восстановите Монику
@aloisdg Я сделаю все возможное :)
Бруннер
5

PowerShell, 29 27 25 байт

$args|% t*y|%{';'*$_+'#'}

Довольно просто. Принимает ввод в качестве аргумента командной строки. Вывод является действительной; # программой, которая печатает запрошенный текст.

детеныш
источник
Нужно объединить строки результата.
Маззи
@mazzy: Из описания задач: »Пока программа действует, она может содержать лишние символы , отличные #и ;как все остальные символы игнорируются«.
Joey
как пожелаешь :-)
Маззи
кавычки могут быть удалены. $argsдостаточно.
Маззи
Если аргумент не числовой.
Джои
4

брейкфук , 47 байт

+++++++[->++++++++>+++++<<]>+++<,[[>.<-]>>.<<,]

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

Смотрите также: ovs's answer , который использует аналогичный подход, но с другим методом генерации констант и другим расположением ячеек.


Объяснение:

Эта задача хорошо согласуется со спецификацией brainfuck, что означает, что решение по сути тривиально. Brainfuck принимает входные данные как значения ASCII, и это именно то, что нужно # вывести как.

Схема для переноса проста: сгенерируйте значение ASCII для ;и #, напечатайте ;равное значению ASCII входного символа, напечатайте #, повторите для каждого ввода.

+++++++[-             7
         >++++++++       * 8 = 56
         >+++++<<        * 5 = 35 (#)
       ]>+++<                  56 + 3 = 59 (;)
,[                    Input into first cell
  [>.<-]              Print ;'s equal to ASCII input
  >>.<<,              Print one #
 ]                    End on EOF
Зак С.
источник
Только -2 байта -1, если вы избегаете отрицательных ячеек
Джо Кинг
4

Mathematica, 49 байтов

StringRepeat[";",#]<>"#"&/@ToCharacterCode@#<>""&

объяснение

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

Преобразует входную строку в список кодов символов, затем Mapвыполняет функцию StringRepeat[";",#]<>"#"&над списком, а затем StringJoinрезультат с пустой строкой.

ngenisis
источник
Зачем тебе это <>""?
CalculatorFeline
@CalculatorFeline Без него я бы остался со списком строк для каждого символа. StringJoining ( <>) пустая строка объединяет каждую строку.
ngenisis
Забыл об этом: P
CalculatorFeline
3

Ацето , 19 байт

Поскольку в Aceto есть переводчик , я подумал, что Aceto не сможет ответить и на этот вызов. Он хорошо вписывается в кривую Гильберта 2-го порядка:

\n;*
'o'p
`!#'
,dpO

Прежде всего, мы читаем один символ ( ,), дублируем его и отменяем его, чтобы проверить, является ли он новой строкой ( d!при чтении новой строки в стек обычно помещается пустой символ). Затем я использую то, что я считаю довольно хитрым трюком, чтобы компактно обработать случай новой строки:

`'\n

Если значение в стеке True(мы читаем новую строку), этот код означает: do ( `) помещает символьный литерал в стек ( '), который является новой строкой:\n .

Если значение в стеке False(мы не читали новую строку), этот код означает: не ( `) читать символьный литерал ( '). Это означает, что следующий символ выполняется как команда. К счастью, обратная косая черта экранирует следующую команду (она делает так, чтобы она не выполнялась), поэтому nне выводит символ новой строки (вот чтоn обычно и делается).

Остальная часть кода проста; мы конвертируем символ в стеке в целое число его кодовой точки Unicode ( o), вставляем буквальную точку с запятой ( ';), умножаем число на строку ( *как в Python), pопечатываем результат, нажимаем литерал ( ') #, pзапечатываем его и вернуться кO ригин.

Запустите с, -Fесли вы хотите увидеть немедленные результаты (потому что буферизация), но он работает и без.

L3viathan
источник
3

Perl, 24 байта

s/./";"x(ord$&)."#"/ges

Беги с perl -pe.

Альтернативное решение:

say";"x ord,"#"for/./gs

Беги с perl -nE.

Grimmy
источник
3

Утешение , 11 байт

Уу, новые языки.

';@jx{'#}Ep

объяснение

';           Push the code point of ';' (59).
  @j         Push the entire input as a list of code points.
    x        For each code point in the input, repeat 59 that many times.
     {  }E   For each resulting list of 59s:
      '#      Push the code point of '#' (35).
          p  Flatten and print as unicode characters.
Бизнес Кот
источник
3

Фурье , 19 байт

$(I(`;`&j)`#`0~j&i)

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

Для запуска необходимо заключить входную строку в кавычки.

Пояснение псевдокод

While i != Input length
    temp = pop first char of Input
    While j != Char code of temp
        Print ";"
        Increment j
    End While
    Print "#"
    j = 0
    Increment i
End While
Бета распад
источник
3

JavaScript, 55 54 51 50 48 байт

s=>1+[...s].map(c=>";".repeat(Buffer(c)[0])+"#")

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

  • 1 байт сохранен благодаря Нейлу .

альтернативы

Если мы можем принять ввод как массив отдельных символов, то можно сохранить 5 байтов.

a=>1+a.map(c=>";".repeat(Buffer(c)[0])+"#")

Если мы также можем вывести в виде массива, то можно сохранить еще 2 байта.

a=>a.map(c=>";".repeat(Buffer(c)[0])+"#")
мохнатый
источник
\nдолжен становится ;;;;;;;;;;#.
Нил
Хм ... это странно. Думаю, мне придется вернуться к более долгому решению, поэтому. Спасибо, @Neil.
Лохматый
2
Я думаю, что вы могли бы изменить .на [^], который все равно оставил бы его на байт короче, чем map/join?
Нил
Да, это сделало работу, @Neil :)
Лохматый
Просто наперед, join()в вашем предыдущем ответе не было необходимости, учитывая спецификацию для ;#, и вы также можете объявить, что входные данные для вашей функции - это массив символов, хотя второе предложение немного растянуто. В любом случае, это сводит вас к максимум 48 байтов.
Патрик Робертс
2

APL (Dyalog) , 18 байт

'#',¨⍨';'⍴¨⍨⎕UCS

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

⎕UCS Преобразовать в кодовые точки Unicode

';'⍴¨⍨ используйте каждую кодовую точку, чтобы изменить ( = RhoR ; R eshape) точку с запятой

#',¨⍨ добавить хеш к каждой строке

Адам
источник
2

Рубин, 28 25 байт

24 байта, плюс -nпереключатель командной строки для многократного включения stdin.

$_.bytes{|b|$><<?;*b+?#}

3 байта сохранены (и вывод исправлен на новых строках!) Благодаря ручной работе.

Chowlett
источник
Вы можете избежать использования .ord, работая непосредственно с кодами символов: $_.bytes{|b|$><<?;*b+?#}. Есть разница: эта также кодирует новую строку во вводе. Не уверен, что владелец вопроса намеревается сказать: «Он будет содержать только печатные символы ASCII и символы новой строки», но для меня звучит так, будто символы новой строки также должны быть закодированы.
manatwork
Ваш Ruby-fu превосходит мой, @manatwork - я забыл о bytes. Я спросил OP о новых строках вверху и отредактирую это позже.
Чоулетт
2

Алиса , 12 байт

'#I.h%&';d&O

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

объяснение

'#    Push 35, the code point of '#'.
I     Read a code point C from STDIN. Pushes -1 at EOF.
.h%   Compute C%(C+1). For C == -1, this terminates the program due to division
      by zero. For C > -1, this just gives back C, so it does nothing.
&';   Pop C and push that many 59s (the code point of ';').
d     Push the stack depth, which is C+1.
&O    Print that many code points from the top of the stack.
      The IP wraps around to the beginning and another iteration of this
      loop processes the next character.
Мартин Эндер
источник
2

PHP, 48 байт

for(;$c?:~$c=~ord($argn[$i++]);)echo";#"[!++$c];
user63956
источник
2

JQ, 30 символов

(26 символов кода + 4 символа командной строки)

explode|map(";"*.+"#")|add

Образец прогона:

bash-4.4$ jq -Rr 'explode|map(";"*.+"#")|add' <<< 'Hello, World!' | jq -Rrj '[scan(".*?#")|gsub("[^;]";"")|length%127]|implode'
Hello, World!

Он-лайн тест

manatwork
источник