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


62

私は最近、;#2つのコマンドのみを持つ新しい言語(「セミコロンハッシュ」と発音)を作成しました。

; アキュムレーターに1つ追加します

#アキュムレータを127でモジュロし、ASCII文字に変換して、改行なしで出力します。この後、アキュムレータを0にリセットします。はい、127は正しいです。

その他の文字は無視されます。それはアキュムレータに影響を与えず、何もしません。

あなたの仕事は、この強力な言語のインタープリターを作成することです!

完全なプログラムか、;#プログラムを入力として受け取り、正しい出力を生成する関数のいずれかでなければなりません。

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

Output: ;#
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Output: 2d{ (unprintable characters here; should have 4 `\000` bytes between the `d` and the `{` and 3 after the `{`)
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hafh;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;f;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###ffh#h#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ffea;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#au###h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;o

Output: Fizz Buzz output
Program: link below

Output: !
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Fizz Buzz 100まで


1
インタープリターが入力の最後で実行を終了せず、代わりに余分な出力を生成せずに無限にループし続ける場合、それは受け入れられますか?
レオ

5
2番目の例では、プログラムをエンコードして出力を生成するプログラムについて疑問に思います...再帰的コンパイル!
frarugi87

@レオはい、それは大丈夫です
ケアード・コマンヘリンガー

1
@iamnotmaynardセミコロンハッシュ
15:09にケアインコインヘリンガー

2
たぶんウィンクハッシュは言うのが簡単だろう
ジェームズ・ウォルドビー-jwpat7

回答:



17

JavaScript(ES6)、76 82 80バイト

s=>s.replace(/./g,c=>c=='#'?String.fromCharCode(a%(a=127)):(a+=(c==';'),''),a=0)

デモ

再帰バージョン、82 77バイト

ニールのおかげで5バイト節約

これは、Fizz Buzzの例のような大きな入力ではクラッシュする可能性があります。

f=([c,...s],a=0)=>c?c=='#'?String.fromCharCode(a%127)+f(s):f(s,a+(c==';')):""

f(s,a+(c==';'))あなたの再帰バージョンから3バイトをノックするかもしれないと思います。
ニール

@Neil実際には5バイトを節約します。:
アーナルド

今は本当にばかげている。私はもともとバグのあるバージョンを持っていて、バグを修正するために2バイトを引きました。しかし、私は誤カウントしていたとバギーバージョンは、実際には7バイト...保存
ニールが

12

網膜336 63 67 65 66 62 59バイト

T`;#-ÿ`¯_
;{127}|;+$

(^|¯)
¯
+T`-~`_-`[^¯]
T\`¯`

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

仮想エスケープ構文を使用した読み取り可能なバージョン:

T`;#\x01-ÿ`\x01¯_
;{127}|;+$

(^|¯)\x01\x01
¯\x02
+T`\x01-~`_\x03-\x7f`[^\x01¯]\x01
T\`¯`

TIOはソースコードでNULバイトを許可しないため、NULバイトを出力しません。また、最後に余分な改行を出力しますが、そうでなければできないと思います。@Leoのおかげで、末尾の改行は抑制されます

-273は(!)のおかげでバイト@ETHproductionsを

@ovsのおかげで-2バイト。

@Neilのおかげで-3バイト。素晴らしい34バイトのソリューションをご覧ください。


1
ああ、私の言葉。しかし、あなたは1000バイトを節約できません+T`\x01-~`_\x03-\x7f`[^\x01¯]\x01か?(もちろん、単一文字としての印刷不可能なものを含む)
-ETHproductions

@ETHproductionsもちろんできます。ありがとうございました!:)
eush77

1
現在、#入力に末尾がない場合でも、最後の文字は常に出力にあります。あなたはあなたに第二段階を変更することにより、それを修正することができます(;{127}|;+$)
OVS

1
3行目に+ `が必要ですか?一致全体を削除すると、2回目の反復で置換するものがなくなるはずです。
OVS

1
私はこれを34バイトで行うことができると思います:(T`;#\x01-ÿ`\x80\x7F_ \x80+$空の行)\+T`\x7Fo`\x01-\x80_`\x80[^\x80](16進エスケープを使用して印刷できないものを表します)。nullの代わりに\ x7Fを出力します。
ニール

12

Java 8、100バイト

s->{int i=0;for(byte b:s.getBytes()){if(b==59)i++;if(b==35){System.out.print((char)(i%127));i=0;}}};

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


3
サイトへようこそ!:)
DJMcMayhem

FizzBu​​zzの例を使用してオンラインインタープリターへのリンクを追加しました(リンクテキストが長すぎてコメントに収まりません)
ジョナサンアラン

Javaは、プログラムにUTF-16を使用します。したがって、これらは100バイトではなく100文字です。
G.ブロザーは、

5
@GeroldBroser Unicodeは文字セットです。UTF-8とUTF-16は、その文字セットの2つのエンコードです。ASCIIソースはJavaプログラムとして完全に有効であり、ASCIIでエンコードされたJavaソースファイルがたくさんあります(これは有効なUTF-8であり、したがってUnicodeエンコードでもあります)。

1
完全にゴルフ、81バイトの場合Consumer<char[]>s->{char i=0;for(int b:s){if(b==59)i++;if(b==35){System.out.print(i%=127);i=0;}}}
オリビエグレゴワール

11

Japt、18バイト

®è'; %# d}'# ë ¯J

の後に印刷できない\ x7f文字があり%#ます。オンラインでテストしてください!

使い方

®   è'; %#   d}'# ë ¯  J
mZ{Zè'; %127 d}'# ë s0,J
                         // Implicit: operate on input string
mZ{           }'#        // Split the input at '#'s, and map each item Z to
   Zè';                  //   the number of semicolons in Z,
        %127             //   mod 127,
             d           //   turned into a character.
m              '#        // Rejoin the list on '#'. At this point the Hello, World! example
                         // would be "H#e#l#l#o#,# #W#o#r#l#d#!#" plus an null byte.
                  ë      // Take every other character. Eliminates the unnecessary '#'s. 
                    ¯J   // Slice off the trailing byte (could be anything if there are
                         // semicolons after the last '#').
                         // Implicit: output result of last expression

1
答えを確認する必要があります!これに少し時間を費やしただけで、あなたは私をpunch打したと思います。q'# ®è'; u# dì¯J同じスコアでも機能します。
シャギー

11

Python、65バイト

これはこの以前の答えのゴルフです。

lambda t:''.join(chr(x.count(';')%127)for x in t.split('#')[:-1])

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

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

説明

これは、;それぞれの間にsがいくつあるかを判断し#chrmod 127 を出力する非常に簡単な答え[:-1]です。少し奇妙なのは、最後のグループは削除する必要があるため、削除する必要があり#ます。

例えば

;;#;;;;#;;;;;#;;;

に分割されます

[';;',';;;;',';;;;;',';;;']

しかし、最後に値を出力する;;;必要はないため、最後は必要ありません#


1
1つのTIOリンクですべてのテストを取得しようとして忙しかった。tおよびを除くchrのchrでしたx
ジョナサンアラン

9

> <>、35バイト

>i:0(?;:'#'=?v';'=?0
^   [0o%'␡'l~<

オンラインでお試しください!0x7F、、^?または「delete」に置き換えます。

メインループ

>i:0(?;:'#'=?v      
^            <

これは入力の文字(i)を取り、そのゼロより小さいかどうか、つまりEOF(:0()をチェックし、そうであればプログラムを終了します(?;)。そうでない場合は、入力が#:'#'=)に等しいかどうかを確認します。ある場合は、分岐してループを再開します(?v... ^ ... <)。

カウンターロジック

              ';'=?0
              

入力が;';'=)と等しいかどうかを確認します。ある場合は、を押します0。それ以外の場合は、何もしません。これにより、メインループが再起動します。

印刷ロジック

>       '#'=?v      
^   [0o%'␡'l~<

入力文字がの場合、入力を#スタックからポップ(~)し、スタック上のメンバー数を取得(l)、127をプッシュ('␡')し、モジュラス(%)を取得します。次に、それを文字(o)として出力し、新しいスタックを開始します([0)。これにより、カウンターが「ゼロ」になります。その後、ループが再開します。


3
悪い> <>。それは悲しいです:0(:(
ケアニアン共犯

9

Python 3、69バイト

@Wheat Wizard @Urielのおかげで改善

print(''.join(chr(s.count(';')%127)for s in input().split('#')[:-1]))

3
プログラミングパズルとコードゴルフへようこそ!ここでの目的は、コードをできるだけ短く(バイト単位)にすることです。そのため、ヘッダーにバイトカウントを含める必要があります:)。
アドナン

説明してくれてありがとう、それを知りませんでした。それで作業します。
MrGeek

2
:sの後のスペースを削除できます。
パベル

1
74バイトを数えます。tio.run/nexus/…–
デニス

2
また、';'==cスペースを節約しますが、ifステートメントをまったく使用しないと、さらに短くなります。
デニス


8

ルビー、41 35 34文字

40 34 33文字のコード+ 1文字のコマンドラインオプション)

gsub(/.*?#/){putc$&.count ?;%127}

おかげで:

  • (6文字)でputc明示的な変換を必要としないために使用することを提案したヨルダン.chr
  • 不要な括弧を見つけるためのキリルL.(1文字)

サンプル実行:

bash-4.4$ ruby -ne 'gsub(/.*?#/){putc$&.count ?;%127}' < '2d{.;#' | od -tad1
0000000    2  etb    d  nul  nul  nul  nul    {  nul  nul  nul
          50   23  100    0    0    0    0  123    0    0    0
0000013

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


ど 私は幼い頃にCをしましたが、完全に忘れていましたputc()。ありがとう、@ Jordan
manatwork

1
驚いたことに、カウント後にバイト
キリルL.

いいキャッチ、@ KirillL。、ありがとう。
マナトワーク

7

05AB1E16 15 14バイト

コード:

'#¡¨ʒ';¢127%ç?

説明:

'#¡              # Split on hashtags
   ¨             # Remove the last element
    ʒ            # For each element (actually a hacky way, since this is a filter)
     ';¢         #   Count the number of occurences of ';'
        127%     #   Modulo by 127
            ç    #   Convert to char
             ?   #   Pop and print without a newline

05AB1Eエンコードを使用します。オンラインでお試しください!


7

ゼリー、13バイト

ṣ”#Ṗċ€”;%127Ọ

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

使い方

ṣ”#Ṗċ€”;%127Ọ  Main link. Argument: s (string)

ṣ”#            Split s at hashes.
   Ṗ           Pop; remove the last chunk.
    ċ€”;       Count the semicola in each chunk.
        %127   Take the counts modulo 127.
            Ọ  Unordinal; cast integers to characters.

1
という言葉semicolaは存在しませんsemicolons
エリックアウトゴルファー


うーん、変な言葉。
エリックアウトゴルファー

@EriktheOutgolferウィクショナリーの誰かがおそらく英語でラテン語の複数形を有効にしようとしていましたが、コーラセミコーラのスペルは禁止されるべきです。
キュー

7

MS-DOS上のx86マシンコード-29バイト

00000000  31 d2 b4 01 cd 21 73 01  c3 3c 3b 75 06 42 80 fa  |1....!s..<;u.B..|
00000010  7f 74 ed 3c 23 75 eb b4  02 cd 21 eb e3           |.t.<#u....!..|
0000001d

コメント付きアセンブリ:

bits 16
org 100h

start:
    xor dx,dx       ; reset dx (used as accumulator)
readch:
    mov ah,1
    int 21h         ; read character
    jnc semicolon
    ret             ; quit if EOF
semicolon:
    cmp al,';'      ; is it a semicolon?
    jne hash        ; if not, skip to next check
    inc dx          ; increment accumulator
    cmp dl,127      ; if we get to 127, reset it; this saves us the
    je start        ; hassle to perform the modulo when handling #
hash:
    cmp al,'#'      ; is it a hash?
    jne readch      ; if not, skip back to character read
    mov ah,2        ; print dl (it was choosen as accumulator exactly
    int 21h         ; because it's the easiest register to print)
    jmp start       ; reset the accumulator and go on reading

6

05AB1E25 21 19バイト

アドナンのおかげで-2バイト

Îvy';Q+y'#Qi127%ç?0

説明:

Î                       Initialise stack with 0 and then push input
 v                      For each character
  y';Q+                 If equal to ';', then increment top of stack
       y'#Qi            If equal to '#', then
            127%        Modulo top of stack with 127
                ç       Convert to character
                 ?      Print without newline
                  0     Push a 0 to initialise the stack for the next print

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


1
私はあなたが交換することができると思いi>}によって+
アドナン

6

網膜、34バイト

T`;#-ÿ`_
\+T`o`-_`[^]|$

オンラインでお試しください!テストケースが含まれています。編集:@MartinEnderの助けを借りて2バイトを保存しました。注:コードには印刷できないものが含ま&#x;れており、ブラウザーがISO-8859-1ではなくWindows-1252を使用するため、コードを使用すると誤った結果が生成されます。説明:最初の行は入力をクリーンアップ:;に変更され\x80#\x7F(原因TIOの制限のために)および他のすべてが削除されます。次に\x80、が他のの前にないことがわかると、それ\x80を削除し、次の文字のコードを周期的にインクリメントします。これは、\x80文字がなくなるまで繰り返されます。ヌルバイトをサポートしている元のコードは、基本的には最初の行を除いて、印刷不可能バイトから1を減算\xFF不変であると\x7Fなり\x00。読みやすさのためのエスケープあり:

T`;#\x00-\xFF`\x7F\x00_
\+T`\x7Eo`\x00-\x7F_`\x7F[^\x7F]|\x7F$

最後の2つのステージを最後のステージと組み合わせることにより、1バイトを保存できます\x80([^\x80]|$)
マーティンエンダー

@MartinEnderありがとう!迷惑なことに、\s+T`\x7Fo`\x01-\x80_`\x80(?!\x80).?1バイトしか保存しません。
ニール

ああ、でも[^\x80]|\x80$2バイト節約できると思う。
ニール

ああ、最後の1つが機能します。ネガティブな先読みも試しましたが、これsは面倒です。
マーティンエンダー

6

R、97 90 86 84バイト

機能:

function(s)for(i in utf8ToInt(s)){F=F+(i==59);if(i==35){cat(intToUtf8(F%%127));F=0}}

Rが開始Fされると、FALSE(数値0)として定義されます。

ゴルフをしていない:

function (s)
    for (i in utf8ToInt(s)) {
        F = F + (i == 59)
        if (i == 35) {
            cat(intToUtf8(F%%127))
            F = 0
        }
    }

これはR + pryrであってはなりませんか?
L3viathan

@ L3viathan pryrはRパッケージであるため、Rコードのままです。
スベンホーエンシュタイン

Rコードですが、追加のライブラリのインストールが必要です。
L3viathan

@ L3viathan私の答えは無効だと思いますか?追加のパッケージの使用を避けるべきですか?
スベンホーエンシュタイン

2
@BLT違いはありません。私の意見では、チャレンジのに作成された追加のパッケージを使用しても問題ありません。これはすべての言語に当てはまります。Pythonではimport使用::する必要がありますが、R ではパッケージ内の関数に直接アクセスするために使用できます。多くの場合、ここで追加のパッケージの使用を確認できます(たとえば、PythonおよびJava用)。ただし、ディスカッションに参加したくないため、以前の投稿を変更しました。
スヴェンホーエンシュタイン

5

Python、82バイト

lambda t:''.join(chr(len([g for g in x if g==';'])%127)for x in t.split('#')[:-1])

1
あなたはすでに答えとしてこれを掲示するので、私は私のために右のアクションが更新ではなく、それをupvoteことであろうと信じて@WheatWizard
ウリエル

4

プレーンTeX、156バイト

\newcount\a\def\;{\advance\a by 1\ifnum\a=127\a=0\fi}\def\#{\message{\the\a}\a=0}\catcode`;=13\catcode35=13\let;=\;\let#=\#\loop\read16 to\>\>\iftrue\repeat

読みやすい

\newcount\a

\def\;{
  \advance\a by 1
  \ifnum \a=127 \a=0 \fi
}
\def\#{
  \message{\the\a}
  \a=0
}

\catcode`;=13
\catcode35=13

\let;=\;
\let#=\#

\loop
  \read16 to \> \>
  \iftrue \repeat

文字を記号で印刷できますか?
eush77


4

Perl、25バイト

$_=chr(y%;%%%127)x/#/

with with perl -043peperl -e標準であるため、4バイトとしてカウントされます)。

説明:-043行末#記号を(ASCII 043)に設定します。-p入力の「行」を繰り返し処理します(実際には#で区切られた文字列)。各「行」y%;%%の数をカウントし;ます。x/#/#で終わらないプログラム(3番目のテストケースなど)に余分な文字を出力しないようにします。%127かなり明白なはずです。$_=通常の定型文です。


グリッチもありますが、印象的なのは;;#;;;、#2ではなく#5を出力するためです。
マナトワーク

この結果はどうやって得たのですか?私のマシンでecho -n ';;#;;;' | perl -043pe '$_=chr(y%;%%%127)x/#/' | xxd正しく出力00000000: 02します。を省略した場合043、または#ASCII 043以外のコードページを使用している場合、結果が説明されます。
グリムミー

1
おっと。申し訳ありませんが、テストでタイプミスがありました。コードは完璧に機能します。
マナトワーク

4

CJam、27バイト

0q{";#"#") 127%co0 "S/=~}%;

説明:

0                            e# Push 0
 q                           e# Push the input
  {                          e# For each character in the input:
   ";#"#                     e#   Index of character in ";#", -1 if not found
        ") 127%co0 "S/       e#   Push this string, split on spaces
                      =      e#   Array access (-1 is the last element)
                       ~     e#   Execute as CJam code. ")" increments the accumulator,
                             e#     and "127%co0" preforms modulo by 127, converts to character, pops and outputs, and then pushes 0.
                        }%   e# End for
                          ;  e# Delete the accumulator

代替ソリューション、18バイト

q'#/);{';e=127%c}%

説明:

q                   e# Read the whole input
 '#/                e# Split on '#'
    );              e# Delete the last element
      {             e# For each element:
       ';e=         e#   Count number of ';' in string
           127%     e#   Modulo by 127
               c    e#   Convert to character code
                }%  e# End for

ビジネス猫それは無効な文字を無視しません。
エソランジングフルーツ

なぜ;アキュムレーターを削除する必要があるのですか?
コイナーリンガーをケア

@RandomUserしたがって、最後に文字列が出力されることはありません。
ETHproductions

4

F#、79 91 93バイト

let rec r a=function|[]->()|';'::t->r(a+1)t|'#'::t->printf"%c"(char(a%127));r 0 t|_::y->r a y

非ゴルフ

let rec run acc = function
    | [] -> ()
    | ';'::xs ->
        run (acc + 1) xs
    | '#'::xs ->
        printf "%c" (char(acc % 127))
        run 0 xs
    | x::xs -> run acc xs

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

編集:「;」以外の文字を処理していました なので '#'。無効な文字を無視するように変更しました。

代替案

F#、107 104バイト

let r i=
 let a=ref 0
 [for c in i do c|>function|';'->a:=!a+1|'#'->printf"%c"(!a%127|>char);a:=0|_->()]

参照セルを使用すると、3バイト節約できます

非ゴルフ

let run i =
    let a = ref 0;
    [for c in i do
        match c with
        | ';' -> a := !a + 1
        | '#' ->
            printf "%c" (char(!a % 127))
            a := 0
        |_->()
    ]

オンラインで試す


4

Processing.js(Khanacademyバージョン)、118バイト

var n="",a=0;for(var i=0;i<n.length;i++){if(n[i]===";"){a++;}if(n[i]==="#"){println(String.fromCharCode(a%127));a=0;}}

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

使用される処理のバージョンには入力メソッドがないため、入力はnに配置されます。


keyTyped=function(){ ... }:P
ETHproductions

@ETHproductionsこれは嫌悪感です。
クリストファー

@RandomUserイェーイ!やった!処理で回答するのが好きです(回答を確認してください)
クリストファー

2
@RandomUserだけでなく、1000年の担当者..しかし、2 ^ 10のrep(͡°͜ʖ͡°)

@Midnightas Ohhhそう
クリストファー

4

ラビリンス61 47バイト

_36},)@
;    {
; 42_-
"#-  1
_ ; 72
_ ) %
"""".

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

説明

ソリューションコードのカラーコード化された画像

コードの実行は左上隅から始まり、最初のセミコロンはスタックから暗黙のゼロを破棄し、右に進みます。

オレンジ

  • _3636をスタックにプッシュします。これは、入力と比較するためのものです#
  • } スタックの最上部をセカンダリスタックに移動します
  • , スタック上の文字の整数値をプッシュします
  • )スタックをインクリメントします(入力の最後の場合、これによりスタックが0になり、プログラムのフローはに進み@、終了します)
  • { セカンダリスタックの最上部をプライマリスタックの最上部に移動します
  • -ポップy、ポップx、プッシュx-y。これは、入力を#(ASCIIの35)と比較するためのものです。入力が#コードであった場合、紫色のセクションに続きます(スタックの最上部が0であるため、IPは前に移動していた方向に進みます)。そうでない場合、緑色のセクションに続きます。

紫の

  • 127 127をスタックにプッシュします
  • % ポップx、ポップy、プッシュx%y
  • . スタックの上部(アキュムレーター)をポップし、キャラクターとして出力します

ここから、灰色のコードにより、スタックに何もないプログラムの左上隅に移動します。

  • _24 24をスタックにプッシュします
  • -ポップx、ポップy、xyを押します。24との間の差である#;入力された場合は、このチェックするように;。それがあった場合は;、コードに向けてまっすぐに続きます)。それ以外の場合#は、スタックの高さを押すに変わります(常に正の数で、プログラムが次の交差点で右に曲がり、アキュムレータをインクリメントするコードを見逃します)
  • ; スタックの先頭を破棄します
  • ) 暗黙的なゼロであるか、出力のアキュムレータとして機能する以前にインクリメントされたゼロであるスタックのトップをインクリメントします

ここから灰色のコードは、アキュムレータのみがスタックされたプログラムの左上隅に移動します。

グレー

引用符は何もしません_。0をスタックにプッシュし、スタック;の先頭を破棄します。これらはすべて、正しい方法で制御フローを強制し、スタックの最上部から余分なものを破棄するためのコードです。


好奇心から、説明画像をどのように生成しましたか?自分で作成しましたか?
-Stefnotch

2
@Stefnotch、テキストエディターを使用して各文字の間にタブを配置し、Microsoft Excelにコードを貼り付けて、各文字を独自のセルに配置しました。すべてのセルを選択して、幅と高さが等しくなるようにしました。次に、色と境界線を調整し、スクリーンショットを撮りました。
ロバートヒックマン

3

MATL、29バイト

';#'&mXz!"@o?T}vn127\c&YD]]vx

入力は、単一引用符で囲まれた文字列です。

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

FizzBu​​zzプログラムは、オンライン通訳には長すぎます。このgifでオフラインで動作することを確認してください。

ここに画像の説明を入力してください

説明

アキュムレータの値は、スタック内の要素の数として実装されます。これにより、アキュムレータの値がスタック内の単一の数値であった場合よりもプログラムが遅くなりますが、数バイトは節約されます。

';#'       % Push this string
&m         % Input string (implicit). Pushes row vector array of the same size with 
           % entries 1, 2 or 0 for chars equal to ';', '#' or others, respectively
Xz         % Remove zeros. Gives a column vector
!          % Transpose into a row vector
"          % For each entry
  @        %   Push current entry
  o?       %   If odd
    T      %     Push true. This increases the accumulator (number of stack elements)
  }        %   Else
    v      %     Concatenate stack into a column vector
    n      %     Number of elements
    127\   %     Modulo 127
    c      %     Convert to char
    &YD    %     Display immediately without newline
  ]        %   End
]          % End
vx         % Concatenate stack and delete. This avoids implicit display

3

アリス、22バイト

I!?';-n+?h$'@u%?'#-n$O

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

説明

スタックには、;発生した数のカウンターが1つだけ保持されます。スタックが空の場合(プログラムの開始時など)、これは暗黙的に0です。

I!?';-n+?h$'@u%?'#-n$O
I                      Push codepoint of next char from input
 !?                    store it on the tape and reload it right away
   ';-n+               add 1 to the counter if this char is a semicolon,
                       0 otherwise
        ?h$'           If the input char was -1 (EOF) execute the next command,
                       otherwise push its codepoint
            @          Terminate the program (or push 64)
             u         Set all bits up to the most significant as equal to 1
                       this turns 64 (1000000b) into 127 (1111111b)
              %        Compute modulo
               ?       reload the input char from the tape
                '#-n$O if it is a hash, pop the counter and print
                       the corresponding character
                       wrap back to the start of the line

このプログラムの短いが終了しないバージョンは、ここにあります



悪いの書式設定のため申し訳ありませんが、私は自分の携帯電話からこれを掲載しました、私はすぐに私はPC上で私の手を取得するとして、それを修正します
レオ

チャレンジで特に指定されていない限り、プログラムは終了する必要があります
マーティンエンダー

~hただし、代わりにリテラル0x7Fを使用してバイトを保存できます。
マーティンエンダー

@MartinEnderはそれを終了させました。コードに0x7Fを挿入することはできませんでしたが、とにかくこの代替の変更の方が面白いと思います:)
レオ

3

JS(ES6)、97 92バイト

c=>(a=0,y="",c.split``.map(x=>x=="#"?(a%=127,y+=String.fromCharCode(a),a=0):x==";"?a++:0),y)

シャギーの答えとは異なるアプローチを取ることを試みました。しかたがない。


3

;#+、59バイト、非競合

言語はこの挑戦の後に作られました。

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

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

説明

生成は、私のGenerate;#code answerからのものと同じです。ここでの唯一の違いは反復です。

反復

*(~<:-+!(<-;->(;))::<+-::!(<#>)-:-*)
*(                                *)   take input while != 0
  ~                                    swap
   <                                   read value from memory (;)
    :                                  move forward to the accumulator memory spot (AMS)
     -                                 flip Δ
      +                                subtract two accumulators into A
       !                               flip A (0 -> 1, else -> 0)
        (     (;))                     if A is nonzero, or, if A == ';'
         <                             read from AMS
          -;-                          increment
             >                         write to AMS
                  ::                   move to cell 0 (#)
                    <                  read value from memory (#)
                     +                 subtract two accumulators into A
                      -                flip Δ
                       ::              move to AMS
                         !(   )        if A == '#'
                           <           read from AMS
                            #          output mod 127, and clear
                             >         write to AMS
                               -:-     move back to initial cell

3

Bash + coreutils、46 39バイト

tr -dc \;#|sed 'y/;/1/;s/#/.ZC7%P/g'|dc

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

説明

(-7バイトのCows Quackに感謝!)

tr(私はこれを置くことができる部分は、すべての余分な文字を削除sedするので、まったく同じ:バイトのために、しかし、それは正しく改行文字を処理しないsedでそれらを残し、dc唯一の最初の改行までを取得します?

sed残りを取り、dcプログラムをビルドします。

の文字;列は1(長いリテラル)の文字列になります

#になります.ZC7%P(これがの文字列に続く場合1.は操作なしの小数点です。ただし、プログラムの先頭にある場合、または別の後に続く#場合はリテラルになり0ます。対応するASCIIを印刷します。)


あなたはエスケープする必要はありません;内部を'...'単に変更することができますdc -ez?dc。それに;加えて、スタックに1を追加する代わりに、これらをグループ化し、Zこのtio.run/##S0oszvj/…に到達するために使用して長さを取得できます。
Kritixi Lithos

@Cowsquackいいね、ありがとう!(そして、dc -ez?プログラムを開始するために余分なゼロが必要な結果でした)しかし、プログラムはstderr、連続する場合#または終了しない入力のいずれかに追加の出力を追加します#(両方の場合、余分な文字が削除された後を意味します) 。コンセンサスがあるかどうかはわかりませんが、余分な出力がソリューションを無効にしているように感じます。しかし、私はあなたの考えを修正し、dcエラーを投げることなく、あなたの提案よりわずか1バイトだけ多く巻き上げました!
ソフィア・レヒナー

この stderrによると、チャレンジが明示的にそう述べていない限り、無視できます。したがって、dcにとって非常に便利です。また、この現在のソリューションはis #のためZに連続したsで失敗するため、0x00の代わりに0x01を出力します(同じトラップに陥りましたが、ブラウザーは印刷できないものを16進コードとして表示するため、それをキャッチしました)。01
Kritixi Lithos

3

C、 65 64 60バイト

(ceilingcatのおかげで-2)

c;f(char*s){for(c=0;*s;s++)c+=*s-35?*s==59:-putchar(c%127);}

c関数を再利用可能にするには、ゼロに初期化する必要があります。
コナーオブライエン

@ ConorO'Brien修正。残念ながら、単にを追加するよりも短いものを思い付くc=0ことができず、デニスの答えからコピーして不正をしたくありません。
HVD

@ceilingcatおかげで再び、私はその後さらに3バイトを取り出すことができました。これはデニスの答え(編集後に確認)のトリックを使用しますが、今回は非常に時間が過ぎたので、私はそれをすべて忘れて自分で考え出しました。
hvd
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.