Створити; # код


36

Пов’язано з: Зробіть перекладач; #

У вищезазначеному виклику завданням було створити перекладача для езотеричної мови ;#.

;#мова

Мова має рівно дві команди: ;і #(всі інші символи перекладач ігнорується):

;: Збільшення акумулятора

#: Модулюйте акумулятор на 127, надрукуйте відповідний символ ASCII та скиньте акумулятор на 0.

Виклик

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

Вхідні дані

Вхід - це рядок, прийнятий або як аргумент, або через stdin. Він буде містити лише символи ASCII для друку та нові рядки.

Вихідні дані

Вихід - це згенерована ;#програма, повертаючись або друкуючись до stdout. Поки програма діє, вона може містити зайві символи, крім #та ;як ігноруються всі інші символи.

Приклади

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

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

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

Таблиця лідерів


9
Блискуче! Рада бачити; # привертає увагу!
Керд coinheringaahing

1
Ви можете перевірити свій результат тут , як; # + - це суперсеть; #.
Адам

3
Чи може висновок містити додатковий символ? ;#ігнорує всі інші символи, тому створена програма все одно працюватиме.
Денніс

2
@ Benoît: Модуль не має значення при створенні коду, оскільки генерувати код, який використовує мінімальну кількість, завжди простіше ;. По-друге, 127 є правильним, як зазначено у пов'язаному питанні, яке містить специфікацію мови; #.
Joey

2
Це насправді не транслюється. "Створити #; код" - кращий заголовок. Я збираюся це змінити.
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, як би я вніс це у вашу програму?
тускіоми


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•#

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

Оборотний шестигранник (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
= що за чорт?
Ерік Атголфер

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]

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

Безголівки:

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

майже конкурує з відповіддю пітона. Вражає.
raddish0


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достатньо.
маззи

Якщо аргумент не є числовим.
Joey

4

мозковий ебать , 47 байт

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

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

Дивіться також: відповідь ovs , яка використовує аналогічний підхід, але з іншим методом генерування констант та іншим компонуванням комірок.


Пояснення:

Ця проблема досить добре поєднується зі специфікою, яка є мозком, що означає, що рішення по суті є тривіальним. 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

Математика, 49 байт

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

Пояснення

enter image description here

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


Навіщо вам це потрібно <>""?
CalculatorFeline

@CalculatorFeline Без цього я залишив би список рядків для кожного символу. StringJoining ( <>) порожній рядок об'єднує кожен рядок.
ngenisis

Забув про це: P
CalculatorFeline

3

Ацето , 19 байт

Оскільки в Ацето є перекладач , я думав, що може бути відповіддю Асето і на цей виклик. Вона акуратно вписується в криву Гільберта 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 :)
Shaggy

Лише головою вгору, join()у попередній відповіді було непотрібним, враховуючи специфікацію ;#, і ви також можете заявити, що вхід для вашої функції - це масив символів, хоча друга пропозиція трохи розтягує. Так чи інакше, це зводить вас не більше ніж до 48 байт.
Патрік Робертс


2

APL (Dyalog) , 18 байт

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

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

⎕UCS Перетворити в кодові точки Unicode

';'⍴¨⍨ використовувати кожну точку коду для зміни форми ( = RhoR ; R крапку з комою форму)

#',¨⍨ додайте хеш до кожного рядка


2

Рубі, 28 25 байт

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

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

3 bytes saved (and output corrected on newlines!) thanks to manatwork.


You could avoid the use of .ord by working directly with character codes: $_.bytes{|b|$><<?;*b+?#}. There is difference: this one also encodes the newline in the input. Not sure what the question owner intends to say by “It will only contain printable ASCII characters and newlines.”, but to me sounds like newlines should be encoded too.
manatwork

Your Ruby-fu exceeds mine, @manatwork - I'd forgotten about bytes. I've asked OP about newlines up top and will edit this afterwards.
Chowlett


2

Alice, 12 bytes

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

Try it online!

Explanation

'#    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 characters

(26 characters code + 4 characters command line options)

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

Sample run:

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

On-line test



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.