Transpile;#あなたの言語に


25

関連する:;#インタープリターを作成し、;#コード生成する

;# -旋風ガイド

これは、2つのコマンドを持つ単純な言語です。その唯一のデータ構造は、0に初期化されるアキュムレーターです。

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

  2. #127を法とする累算器の値を計算し、対応するASCII文字を出力します。次に、アキュムレーターを0にリセットします。

ソースコードには追加の文字(印刷可能なASCII +空白)が含まれている場合がありますが、これらはコメントとして扱われ、プログラムの実行には影響しません。

チャレンジ

ほとんどのコンピューターには;#プリインストールされていないため、;#コードを別の言語に変換できるツールがあると非常に便利です。この課題では、これを達成するためのプログラムを作成する必要があります。

入力

;#引数またはSTDINを介して取得されたいくつかのソースコード。このソースコードには、;または以外の(コメント)文字が含まれている場合があります#

出力

提出と同じ言語の;#コード。実行すると、元のコードと同じ文字列を出力/返します。この結果のコードは、言語にとってより便利な場合、ターゲット文字列の後に末尾の改行を出力する場合があります。

ノート

注意すべきことの1つは、バックスラッシュを出力するコードや引用符を出力するコードなどのエスケープシーケンスです。また;#、言語のキーワードやコマンドのように見えるものを含む可能性のあるコードにも注意してください。

追加の制限

すべてのプログラムを終了する必要があります(通常はこれをデフォルトと見なしますが、誰かがそれについて尋ねたので、ここで説明します)。

input: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
output (python): print(";#")
input: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
output (element): \'`

34
私のコンピューターには;#プリインストールされています...
Programmer5000

1
もう一つ?どうして?
コメアリンガーアーイング

プログラムは実行を停止する必要がありますか?また、実際のコードの後に​​無操作で無限に出力できますか?
完全に人間

2
@totallyhumanすべてのプログラムは最終的に停止する必要があると言います。
-PhiNotPi

1
我々は、入力が文字(または文字)が含まれたテストケースを得ることができるしてくださいではないこと;#
ストリートスター

回答:


7

Pythonの276の 69バイト

コード

入力は引用符で囲まれます。

for y in input('print').split("#")[:-1]:print`chr(y.count(";")%127)`,

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

説明

出力の最初の部分は、本質的に入力を使用して行われますinput('print')。入力をハッシュタグで分割し、最後の要素を破棄します。ord(y%127)の表現を出力します。ここで、yはセミコロンの出現回数です。,印刷の最後にを追加して、改行が印刷されないようにします。

これにより、Hello, World!-programに次のPythonコードが提供されます。

print'H' 'e' 'l' 'l' 'o' ',' ' ' 'W' 'o' 'r' 'l' 'd' '!'

オンライン試すことができます


5

brainfuck、126バイト

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

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

;#出力が65536文字を超えると、出力プログラムはTIO実装で失敗します。また、この問題を回避して、の[+]代わりに出力する130バイトバージョンも作成しました<

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

説明

+++[->+++++<]>[->++++>+++<<]        initialize tape with 60 and 45
,[                                  for each input byte:
  +<++++++[-<++++>>------<]         subtract 35 (#) from byte
  >[<]<<[                           if byte was #
         >>>>>[--<--.++>]           output + (43) a number of times equal to accumulator
         <+.-<.<<<<                 output . (46) and < (60)
  ]
  >[->>-<<]>>                       subtract 24 from what's left of byte
  [[-]<]                            check difference and clear if nonzero
  >[                                if byte was originally 59 (;)
   >>++++[-->]<[<]                  add 4 to accumulator cell, then subtract 2 if nonzero. Since BF cells are mod 256, this creates an accumulator mod 127.
  ]
,]

5

空白、291バイト

NSSTTNNSTNNSTNNSTTNNSSTSNSSNSNSTNTSTTTSSSTSSSTTNTSSTSNSNTSSSSNSSSTTSSSNTSSTNTSSSTNNSNTSNNSSSSSNSNNNSTSSNNSTSTNNSTSTNNSTSNNSTTNNSTSNNSTNNSTSTNNSTTNNSTNNSTNNSNTTNNSSSSTNNSTSSNNSTSNNSTTNNSTSNNSTSSNNSNTSNNSSTNSSSTSTSNTNSSNTNNSSSSNNSTNNSTNNSSNSSSTSSSSSNTNSSNTNNSSSTNNSTSNNSTSNNSSSNSSSTSSTNTNSSNTN

Sをスペースに、Tをタブに、Nを改行に置き換えます。

空白での空白の生成は、世界で最も効率的なものではありません。あらゆる種類の動的コードを生成するには、ビット単位の操作を行わない言語では、コードサイズが爆発的に大きくなる、かなりのビット調整が必要です。したがって、このプログラムはスマートなことをしようとせず、代わりにソースプログラムを1対1に変換するだけを選択します。以下に分解します。

early:
    call S
    call S
    call N
start:
    push  0
    dup
    ichr
    get
    push  35
    sub
    dup
    jz    hash
    push  24
    sub
    jz    semi
    jmp   start
hash:
    pop
    call SSS
    call TTT
    call TTT
    call T
    call N
    call T
    call S
    call TTT
    call N
    call S
    call S
    jmp   early
semi:
    call SSS
    call T
    call N
    call T
    call SSS
    jmp   start
N:
    push 10
    pchr
    ret
SSS:
    call S
    call S
S:
    push 32
    pchr
    ret
TTT:
    call T
    call T
T:
    push 9
    pchr
    ret

プログラムによって生成されるコードは次のようになります。

push  0
push  1
add
push  1
add
push  1
add
push  1
add
push  1
add
push  1
add
push  1
add
push  1
add
push  1
add
push  1
add
push  1
add
push  127
mod
pchr
push  0
push  1
add
...

私にはうまくいきません。Haskellで記述された元の空白インタープリターでは、符号ビットを数値から省略できないため、「SSN」はゼロをプッシュする有効な方法ではありません。
アシェプラー

空白の仕様があいまいであり、元の参照インタープリターと実際の仕様の違いにより、意図された動作とは何かを判断することは困難です。私が覚えている限りでは、元のサイトにリストされているいくつかのサンプルプログラムは実際に無署名の動作を必要とし、さらに他の多くの実装にはそれがあります。私自身構築しながら、私はこれらの問題に数回走ったWSのJITコンパイラを、そして最後に、私は他の実装との互換性のためにそれに固執することを決めた
CensoredUsername

4

V19 20 28バイト

バグ修正、#最後にない場合は壊れました

バグ修正、実装済み mod 127

Í;û127}
éiA0Í#/0
ò/;
x

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

生成されたコードを試す

説明:

Í;û127}                            ' Delete runs of 127 `;`s (mod 127)
éi                                 ' Insert an `i` in front of input
  A<C-v><esc>0<esc>                ' Append <esc>0 to input
                   Í#/<C-v><C-v>0  ' Replace all `#` with `<C-v>0`
ò                                  ' Recursively
 /;                                ' Go to the next `;`
<C-a>                              ' Increment the next number come across

Vでは、挿入モードで、ASCII文字をコードを使用して挿入できます<C-v><Code>。Vコードは、すべて#<C-v>0に置き換えます。ここで、ゼロはperの擬似アキュムレータ#です。それぞれ#がアキュムレータを0にリセットするため、1つずつ正常に動作します。次に、コードは、見つかったセミコロンごとにインクリメントを実行します。これは、見つかった次の数値(次のアキュムレータ)をインクリメントします。0命令がで失敗しないように最後に追加され;、次のなしの#

Hexdump:

00000000: e969 4116 1b30 1bcd 232f 1616 300a f22f  .iA..0..#/..0../
00000010: 3b0a 7801                                ;.x.

3

05AB1E20 19 18 16バイト

-1 Adnanに
感謝 -2 carusocomputingに
感謝-2 Kevin Cruijssenに感謝

'#¡¨vy';¢ƵQ%„çJJ

オンラインでお試しください!(実行された05AB1Eコードの出力を含む)

'#¡              # Split on #
   ¨             # remove the last element
    vy           # For each...
      ';¢        #   count the number of ;s
         ƵQ%     #   Mod by 127
            „çJ  #   Push çJ („çJ should work, but it doesn't for some reason)
               J # Join stack and output implicitly

';¢することができますgžyプッシュ128、何らかの形で動作する可能性があり、なぜ完全な単語をつづり、引用符で囲むだけではありませんか?
魔法のタコUr

1
';¢以外の文字がある場合に使用する必要があります;žy<はと同じ127です。文字の1つが引用符である場合、引用符で囲まれた単語を印刷すると壊れます。
ライリー

@carusocomputing pingを忘れました...-
ライリー

1
@carusocomputing and Riley:ƵQ127の圧縮バージョンです。
アドナン

@アドナンの理由/方法?
魔法のタコUr

2

Python 2、75バイト

lambda s:"print"+`''.join(chr(x.count(';')%127)for x in s.split('#')[:-1])`

オンラインでお試しください!(トランスパイリングされたPythonコードの実行からの出力を含む)

たくさんのバイトをしてくれたovsに感謝します!

説明

このプログラムは#を変換します。#s(s.split('#')[:-1])で分割し、各チャンクmod 127のセミコロンの数をカウント(x.count(';')%127for x in ...)し、それをそれぞれのASCII文字(chr(...))に変換してコード化します。次に、そのリストは連結''.join(...)され()、文字列のPython表現(バックティック)に変換され、文字列を印刷するためのスケルトンPythonプログラムに挿入されます("print"+...)。


2

ゼリー 25 24  16 バイト

ṣ”#Ṗċ€”;%127;€”Ọ

同等のJellyコードを出力する完全なプログラム(モナドリンクとして、混合型のリストのリストを返します)。

最初の例は、Try it online!このプログラムを生成します

どうやって?

;sの間#の各実行でsをカウントアップし、各モジュロ127を取り、それぞれの後に順序命令であるモナドアトムにキャストを追加します。

Jellyは、各値がSTDOUTに暗黙的にパイプされ、そのようなプログラムが実行されると、つまり72Ọ101Ọ108Ọ108Ọ111Ọ44Ọ32Ọ119Ọ111Ọ114Ọ108Ọ100Ọ33Ọ印刷されますHello, world!

ṣ”#Ṗċ€”;%127;€”Ọ - Main link: list of characters
 ”#              - literal '#'
ṣ                - split the result at #s
   Ṗ             - pop (remove the last result, list of trailing non-# characters)
      ”;         - literal ';'
    ċ€           - count for €ach
        %127     - modulo 127 (vectorises)
              ”Ọ - literal 'Ọ' (Jelly's cast to ordinal monadic atom)
            ;€   - concatenate for €ach - making a list of lists like [[72,'Ọ],[101,'Ọ'],...]
                 - implicit print (this smashes, printing something like: 72Ọ101Ọ...)

入力に関する注意:Jellyは、Python形式で文字列を入力します。空のプログラムはとして入力でき""、ハッシュ専用プログラム"#""##"、などとして入力できます。バックスラッシュと引用符を含む入力には、他の操作が必要になる場合があります。


2

通常138 137バイト

+1/1+54@6:5+1/1+5@6/1+52@6:4/1+5@6:1/1+54@6:4/1+5@6:5+2/1+4@6(~-61/1=7&6+5/1+51=7?6{+3/1+5@6}:5+3/1+3=7?6{+52@6:5+1@6-1@6+1@6:5+2/1+4@6})

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

注:あなたが交換する必要があるかもしれない&6?6&、それはTIO上で動作するようにするために。&6ただし、言語仕様には含まれています。

使い方

+1/1+54@6        Output 'R'
:5+1/1+5@6       Output '3'
/1+52@6          Output 'D'
:4/1+5@6         Output '1'
:1/1+54@6        Output 'R'
:4/1+5@6         Output '1'
:5+2/1+4@6       Output '+'
(                Loop indefinitely
  ~                Get next character
  -61/1=7&6        If input is -1 (EOF), exit program
  +5/1+51=7?6{     If input is `;`
    +3/1+5@6         Output '0'
  }                End if
  :5+3/1+3=7?6{   If input is '#'
    +52@6            Output '@'
    :5+1@6           Output '6'
    -1@6             Output '-'
    +1@6             Output '6'
    :5+2/1+4@6       Output '+'
  }                End if
)                End loop

出力プログラム:

R3D1R1           Set top face to 1
+00...           Add top face to notepad, aka increment notepad
@6               Output notepad as character
-6               Set notepad to 0
...

保存し、多くの引数を取り除くのバイトを@6%6-6。これまで暗黙的に呼び出されたときに何もしなかったコマンドは、メモ帳を使用するようになりました。だから、@同じである@6%と同じである%6など、
MD XF

1

JavaScript(ES6)、101バイト

s=>`_=>'${s.replace(/[^#;]/g,``)}'.replace(/;*(#|$)/g,(l,c)=>c&&String.fromCharCode(~-l.length%127))`

入力文字列を指定すると、不要な文字がすべて削除され、次の関数のソースが返されます。

_=>'...'.replace(/;*(#|$)/g,(l,c)=>c&&String.fromCharCode(~-l.length%127))

where ...は、クリーンな;#ソースを表します。


1

C、98 96 99 98 97バイト

Cが解釈されないのを忘れたため+3バイト:(

c,a;f(){printf("f(){puts(\"");for(;~c;c=getchar())c==59?a++:c==35?a=!printf(&a):a;puts("\");}");}

で実行:

echo ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#" | ./a.out

印刷されます:

f(){puts("Hello, World!");}

2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#を生成しますがf(){puts(""");}、これは無効です。この課題では、特に「バックスラッシュを出力するコードや引用符を出力するコードなどのエスケープシーケンスに注意する必要があります」と呼びかけています。
hvd

@hvd ....修正
MD XF

1

ゼリー、26バイト

”‘x
f”;L%127Ç;“Ọø”
ṣ”#Ç€ṙ-

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

ここでそのJellyコードを試してください!

ṣ”#Ç€ṙ-      Main link, input is a string of ";;;;;;#lala;;;;;;;;;#"
ṣ”#          Split input on char #
   ǀ        Call helper link 1 for each segment
     ṙ-      Rotate returns 1 to the right (SPLIT introduces an empty element which is moved up front)

f”;L%127Ç;“Ọø”  Helper link 1, determines the number of increments
f”;             Throw out all but semicolons
   L%127        Take the count mod 127
        Ç       Call helper 2
         ;“Ọø”  Add a Jelly link that prints characters and splits print statements

”‘x             Helper 2, receives the count of ;'s
”‘              Return the character ‘ (Jelly's increment command
  x             Once for each ; in the input

Jellyの出力はỌø‘‘‘‘‘‘‘‘‘‘‘‘‘Ọø‘‘‘‘‘‘‘‘‘‘Ọø、chr(13)+ chr(10)を出力するようなコードになります


私を混乱させた奇妙な例(空白のみを印刷する)。
ジョナサンアラン

1
@JonathanAllan TIOへのリンク付きの例を追加しました。
-steenbergh

1

PHP、72バイト

for(;~$c=$argn[$i++];)echo[Z=>'$n++;',B=>'echo~$n=~chr($n%127);'][a^$c];

1

> <>、106 81 77バイト

> <>(魚)での初めてのゴルフです!私が言わなければならないかなり興味深い言語。とても楽しいこと!

0n01.
>i:1+?!v:";"=?v"#"=?v
^ ;o";"<   .37<
^oo"1+"
^oooooooo'"~"1+%o0' <

池へようこそ!あなたは短縮することができますi:1+?!i:0(?、そしてあなたがそれをスタック上に結果を構築し、出力への入力の終了を待っていた場合は、数バイトを救うことができるように私も感じています。つまり、それはたくさんoの;)
アーロン

1

C#169バイト

ゴルフ:

class P{static int Main(string[] args){var r="Console.Write(";foreach(var y in args[0].Split('#')){r+=(char)(-1+y.Split(';').Length%127);}System.Console.Write(r+");");}}

人間が読めるバージョン:

class P
{
    static int Main(string[] args)
    {
        var r="Console.Write(\"";
        foreach (var y in args[0].Split('#'))
        {
            r +=(char)(-1+y.Split(';').Length% 127);
        }
        System.Console.Write(r+"\");");
    }
}

1

Haskell106 102バイト

';'!(x:a)=x+1:a;'#'!a=0:a;_!a=a;h s="main=putStr"++(show$""++(toEnum.(`mod`127)<$>init(foldr(!)[0]s)))

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

非ゴルフ

step ';' (x:acc) = x+1:acc
step '#' acc = 0:acc
step _ acc = acc;

semicolonHash s = toEnum . (`mod` 127) <$> init (foldr step [0] s)

toHaskell s = "main = putStr " ++ (show $ "" ++ semicolonHash s)


1

MathGolf、17バイト

⌡(¶{gÉ'8=£♣(%$''\

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

説明

⌡                      decrement twice
 (                     decrement
                       this transforms ";;;#;;#" -> "888 88 "
  ¶                    split string on spaces
   {                   foreach...
    gÉ                 filter using next 3 characters
      '8               push single character "8"
        =              pop(a, b), push(a==b)
                       this filters out all non-";"
         £             length of array/string with pop
          ♣            push 128
           (           decrement
            %          modulo
             $         pop(a), push ord(a) or char(a) (gets character with code)
              ''       push single character "'"
                \      swap top elements

を使用して任意の文字をスタック(および出力)に配置できるため'<char>、このようなコードブロックのシーケンスが出力されます。


チャットの作成方法を忘れました。とにかく、 ``(スタックの最上部を除くすべてを破棄する)は現在バグです。Python FileNotFoundErrorを提供します。
ケビンクルーッセン

@KevinCruijssen READMEをチェックしてください!コードページでその文字を切り替えて、2つのスペース文字が含まれないようにしました。新しいキャラクターはÞです。
maxb

ええ、@ JoKingは実際にに変更されたと言いましたÞ。(しかし、私が使用しているドキュメントはまだ古い値を述べています。
Kevin Cruijssen

1
@KevinCruijssenああ、そのドキュメントを更新する必要があります、リマインダーをありがとう!両方を最新の状態に保つスクリプトを作成してみます。これを適切な場所に配置するまで、これを使用することをお勧めします。
13:06のmaxb

1

MATL32 28バイト

35lF4$Yb"@g59=z]xv127\!&D99h

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

strsplitオートマトン型のプログラムではなく、完全に異なるアプローチ。

      Yb % strsplit
    4$   %  with 4 inputs, namely:
35       %   Split on '#'
  lF     %   Do not (F) collapse delimiters (l).
         %   And of course the implicit program input.

"@g    ] % Loop over strings, convert each to a normal char array
   59=z  % How many equal to 59 ';'?

xv!127\  % Delete last element, concatenate and flip to horizontal, mod 127
&D       % Convert to MATL representation
  99h    % Append a 'c' to output ASCII.

0

実際には、25バイト

'#@s⌠';@c7╙D@%⌡MdX$"♂cΣ"o

オンラインでお試しください!(トランスコードされたActuallyコードの実行からの出力を含む)

説明:

'#@s⌠';@c7╙D@%⌡MdX$"♂cΣ"o
'#@s                       split on "#"
    ⌠';@c7╙D@%⌡M           for each chunk:
     ';@c                    count ";"s
         7╙D@%               mod by 127 (2**7-1)
                dX         discard last value
                  $        stringify
                   "♂cΣ"o  append "♂cΣ":
                    ♂c       convert each value to an ASCII character
                      Σ      concatenate


0

フーリエ変換、32バイト

$(I~S{59}{`^`}S{35}{`%127a0`}&i)

FourIDEでお試しください!

フーリエは基本的に;#のスーパーセットであるため、これは非常に簡単な課題でした。

;# command > Fourier equivalent
; > ^ (Increment the accumulator)
# > %127a0 (Modulo accumulator by 127, output corresponding code point and set accumulator to zero)

0

CJam、14バイト

q'#/);';fe=:c`

説明:

q               e# Read input
 '#/            e# Split on '#'
    );          e# Delete last element
      ';fe=     e# Count occurrences of ';' in each
           :c   e# Convert each to character (code point)
             `  e# Escape

0

APL、31バイト

{⍕'⎕UCS',⌽127|+/¨';'=⍵⊂⍨'#'=⍵}⌽

出力:

      ({⍕'⎕UCS',⌽127|+/¨';'=⍵⊂⍨'#'=⍵}⌽) ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#'
⎕UCS 59 35
      ⍝ evaluate the output
      ⍎({⍕'⎕UCS',⌽127|+/¨';'=⍵⊂⍨'#'=⍵}⌽) ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#'
;#

説明:

  • :入力を逆にします
  • {... }:この関数に渡します:
    • ⍵⊂⍨'#'=⍵#文字列内の各パーティション(最初から、最初に逆にする必要がある理由)
    • +/¨';'=;各パーティションのsをカウントします
    • 127|:モジュロ127
    • :もう一度逆に
    • '⎕UCS',⎕UCSUnicode関数であるstringを付加します。
    • :文字列表現

STDOUTへの実際の出力は同じなので、削除できます。
アダム

0

ルビー、47 + 1 = 48バイト

$_=gsub(/.*?#/){"$><<#{$&.count(?;)%127}.chr;"}

+1バイト-p

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

@manatworkのおかげで-30バイト!


残念ながら、これはない「(コメント)以外の文字が含まれていてもよい。このソースコードで素敵を果たしている;#の要件の一部を。」。
マナトワーク

@manatwork修正済み。後でゴルファーになります。
パベル

正規表現/;+#//.*?#/およびコードブロックs.length-1→ を変更するのに十分でしたs.count(?;)。ところで、あなたの数学も間違って%-ます(s.length-1)%127。また、.gsubのコードブロックでは、キャプチャされたグループ$&$1、… でアクセスできます。そのため、|s|通常、コードブロックパラメーターは実行できません。そして、文字列補間は文字列化します:{"$><<#{$&.count(?;)%127}.chr;"}オンラインでお試しください!
マナトワーク

@manatworkありがとうございます!あなたのコメントがルビーの知識を倍増させたと思います。
パベル

遅いですが、コードの挑戦自体は、修正された答えによって最近突発されました。直接gsub変更$_します。つまり、再割り当てする必要はありません。ただし、最後の後にコメント文字がある場合は問題があります#... ここを参照してください
値インク

0

Pyth、25 23 24バイト

j\\+"jk["mC%/d\;127Pcw\#

@FryAmTheEggmanのおかげで+1バイト

それを試してみてください!

1文字の文字列のみを使用してエスケープする必要がある文字を処理します。

サンプル出力:

jk[\"

jk[\H\e\l\l\o\,\ \W\o\r\l\d\!

私の;#インタープリターを使用します


#入力にない場合、印刷されるため、これは機能しません0。これはのjk代わりに修正できますs
-FryAmTheEggman

0

C、150バイト

#include<stdio.h>
c;n=0;main(){puts("#include<stdio.h>\nmain(){");while(~(c=getchar()))c-35?c-59?:n++:(printf("putchar(%d);",n%127)&(n=0));puts("}");}

拡張:

#include<stdio.h>
c;
n=0;
main(){
        puts("#include<stdio.h>\nmain(){");
        while( ~(
            c=getchar()
        ))
                c-35?
                        c-59?
                                :
                                n++
                        :
                        ( printf("putchar(%d);",n%127)
                        &(n=0))
                ;
        puts("}");
}

終了し、コメントを無視し、常に正しい出力コードを生成する完全なプログラムです。EOF = -1と仮定します

gcc 4.9.4でコンパイルされたSystemResque-Cd 4.9.6でテスト済み


0

braingasm、40バイト

,[35-z["[127-s[127+.>]]<0*".]24-z[43.],]

おっと、それは驚くほど短いです。

,[                                    ,]     Read a byte until end of input
  35-                                          Subtract 35.
     z[                     ]                  If the result is zero,
       "[127-s[127+.>]]<0*".                     print the code for `#`.
                             24-               Subtract 24.
                                z[   ]         If the result is zero,
                                  43.            print the code for `;`

の生成コード;はa +で、現在のセルをインクリメントします。

生成されたコードに#は、厄介な手動モジュロ演算が含まれています

[127-s[127+.>]]<0*
[             ]       While current cell is not zero
 127-                   Subtract 127
     s[      ]          If result is negative
       127+.              Add 127 again and print current cell
            >             Step to next cell to break the loop
               <0*      Step back to first cell and clear it

0

Braingolf、55バイト

V#0VR&,l1-MvMR[R.#;e"+1"MM|.##e"@%+1~#"MMMMMM|$_vv]Rv&@

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

基本的に置き換える;1+##~1+%@使って全体との事前保留さ0ため単項+演算子が今壊れています。

1+ スタックの最後のアイテムに1を追加します。

#~1+%@~(126)のchar値をプッシュし、1を追加して127を作成し、スタック上の他のアイテムとモジュラスし、ポップしてcharとして印刷します。

説明

V#0VR&,l1-MvMR                         Implicit input of each char to stack
[R.#;e"+1"MM|.##e"@%+1~#"MMMMMM|$_vv]
Rv&@

V#0                                    Create stack2, push char value of 0
   VR                                  Create stack3, return to stack1
     &,                                Reverse stack
       l1-                             Push length of stack - 1
          MvMR                         Move length to stack2, switch to stack 2
                                       Move length to stack3, switch back to stack1
[R................................vv]  Do-While loop, will run l times
                                       where l is length of input
  .#;                                  Duplicate last item and push char value of semicolon
     e                                 Pop last 2 items, if they are equal..
      "+1"                             ..Push char values of +1 in that order
          MM                           ..Move last 2 items to stack2
            |                          endif
             .##                       Duplicate last item and push char value of hash
                e                      Pop last 2 items, if they are equal..
                 "@%+1~#"              ..Push char values of @%+1~# in that order
                         MMMMMM        ..Move last 6 chars to stack2
                               |       endif
                                $_     Silently pop last item
Rv                                     Switch to stack2
  &@                                   Greedy char print, print every item in stack as char

0

q / kdb +、42バイト

溶液:

{-1_"c"$mod[;127](#:)@/:"#"vs x inter"#;"}

例:

は、,アトム"\""ではなく、1つの要素のリストであるように、リスト(アトムに対して)を表すために使用されることに注意してください。

q){-1_"c"$mod[;127](#:)@/:"#"vs x inter"#;"}";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#"
";#"
q){-1_"c"$mod[;127](#:)@/:"#"vs x inter"#;"}";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#"
,"\""

説明:

入力文字列を取得し、a #またはa ;ではないものをすべて削除し#、リストに分割し、各リストの要素数をカウントし、結果に対してmod 127を実行し、文字列にキャストします。

{-1_"c"$mod[;127]count each"#"vs x inter"#;"} / ungolfed
{                                           } / lambda function
                                 x inter"#;"  / intersection of input and ';#' to clear out any 'comments'
                           "#"vs              / split string on hash
                 count each                   / length of each sub-list
        mod[;127]                             / 127 modulo result (vectorised)
    "c"$                                      / cast back to string
 -1_                                          / drop last character (assuming terminated string)

ノート:

  • 入力がa #で終了すると仮定します-1_
  • 入力にのみが含まれることが保証されている場合、10バイト短くすることができます;#

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