生成;#代码


36

相关于:进行;#解释器

在上述链接的挑战中,任务是为深奥的语言创建一个解释器;#

;#语言

该语言正好有两个命令:;#(所有其他字符都会被解释器忽略):

;:增加累加器

#:将累加器乘以127,打印相应的ASCII字符并将累加器重置为0。

挑战

因为我很懒,但是仍然想测试更多的测试用例,所以我需要一个将纯文本转换为;#代码的程序或函数。

输入值

输入是一个字符串,作为参数或通过标准输入。它仅包含可打印的ASCII字符和换行符。

输出量

输出是;#通过返回或打印到stdout 生成的程序。只要程序有效,它就可以包含除#和以外的多余字符,;因为所有其他字符都将被忽略。

例子

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

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

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

排行榜


9
辉煌!很高兴看到;#得到关注!
caird coinheringaahing

1
您可以在此处测试输出,因为;#+是;#的超集。
阿达姆(Adám)'17

3
输出中可以包含其他字符吗?;#忽略所有其他字符,因此生成的程序仍然可以运行。
丹尼斯

2
@Benoît:生成代码时模数无关紧要,因为生成使用最小数量的代码总是更容易;。其次,如包含;#语言规范的链接问题中所述,127是正确的。
乔伊(Joey)

2
这不是真正的转译。“ Generate#; code”是一个更好的标题。我将其更改为。
Mego

Answers:



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它是一个有趣的概念,玩弄
康纳尔奥布莱恩

嗯 如果我希望程序在;#中打印出一个空字节怎么办?
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

@Emigna感谢-2个字节@Dennis
感谢-1个字节


你能O”;ẋ;€”#代替吗?
艾米娜(Emigna)'17

@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 '#'.


1
2是乘法命令吗?GS2很奇怪:P
ETHproductions'May

1
@EriktheOutgolfer为每个输入字符的代码点o_O执行代码
Xcoder先生17年

@EriktheOutgolfer听起来比它想象的更好。只是map,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我只喜欢这种语言和Mornington Crescent等语言,代码是如此的漂亮!
Karl-JohanSjögren'May

9

05AB1E,8个字节

Ç';×'#«J

在线尝试!

说明

Ç          # convert each input char to its ascii value
 ';×       # repeat ";" those many times
    '#«    # append a "#" to each run of semi-colons
       J   # join to string

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

几乎与python答案竞争。令人印象深刻。
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,我会努力的:)
Brunner


5

PowerShell,29 27 25字节

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

非常简单。将输入作为命令行参数。输出是有效的;#程序,可打印请求的文本。


它需要连接结果字符串。
mazzy

@mazzy:从任务描述中:»只要程序有效,它就可以包含多余的字符,#并且;所有其他字符都将被忽略。«
Joey

如您所愿:-)
mazzy

可以删除引号。$args足够。
mazzy

除非参数是数字。
乔伊

4

brainfuck,47个字节

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

在线尝试!

另请参阅:ovs的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
Jo King

4

Mathematica,49个字节

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

说明

在此处输入图片说明

将输入字符串转换为字符代码列表,然后在列表上执行Map该函数StringRepeat[";",#]<>"#"&,然后StringJoin将结果与空字符串一起使用。


为什么需要<>""
CalculatorFeline

@CalculatorFeline如果没有它,我将留下每个字符的字符串列表。StringJoining(<>)空字符串连接每个字符串。
ngenisis

忘记了:P
CalculatorFeline17年

3

Aceto,19个字节

由于Aceto中有一名口译员,所以我认为也没有Aceto可以应对这一挑战。它完全符合二阶希尔伯特曲线:

\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

Solace,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])+"#")

在线尝试

  • 感谢Neil节省了1个字节。

备择方案

如果我们可以将输入作为单个字符的数组输入,则可以节省5个字节。

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

如果我们还可以将其输出为数组,则可以再保存2个字节。

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

\n应该成为;;;;;;;;;;#
尼尔

嗯...真奇怪。猜猜我将不得不回滚到更长的解决方案,所以。谢谢@尼尔。
毛茸茸的

2
我认为您可以更改.[^],仍然比它短一个字节map/join
尼尔

是的,做得很好,@ Neil :)
毛茸茸的

请注意,join()给定的规范;#,您在上一个答案中不需要,并且您还可以声明函数的输入是字符数组,尽管第二个建议有些许困难。无论哪种方式,这最多可以减少48个字节。
帕特里克·罗伯茨

2

实际上,11个字节

O⌠';*'#o⌡MΣ

在线尝试!

说明:

O⌠';*'#o⌡MΣ
O            convert string to list of ASCII ordinals
 ⌠';*'#o⌡M   for each ordinal:
  ';*          repeat ";" that many times
     '#o       append "#"
          Σ  concatenate

2

APL(Dyalog),18字节

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

在线尝试!

⎕UCS 转换为Unicode代码点

';'⍴¨⍨ 使用每个码点来重塑( = 的Rho- [R ; [R ESHAPE)分号

#',¨⍨ 将哈希值附加到每个字符串


2

Ruby,28个 25字节

24个字节,加上-n命令行开关可重复操作stdin

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

多亏了操作,节省了3个字节(并在换行符上纠正了输出!)。


您可以.ord直接使用字符代码来避免使用$_.bytes{|b|$><<?;*b+?#}。区别在于:此代码还在输入中编码换行符。不确定问题所有者打算用“仅包含可打印的ASCII字符和换行符”来表达什么。但是对我来说,听起来也应该对换行符进行编码。
manatwork '17

您的Ruby-fu超过了我的@manatwork-我忘记了bytes。我已经问过OP关于换行符的顶部,以后将对其进行编辑。
Chowlett


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];

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!

在线测试



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.