トーク通訳


10

「トーク」は、denisのtalk.tryitonline.netでの引用に対応して作成された、バロック化されたアキュムレータベースの言語です。

Waiting for someone to create an esolang called talk. 

。「トーク」言語には4つのコマンドがあります。

  • 00 アキュムレータが0の場合、アキュムレータを0に設定します。
  • 01 アキュムレータが0の場合、アキュムレータを1に設定します。
  • 10 アキュムレータが1の場合、アキュムレータを0に設定します。
  • 11 アキュムレータが1の場合、アキュムレータを1に設定します。

入力:

  • 入力は、標準のI / Oルールによって受け入れ可能な任意の入力メソッドを介して取得できます。

  • 初期アキュムレータ値とプログラムの2つの入力があります。[00, 01, 00]必要に応じて、これらの2つの入力を1つの入力にマージしたり、入力を有効なコマンドに分割したりできます(たとえば、それらをリストとして使用するなど)。

出力:

  • コマンドの実行が終了すると、アキュムレータは暗黙的に出力されます。

ルール:

  • 入力単一の文字列または文字リストです。
  • これは、バイト単位の最も短い答えが優先されます。
  • 数字または文字列/文字を使用します。

    テストケース:

0 0001111101 -> 1
0 000100 -> 1
0 11001000 -> 0

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が確実に表示されるようにするには、次のMarkdownテンプレートを使用して、見出しから回答を始めてください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを向上させる場合、古いスコアを打ち消すことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数値を含めたい場合(たとえば、スコアが2つのファイルの合計である場合、またはインタープリターフラグのペナルティを個別にリストしたい場合)、実際のスコアがヘッダーの最後の数値であることを確認してください。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


3
それで、2つの入力、コマンドのシーケンスと初期アキュムレータ値がありますか?
xnor

4
アキュムレータを変更しない、アキュムレータの1から開始する、または指示のないテストケースは良いでしょう
Jo King

8
トークは本当にプログラミング言語と考えることができますか?
ルイス・Mendo

8
@A_そのコメントはおそらく冗談でした。昔は、Langと呼ばれる言語にはURLがありましたlang.tryitonline.net(現在はtio.run/#lang)。したがって、トークと呼ばれる言語は、最近作成されたチャットルームのURLと混乱を招きます。それはtalk.tryitonline.net
Luis Mendo

7
今後、多数の回答が投稿された後のI / Oの変更はご遠慮ください。私は今日戻ってきて、マッピングされた入力を許可したことで、これは私が答えものとはまったく異なる課題になります。
GammaFunction

回答:


21

ゼリー、3バイト

y@/

入力は単一のリストです:アキュムレータ、その後にペアが続きます。

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

使い方

y原子行う音訳。[B] yCに置き換え、AB、それは戻りそうbはなら= CおよびCなら≠C

y@/y引数を入れ替えて入力を折りたたみ/縮小し、ペアごとに1つの音訳を実行します。


13
これは、ASCII文字のみを使用する、これまでに見た唯一のJelly回答です。

2
いくつかありました。ほら、ユニコードじゃない!
デニス

21

Python 3、43バイト

lambda s:re.sub("00|11","",s)[-1]
import re

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

この関数は単一の文字列を入力として受け取ります。最初の文字は初期状態で、残りの文字列はコマンドを表します。このソリューションは、正規表現をサポートする他の言語に簡単に移植できます。

難しいのは、ソリューションが正しい結果をもたらすことを証明することです。これを確認するには、コマンドの詳細な分析が必要です。まず、コマンドに次のプロパティがあることがわかります。

  • プロパティ(1):コマンド00および11アキュムレータの状態を保持します。
  • プロパティ(2):コマンドを実行0110、元の状態に関係なく、アキュムレータの状態を2番目のビットと同じにします。

したがって、最終的なアキュムレータの状態は次のとおりです。

  • ケース101または10コマンドが存在しない場合、最終状態は初期状態と同じです。
  • ケース2:それ以外の場合、last 10または01commandの最後のビット。

次に、両方のケースでソリューションが正しい結果をもたらすことを示します。最終状態のステートメントを証明します。0最終状態も1同様に証明できます。最終状態が0入力の場合、入力は次のいずれかの形式になります。

  • ^0{2k+1}11(11|00)*

    以下のためにケース1、入力文字列がsで開始する必要があります2k+1続い0、11および00コマンド。00sと11sを削除0すると、最終状態である単一のが生成されます。

  • .+10{2k+1}11(11|00)*

    以下のためにケース2と、入力文字列が終了10コマンドでは、ゼロ以上続く0011S。このパターンは、aの1後に2k+10 が続き、次に0個以上11のsおよび00sが続くことに相当します。00sと11sを削除すると2k+1、文字列の最後にある0の最後の1つが残り、最終的な状態を表します。

上記すべてに基づいて、00sと11s を1つの単一パスで同時に削除した後(01001あるパス00で削除され、次に11別のパスで削除される場合の反例です)s、最後の文字が最終状態になります。したがって、解の正しさが証明されます。


PPCGへようこそ!優れた答え、そしてそれと一緒に行くための素晴らしい正式な証明!
GammaFunction

3
ありがとう。一見したところ、このような単純な解決策では正しい結果が得られるのではないかと疑われる人もいると思います。したがって、その証拠を提供する必要があります。
ジョエル

9

Perl 6、17バイト

{m/.)>[(.)$0]*$/}

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

1,[00,11]isなどのコマンドと連結されたアキュムレータ値として入力を取ることにより、「必要に応じてこれら2つの入力を1つの入力にマージできます」という利点を活用します10011。これが大丈夫でない場合、それをとして受け取るための追加のバイトは5バイトだけf(accumulator, commands)です。文字列に強制変換できる一致オブジェクトを返します。

説明:

{                }  # Anonymous code block
 m/             /   # Find the first match from the input
   .)>              # Capture a number
      [     ]*      # Followed by any number of
       (.)$0        # Pairs of identical characters
              $     # Ending the string

基本的にこの作品のため0011しながら、コマンドは、文字通り何もしない01と、10コマンドだけでコマンドの2桁にアキュムレータを設定します。コマンドがない場合は、代わりにアキュムレータの初期値を使用します。


6

Zsh、33バイト

文字リストは引数として渡され、アキュムレータの初期値はstdinとして渡されます。

read a
for x y;a=$[x^a?a:y]
<<<$a

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


39バイト:コマンドが単一の文字列でなければならない場合

入力はaccumulator commands引数です。

for x y (${(s::)2})1=$[x^$1?$1:y]
<<<$1

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


楽しみのために、50バイトの再帰ワンライナー(TIO)を次に示します。

<<<${${2+`f $[$1^${2[1]}?$1:${2[2]}] ${2:2}`}:-$1}

6

Python 3、52バイト

f=lambda a,s:s and f([s[1],a][s[0]==s[1]],s[2:])or a

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

Chas Brownのおかげで一貫性のない戻り値の型が修正されました

入力を2つの文字列として受け取ります。アキュムレータとコード。


ああ、それは速かった。
HighlyRadioactive

1
素敵ですが、この潜在的な問題f(1,'11')==f(1,'01')がありFalseます- です。それは時々返しint、時にはstr。それで、acc入力を文字列として受け取るように指定しますか?
Chas Brown

@ChasBrownいいね、それは私が考えていたものよりもずっと単純だ。
7

いいですが、関数は再帰的であるため、匿名にすることはできません。52バイトである必要があります
Jitse

5

Brachylog11 9バイト

tġ₂≠ˢtt|h

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

各コマンドの後にアキュムレーター印刷するという概念を忘れることができなかったほど長い間、私はJo KingのPerlの回答からいくつかのインスピレーションを得て、それほど単純ではないソリューションを作成しました。

       |     The output is
     tt      the last element of the last element of
t            the last element of the input
 ġ₂          split into length-2 slices
   ≠ˢ        with equal pairs removed.
       |     If there is no such element, the input
        h    's first element is the output.

古いソリューション:

Brachylog18 16バイト

ġ₂ᵗc{th~h?tt|h}ˡ

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

入力形式の変更から-2バイト。


5

JavaScript(ES6)、27バイト

入力をとして受け取ります(a)(code)コードは2ビット整数のリストです。

a=>c=>c.map(x=>a^=x==a+1)|a

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


JavaScript(ES6)、 47  40バイト

などの入力を要する(a)(code)場合、コードは文字列です。

a=>c=>c.replace(/../g,x=>a^=x%4==a+1)&&a

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

どうやって?

(a=0,x=012)(a=1,x=102)

  a | x (bin) | int(x) % 4 | a + 1 | equal?
----+---------+------------+-------+--------
  0 |   "00"  |  0 % 4 = 0 |   1   |   N
  1 |   "00"  |  0 % 4 = 0 |   2   |   N
  0 |   "01"  |  1 % 4 = 1 |   1   |   Y
  1 |   "01"  |  1 % 4 = 1 |   2   |   N
  0 |   "10"  | 10 % 4 = 2 |   1   |   N
  1 |   "10"  | 10 % 4 = 2 |   2   |   Y
  0 |   "11"  | 11 % 4 = 3 |   1   |   N
  1 |   "11"  | 11 % 4 = 3 |   2   |   N

4

sed -E、26 19バイト

すべてのペアを削除することを実現することで、@ Cowsquackからなんと-7バイトも機能します。

s/(.)\1//g
s/.*\B//

stdinで連結された入力を受け取ります。Jo KingのPerlの回答に触発されました。 末尾のペアを削除すべてのペアを削除してから、最後の桁を取得します。

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


1
最後の行は単純s/.*\B//にすることができますが、とにかくアプローチを少し変更すると、さらに短い19バイトになります。オンラインで試してみてください。
user41805

1
ええと、私はそれs/(.)\1//gがうまくいくとは思いませんでした。それはあるペアの終わりと次のペアの始まりを取り除くことができるからです、しかしそれはまだうまくいきます。優秀な!
GammaFunction

@GammaFunction s/(.)\1//gs/00|11//g、私のソリューションに示されているものと同等です。
ジョエル

4

網膜0.8.218の 11バイト

(.)\1

!`.$

オンラインでお試しください!リンクにはテストケースが含まれます。入力を連結して取得します。@JoKingの元の回答のポートはそのトリックがなくても実際には3バイトでしたが、すべての2重の文字を削除し、最後に残った文字が機能することを指摘してくれた@CowsQuackのおかげで6バイトを節約しました。



@Cowsquack D'oh、ステージの分離について考えると、2バイトの節約!`.$になります。次に、を使用できるために別のバイトが保存され、末尾のペアに制限する必要がないため、さらに4バイトが保存されます...
Neil、

4

Python 3、38バイト

lambda l:[y for*x,y in l if[y]!=x][-1]

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

ジョエルのソリューションに基づいています。入力をアキュムレータの初期値(長さ1の文字列)とそれに続くコマンド(長さ2の文字列)のリストとして受け取ります。2つの異なる値を持つ最後のコマンドを検索し、2番目の文字を出力します。

そのようなコマンドがない場合にこれを初期アキュムレータ値にフォールスルーさせるために、単一文字の初期値文字列がテストに合格するようにします。これを行うには、最後の文字を含むシングルトンリストが、長さ1の文字列または長さ2の2つの異なる文字を含む文字列によって渡されるすべての先行文字のリストと等しくないかどうかをチェックします。




3

ゼリー8 6バイト

EÐḟṪṪo

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

-ニックケネディがルールの変更を通知してくれたおかげで、2バイト。(彼が提案したゴルフはEÐḟFȯṪ、やや巧妙に見えますが、以前のソリューションマイナスと同じ長さs2です。)入力形式は、コマンドを2文字の文字列のリストとして受け取りますが、テストフッターは、便宜上古い形式から変換されています。

私の新しいBrachylogソリューションからの翻訳。

古いバージョン:

ゼリー、13バイト

ḢẎ⁼⁹a⁸o
s2ç@ƒ

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

これが正しいかどうかは100%わかりませんが、3つのテストケースすべてで成功します。コマンドを左の引数として受け取り、初期アキュムレータを右の引数として受け取ります。


1
入力はリストに分割することが許可されているのでEÐḟFȯṪ、たとえばのように入力できます[[0,0],[0,1],[1,1],[1,1],[0,1]]
Nick Kennedy

うわー、仕様への変更は本当に非常に大きかった...
関連のない文字列

3

Haskell、29バイト

名前のない関数を最初の行にtypeで定義し(Foldable t, Eq b) => b -> t [b] -> bます。このコードゴルフの目的のためにChar -> [String] -> Char、最初の引数がアキュムレータで、2番目が各文字列が単一のコマンドである文字列のリストとしてインスタンス化できます。

foldl(#)
a#[x,y]|a==x=y|1>0=a

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


1
プレフィックス表記を使用して定義した場合、同じバイトカウント。タイプシグネチャの説明も含めて、ほぼ同じ答えを同時に書いたなんて信じられません…
cole

2

Python、111バイト

def f(a,b):
    c=a
    for i in range(0,len(b)-1,2):
        c=(not b[i])*(c or b[i] or b[i+1]) or c*b[i]*b[i+1]
    return c

ない。編集:AHHH誰かが私をそれに打ち負かしました!





1

バッシュ58 40バイト

プログラム全体に1バイトを追加f$0ます。に変更します。

(($1=$2-a?a:$3,1))&&f $1 ${@:4}||echo $1

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

$1がに設定されている場合、3項はfalseを返します0,1、最後((expression))を指定すると、構文エラーを除き、全体がtrueを返します。

すべての引数が消費されると、構文エラーが発生し、再帰が終了します。



1

チャコール、16バイト

F⪪η²F⁼θ§ι⁰≔§ι¹θθ

オンラインでお試しください!リンクはコードの詳細バージョンです。個別の引数を取ります。説明:

F⪪η²

命令を数字のペアに分割し、それらをループします。

F⁼θ§ι⁰

アキュムレータが最初の桁と等しい場合...

≔§ι¹θ

...次に2番目の数字を割り当てます。

θ

ループの最後にアキュムレータを出力します。



1

ゼリー、7 バイト

fؽḂ⁹;Ṫ

左側に整数のリストとしてプログラムを受け入れ、右側に整数を生成する初期アキュムレータを受け入れる2項リンク。

オンラインでお試しください!またはテストスイートを見る


@GammaFunctionがこれを行うことを推奨したため、入力マッピングを削除しています。

@A_ああOKモバイルで削除できません。後でこれに対処する必要があります
ジョナサンアラン

@A_は、0、1、2、3の数字として命令のマップされていないバージョンで機能するように修正されましたか?
ジョナサンアラン

1
はい、大丈夫です。


1

ルーンエンチャント、28バイト

/~@/i~/i<
/=?/~iR:l}i{l1-=?!

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

スペースで区切られた一連のバイトとして入力を受け取ります(Runicはリストを認識しません)。最初のバイトは初期状態であり、他のすべてのバイトはプログラムです。検証は実行されません(すなわち、それが唯一の有効なプログラムが入力として与えられ、それを表現するために使用されているもの値が気にしないと仮定し01)。


1

x86アセンブリ、33バイト

の初期アキュムレータの状態CL(整数0または1)とコマンドのアドレスをのゼロ終了ASCII文字列として取得しESIます。の最終的なアキュムレータの状態を残しCLます。

呼び出し命令をオフセットに向けます0x1Binterpret説明のラベル)。

3C 30 74 03 B0 01 C3 30 C0 C3 E8 F1 FF FF FF 38
C8 AC 75 07 E8 E7 FF FF FF 88 C1 AC 84 C0 75 EA
C3

説明(Intel構文を使用):

; function to convert ASCII '1'/'0' into 0 or 1 int values (from AL to AL)
ctob:
        CMP AL, 0x30 ; '0'
        JE .zero
        MOV AL, 1
        RET
        .zero:
        XOR AL, AL
        RET

; interpreting function
        interp_lp:
                CALL ctob     ; convert to number
                CMP AL, CL    ; compare to current accumulator
                LODSB         ; read the next character of the string
                              ; this doesn't affect any flags and we need to do
                              ; it in both cases anyway
                JNE interpret ; if AL != CL (from above, not the new value of AL), skip forward
                CALL ctob     ; convert AL to number
                MOV CL, AL    ; store AL in CL
interpret:      LODSB         ; read the next character of the string
                TEST AL, AL   ; check if it is a zero byte
                JNZ interp_lp ; if not, jump back into the loop
        RET



1

-ir16のバイト

"(!;½|':"=['_"|_

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

説明:

  1. 暗黙の入力を受け取り、アキュムレータの値を右にシフトします

  2. 以下(スタックの長さ-1を2で割ったもの)を繰り返します。

2.1。アキュムレータを一番上に戻します

2.2。コマンドの最初の部分と等しいかどうかを比較します

2.2.1。trueの場合、アキュムレータを交換します。それ以外の場合は、交換品をポップします

入力は、ソースと連結された初期acc値と見なされます。例えば

010011000
  • 最初の文字はacc値です
  • 残りはプログラム

0

Crystal、46バイト

Array(Tuple(Int32,Int32))などののコマンドを使用します[{0,0}, {0,1}, {0,0}]

def f(s,i);i.map{|c,v|s+=~(s^c)&(s^v)%2};s;end

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

より読みやすい形式で理解するのは非常に簡単です。

def f(state, instructions)
  instructions.map do |check, value|
    state += ~(state ^ check) & (state ^ value) % 2
  end
  state
end

関数は各コマンドをループし、タプル値をcとに自動的に解凍しますv。次にstate、式によって

state = state + NOT(state XOR check) AND (state XOR value) mod 2

私はほとんど試行錯誤で到着しました。すべてのコマンドが処理されると、状態値を返します。


0

C(clang)68 62バイト

t(s,e,a)char*s,*e;{for(;s<e;++s)a=*s++-48^a?a:*s-48;puts(&a);}

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

ソース文字列の先頭へのポインタ、ソース文字列の末尾へのポインタ(start + strlen(start))、および初期アキュムレータ値を取ります。

古いバージョン(0/1の場合、ASCII 48/49を出力):

t(s,e,a)char*s,*e;{for(;s<e;++s)a=*s++-48^a?a:*s-48;putchar(a+48);}

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