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


36

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

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

;#язык

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

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

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

Вызов

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

вход

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

Выход

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

Примеры

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

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

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

Leaderboard


9
Brilliant! Рад видеть, # привлекает внимание!
Кэрд coinheringaahing

1
Вы можете проверить свой вывод здесь , так как; # + - это расширенный набор; #.
Адам

3
Может ли вывод содержать дополнительный символ? ;#игнорирует все остальные символы, поэтому сгенерированная программа все равно будет работать.
Деннис

2
@ Benoît: модуль не имеет значения при генерации кода, так как всегда проще генерировать код, использующий минимальное количество ;. Во-вторых, 127 правильно, как указано в связанном вопросе, который содержит спецификацию языка; #.
Джои

2
На самом деле это не так. «Generate #; code» - лучший заголовок. Я собираюсь изменить это на это.
Mego

Ответы:



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


@ 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


Не могли бы вы сделать 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


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"

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результат с пустой строкой.


Зачем тебе это <>""?
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если вы хотите увидеть немедленные результаты (потому что буферизация), но он работает и без.


3

Perl, 24 байта

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

Беги с perl -pe.

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

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

Беги с perl -nE.


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

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 байта сохранены (и вывод исправлен на новых строках!) Благодаря ручной работе.


Вы можете избежать использования .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

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!

Он-лайн тест



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