;#コードを生成する


36

関連:;#インタープリターを作成する

上記のリンクされた挑戦で、タスクは難解な言語のための通訳を作成することでした;#

;#言語

この言語には正確に2つのコマンドがあります:;および#(他のすべての文字はインタープリターによって無視されます):

;:アキュムレーターをインクリメントします

#:アキュムレータを127でモジュロし、対応するASCII文字を出力し、アキュムレータを0にリセットします。

チャレンジ

私は怠け者ですが、さらにテストケースをテストしたいので、プレーンテキストを;#コードに変換するプログラムまたは関数が必要です。

入力

入力は文字列であり、引数として、またはstdinを介して取得されます。印刷可能なASCII文字と改行のみが含まれます。

出力

出力は、;#stdoutに戻るか、印刷して生成されたプログラムです。プログラムが有効である限り、それ以外の余分な文字が含まれている場合が#あり;、他のすべての文字は無視されます。

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

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

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

リーダーボード


9
ブリリアント!うれしい;#が注目を集めている!
coinheringaahing caird

1
;#+は;#のスーパーセットであるため、ここで出力をテストできます。
アダム

3
出力に追加の文字を含めることはできますか?;#他のすべての文字を無視するため、生成されたプログラムは引き続き機能します。
デニス

2
@Benoît:最小数のを使用するコードを生成する方が常に簡単であるため、コード生成時にモジュラスは無関係です;。次に、;#言語の仕様を含むリンクされた質問で述べられているように、127が正しいです。
ジョーイ

2
これは実際にはトランスコンパイルではありません。「Generate#; code」の方が適切なタイトルです。それに変更します。
メゴ

回答:



34

;#+、40バイト

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

オンラインでお試しください!入力はヌルバイトで終了します。

説明

コードは、生成と反復の2つの部分に分かれています。

世代

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

これは、定数を置く;#のようなメモリに:

;;;;;~+++++++>~;~++++:>
;;;;;                     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
これらはすべて、私が退屈していたときに作った冗談の言葉です。私は光栄です。
コメアリンガーアーイング

@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ああ、はい、ありがとう。私はそれがどのように機能するかはよくわかりませんが、それを理解しています。ありがとう!
ハイパーニュートリノ

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


1
2乗算コマンドは何ですか?GS2がおかしい:P
ETHproductions

1
@EriktheOutgolferは、入力の各文字のコードポイントo_Oのコードを実行します
Mr. Xcoder

@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これやモーニングトンクレセントなどの言語が大好きです。コードはとても美しいです。
カールヨハンシェーグレン


9

Brainfuck、43バイト

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

NULLバイトはプログラムを終了します。

説明

+[+[<]>->++]          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がんばります:)
ブルナー


5

PowerShell、29 27 25バイト

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

とても簡単です。入力をコマンドライン引数として受け取ります。出力は、要求されたテキストを印刷する有効な;#プログラムです。


結果文字列を結合する必要があります。
mazzy

@mazzy:タスクの説明から:»プログラムが有効である限り、それ以外の余分な文字が含まれている場合が#あり;、他のすべての文字は無視されます。«
Joey

あなたが望むように:-)
マッジー

引用符は削除できます。$args十分です
mazzy

引数が数値でない場合。
ジョーイ

4

brainfuck、47バイト

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

オンラインでお試しください!

参照:ovs's answer、同様のアプローチをとりますが、定数の生成方法とセルレイアウトが異なります。


説明:

この課題は、brainfuckの仕様と非常によく一致しています。つまり、解決策は本質的に簡単です。Brainfuckは、ASCII値として入力を受け取ります。これは、出力する必要があるものです。

トランスパイルの回路図は簡単です:のASCII値を生成します ;および、入力文字のASCII値に等しい#printを;入力し、入力#ごとに繰り返します。

+++++++[-             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@#<>""&

説明

enter image description here

入力文字列を文字コードのリストに変換し、リストのMap関数を実行StringRepeat[";",#]<>"#"&StringJoinてから、空の文字列で結果を取得します。


なぜあなたは必要<>""ですか?
CalculatorFeline

@CalculatorFelineそれなしでは、各文字の文字列のリストが残ります。空の文字列をStringJoining(<>)すると、各文字列が連結されます。
ngenisis

それを忘れてしまった:P
電卓

3

アセト、19バイト

Acetoには通訳がいるので、この課題に対するAcetoの回答もあると思いました。2次ヒルベルト曲線にきちんと適合します。

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

まず、単一の文字(,)を読み取り、それを複製して否定し、改行かどうかをテストします(d!改行を読み取る場合、通常、空の文字がスタックにプッシュされます)。次に、改行のケースをコンパクトに処理するために、かなり賢いトリックだと思うものを使用します。

`'\n

スタック上の値がTrue(改行を読み取る)である場合、そのコードは次のことを意味します:do`)スタックに文字リテラルを置きます(')、これは改行です:\n

スタックの値がFalse(改行を読み取っていない)の場合、そのコードは次のことを意味します:`文字リテラル(')を読み取らない()つまり、次の文字がコマンドとして実行されます。幸いなことに、バックスラッシュは次のコマンドをエスケープします(実行されないようにするため)。nないします)、改行を出力しません(これはn通常は)。

残りのコードは簡単です。スタック上の文字をUnicodeコードポイントの整数(o)に変換し、リテラルセミコロン(';)をプッシュし、数値に文字列(*、Pythonのように)を掛けp、結果をリントし、リテラル(')をプッシュし#pリントしますあまりにも、に戻るOます。

-F(バッファリングのため)すぐに結果を表示したい場合はwithを実行しますが、これも機能しません。


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

フーリエ、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 :)
シャギー

Just a heads up, the join() in your previous answer was unnecessary given the specification for ;#, and you can also declare that the input for your function is an array of characters, though the second suggestion is a bit of a stretch. Either way, that brings you down to at most 48 bytes.
Patrick Roberts

2

Actually, 11 bytes

O⌠';*'#o⌡MΣ

Try it online!

Explanation:

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 bytes

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

Try it online!

⎕UCS Convert to Unicode code points

';'⍴¨⍨ use each code point to reshape ( = RhoR; Reshape) a semicolon

#',¨⍨ append a hash to each string


2

Ruby, 28 25 bytes

24 bytes, plus the -n command line switch to repeatedly operate on 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



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.