ダブルスピークですか?


46

では、以前の挑戦私は、文字列内の各文字をコピーした文字列を生成するコードのゴルファーを尋ねました。例えば:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

この課題は、一部のテキストがダブルスピーク文字列の定義を満たすかどうかを単に検出することです。

  • 偶数の文字があります。
  • ペアに分割される場合、すべてのペアは同じ文字の2つで構成されます。

挑戦

  • それはコードゴルフです、数バイトでそれをします。
  • 選択した言語を使用します。
  • オンライン通訳へのリンクを含めてください。
  • コードはテキストを受け入れます。
    • 簡単にするために、入力は印刷可能なASCII文字のみで構成されます
  • 入力がダブルスピークかどうかの表示を返します。かもしれない:
    • ブール値
    • 文字列(「true」、「false」、「yes」、「no」など)
    • 整数0または1

テストケース:

  • aba-false
  • abba-false
  • aabb-true
  • aaabb-false
  • tthhiiss-true
  • ttthhhiiisss-false

6
長さが2未満の入力でエラーが発生する可能性がありますか?
コール

3
推奨されるテストケース:abbaこれは誤りである必要があります
ジュゼッペ

2
推奨されるテストケース:aabbbb真実であるべき
Khuldraeseth na'Barya

2
@valまあ、私は、標準I / Oと議論するつもりはない
AJFaraday

2
推奨されるテストケース:0偽である必要があります。
640KB

回答:



24

brainfuck、20バイト

Jo Kingのおかげで1バイト節約されました。

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

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

読みやすい出力!

一度に2文字を入力し、ペアが一致しない場合はテープの1から離れます。EOFは0として扱われるため、自動的に処理されます。

文字列がダブルスピークではない場合、出力はヌルバイトであり、ダブルストークスである場合は0x01です。読み取り可能なバージョンは、これらを14バイトのコストで文字として出力します。


私がコメントに反対票を投じることができれば、上記のコメントに反対票を投じることになります。
A _

@PerpetualJ A)とても人気のあるエソランです。聞いたことがないとは信じられませんB)それは賛成する理由ではありません
Redwolfプログラム

@RedwolfPrograms SEの規則では、投稿が参考になり、聞いたこともない言語の名前を教えてくれた場合は賛成する必要があります。さらに、それは賛成に値する素晴らしいソリューションです。
PerpetualJ

1
@PerpetualJそれは素晴らしい解決策であることに同意しましたが、面白い名前と退屈な解決策(主にBFの変種)を持つエソランがたくさんあります
Redwolfプログラム

17

MATL、4バイト

Heda

入力は、単一のqoutesで囲まれた文字列です。それ以外の場合0、出力はダブルスピーク用1です。

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

説明

'TThhiiss iiss ddoouubbllee ssppeeaakk!!'例として入力を検討してください。

H    % Push 2
     % STACK: 2
     % Implicit input (triggered because the next function requires two inputs): string 
     % STACK: 'TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!', 2
e    % Reshape as a 2-column matrix of chars, in column-major order. Pads with char(0)
     % if needed. Note that char(0) cannot be present in the input
     % STACK: ['This is double speak!';
               'This is double speak!']
d    % Difference of each column
     % STACK: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
a    % Any: gives 0 if and only if all elements are 0
     % STACK: 0
     % Implicit display

12
ええと...「Heda」は誰ですか?:D
エリック・ザ・アウトゴルファー

7
「Heda」は「Hey!You!」のドイツ語です。
QBrute

14

05AB1E6 5 2 バイト

ιË

文字のリストとして入力します。

@ShaggyのJapt answerを移植して-3バイトなので、必ず彼に賛成してください!

オンラインそれを試してみたり、さらにいくつかのテストケースを検証します

説明:

ι   # Uninterleave the (implicit) input-list of characters
    #  i.e. ["t","t","t","t","e","e","s","s","t","t","!","!","!"]
    #   → [["t","t","e","s","t","!","!"],["t","t","e","s","t","!"]]
 Ë  # Check if both inner lists are equal
    #  → 0 (falsey)
    # (after which the result is output implicitly)


10

網膜、9バイト

(.)\1

^$

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

説明:

同じ文字のすべてのペアを削除します。

(.)\1

文字が残っていないか確認してください:

^$

1
^$最終段階として使用することにより、より伝統的な出力を提供できます。
ニール

@Neil Ahもちろん、ありがとう!それは確かに良く見えます。私はいつも、それがfalse真実であり偽であると奇妙に出力していると思いますtrue(しかし、バイトを保存して許可されていれば、それを使用します)。;)しかし、これは期待される結果を出力する等バイトソリューションであるため、これはより優れています。
ケビンクルーッセン

8

1
ちょっとこれが好き!同じ笑いをするのに80分かかりました。「今すぐゼリーを学ぼう」のようでした。私はこれを投稿しようとしていましたが、ゼリーの答えがすでにあった場合に見えた...そして^^これを見た私の手順:¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ...しかし、私は私が望んでいた、そして私が見たものを得るために管理することができませんでしたŒœ
V.クルトワ


6

PHP58 56バイト

function f($s){return!$s?:$s[0]==$s[1]&f(substr($s,2));}

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

再帰関数として。

PHP61 56 52バイト

while(''<$l=$argn[$i++])$r|=$l!=$argn[$i++];echo!$r;

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

またはスタンドアロンプ​​ログラム。入力文字列を経由してSTDIN、出力されているtruthy1それはダブルスピークであり、場合)falsey0)それはダブルスピークではない場合。

@ Night2に -4バイトthx !


1
これは、ダブルスピーク文字列とダブルスピーク文字列に対して1を出力するように見えます。
AJファラデー


6

x86マシンコード、 9 7バイト

D1 E9       SHR  CX, 1          ; divide length in half 
AD          LODSW               ; load next two chars into AH/AL 
3A E0       CMP  AH, AL         ; compare AH and AL 
E1 FB       LOOPE -5            ; if equal, continue loop

入力文字列SI、入力文字列の長さCXZFダブルスピークの場合に出力されます。

または、完全なPC DOS実行可能ファイルとして14バイト

B4 01       MOV  AH, 01H        ; DOS read char from STDIN (with echo) 
CD 21       INT  21H            ; read first char into AL
92          XCHG DX, AX         ; put first char into DL
B4 08       MOV  AH, 08H        ; DOS read char from STDIN (no echo) 
CD 21       INT  21H            ; read second char into AL
3A C2       CMP  AL, DL         ; compare first and second char 
74 F3       JE   -13            ; if the same, continue loop 
C3          RET                 ; otherwise exit to DOS 

入力はSTDIN、パイプまたはインタラクティブのいずれかを介して行われます。二重化されていない文字が検出されるまで「二重化解除」入力をエコーし​​、その時点で終了します(おそらくI / Oルールを少し曲げますが、これは単なるおまけの答えです)。

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

以下を使用してISDBL2.COMをビルドおよびテストしxxd -rます。

00000000: b401 cd21 92b4 08cd 213a c274 f3c3       ...!....!:.t..

元の24バイトの完全なPC DOS実行可能ファイル:

D1 EE       SHR  SI, 1          ; SI to DOS PSP (080H) 
AD          LODSW               ; load string length into AL 
D0 E8       SHR  AL, 1          ; divide length in half 
8A C8       MOV  CL, AL         ; put string length into BL 
        CLOOP: 
AD          LODSW               ; load next two chars into AH/AL 
3A E0       CMP  AH, AL         ; compare AH and AL 
E1 FB       LOOPE CLOOP         ; if equal, continue loop
        DONE: 
B8 0E59     MOV  AX, 0E59H      ; BIOS tty function in AH, 'Y' in AL 
74 02       JZ   DISP           ; if ZF, result was valid double 
B0 4E       MOV  AL, 'N'        ; if not, change output char to N 
        DISP: 
B4 0E       MOV  AH, 0EH 
CD 10       INT  10H 
C3          RET                 ; return to DOS

コマンドラインからの入力、'Y'二重の'N'場合は画面への出力、そうでない場合は。

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

以下を使用してISDBL.COMをビルドおよびテストしxxd -rます。

00000000: d1ee add0 e88a c8ad 3ae0 e1fb b859 0e74  ........:....Y.t
00000010: 02b0 4eb4 0ecd 10c3                      ..N.....

クレジット:

  • @ErikFに-2バイト thx!

2
/のLOOPE代わりに2バイトを節約することをお勧めします。JNZLOOP
ErikF

@ErikF、素晴らしい!それを完全に忘れました!
640KB

6

Lua67 66 63 59 33 32バイト

ジュゼッペのおかげで-25バイト
valのおかげで-1バイト

print(#(...):gsub("(.)%1","")<1)

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

二重文字をすべて削除し、結果が空かどうかを確認します。


1
なぜだけi:gsub("(.)%1","")ではないのi==""ですか?
ジュゼッペ

1
これは34バイトで、Luaを書いたことがないので有効かどうかは完全にはわかりませんが、動作するようです。
ジュゼッペ

ただし、Code Golf Stack Exchangeへようこそ!
ジュゼッペ

私はそれ"(.)%1"自体に衝突が含まれると想定していましたが、すべてのキャプチャに対して一度置き換えるだけで十分であるとは思いませんでした。ソリューションを実装する必要がありますか、それとも独自の回答を作成する必要がありますか?ありがとう!
HugoBDesigner

1
良いアイデア!arg[1](...)1バイト節約するために置き換えることができます。
val



5

JavaScript、28バイト

s=>s.every((x,y)=>x==s[y|1])

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


wastlの正規表現を使用した23バイト

s=>/^((.)\2)*$/.test(s)

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


24バイトですが、trueの場合nullはfalse、falseの場合は配列を出力します。オンラインで試してください!
wastl

27バイトs=>!s.some((x,y)=>x>s[y|1])
tsh


5

Haskell28 23バイト

f(x:y:z)|x==y=f z
f[]=1

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

とても簡単です。ダブルスピークは空か、ダブルスピークの前に繰り返されるキャラクターのみです。

それほど簡単ではありません。メタコンセンサスごとに、エラーの有無による出力。エラーがない場合はダブルスピークを意味します。最初の2文字が異なる場合、または奇数の文字がある場合、パターンマッチングは失敗します。これらの節約のためのライコニに感謝します!




4

PowerShell39 38バイト

!$($args|?{+$p*($p="$_"[$p-eq$_])};$p)

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

ここ$pには前の文字が含まれます。

再帰なし、正規表現なし:)。スプラッティング文字列を介して文字配列として入力を受け取ります(TIOリンクを参照)。


PowerShell、48バイト

for(;$b-eq$a-and$args){$a,$b,$args=$args}$b-eq$a

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

再帰なし、正規表現なし、パイプなし:D。また、スプラッティング文字列を介して文字配列として入力を受け取ります。$b-eq$a代わり$a-eq$bに、最後の文字のコードが#0の場合に使用します。


4

PowerShell64 59バイト

filter f($n){$a,$b,$r=$n;$a-eq$b-and$(if($r){f $r}else{1})}

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

再帰関数、正規表現なし。入力をchar-array として受け取ります(TIOリンクを参照)。最初の2つの要素剥離$a$b、格納残りに$r。まだ要素が残っている場合は、とともに再帰し$a -eq $bます。それ以外の場合は、単にを確認し$a -eq $bます。出力は暗黙的です。

Mazzyのおかげで-5バイト



1
@mazzyありがとう!$ステートメントブロックの前に行方不明になっていたため、なぜ機能しなかったのかわかりませんでした。
AdmBorkBork



4

シェークスピアプログラミング言語204 156バイト

Jo Kingのおかげで-48バイト(主に出力方法の変更による)

A.Ajax,.Puck,.Act I:.Scene I:.[Exeunt][Enter Ajax and Puck]Ajax:Open mind.Puck:Open
mind.Is I worse zero?If soSpeak thy.Is you as big as I?If soLet usAct I.

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

入力がダブルスピークの場合はエラーで終了し、ダブルスピークではない場合は警告付きで終了します(デフォルトで許可されています)。


4

19 17文字

?{!1<|=[|0.(_)]}1

説明:

?             # read input

{             # while
    !1<       # stack length greater than 1?
|             # end of while condition and beginning of while block
    =         # compare the 2 top values in the stack
    [         # if (the condition is the top of stack)
    |         # end of then block and beginning of else block
        0.    # output 0
        (_)   # clear stack (discard top of stack in for loop stack length times)
    ]         # end if
}             # end while

1             # stack is already empty, push a truthy value

              # implicitly output the stack content if there was no explicit output

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


3

R53 34バイト

ジュゼッペのおかげで-19バイト

function(a)gsub("(.)\\1","",a)==""

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


1
gsub("(.)\\1","",a)==""トリックも行うと思います。他の多くは同じ正規表現を使用しています。
ジュゼッペ

@Giuseppeこの正規表現全体は私にとってかなり新しいものです。ありがとう。
ロバートS.

R + pryrを使用すると、この回答からわずかに修正された32バイトが得られます。
Khuldraeseth na'Barya

2
入力をベクトルとして取得できる場合function(a)!sum(rle(a)$l%%2)、28
MickyT

3

脳高射砲26、22のバイト

({<({}[{}])>{()<>}{}})

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

falseの場合は1、trueの場合は0を出力します。

読み取り可能なバージョン:

({
    <({}[{}])>
    {
        ()
        <>
    }
    {}
})

私はもともとこれを持っていた:

{
    ({}[{}])

    {
        <>([()])<>{{}}
    }{}
}
<>({}())

これは10バイト長くなります。


0 / non0はブール値としてカウントされますか?もしそうなら、あなたはできる({({}[{}]){{}}{}})
ライリー

3
「読みやすいバージョン」で笑-とても読みやすい:P
クイン

@rileyいいえ、それは無効です。しかし、私はより良いトリックを見つけました。
DJMcMayhem

@quinnが読みやすい:P
DJMcMayhem


3

JavaScript、26 23バイト

s=>/^((.)\2)+$/.test(s)

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

再帰的ソリューション、30バイト

0バイトのコストで修正してくれたArnauldに感謝します。

f=([x,y,...s])=>x?x==y&f(s):!y

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



ありがとう、@ Arnauld :)
シャギー

@オリバー、がらくた; 私の投稿する前に元のソリューションを見ただけです。あなたが私の前にその23に到達した場合、26にロールバックできることをうれしく思います-お知らせください。
シャギー


3

Zsh、36バイト

前の課題に対する私のZshの回答はここにあります。

二重に話さない場合は真実(0)を終了し、二重に話す場合は偽(1)を終了します。(コメントで許可されているとおり。)

for a b (${(s::)1})r+=${a#$b}
[ $r ]

for a b (${(s::)1})r+=${a#$b}
         ${(s::)1}             # split $1 characterwise
for a b (         )            # take pairs of characters from ${(s::)1}, assign to $a and $b
                      ${a   }  # first character
                      ${ #$b}  # remove second character as prefix
                   r+=         # append to $r as string
[ $r ]                         # exit truthy if $r is non-empty

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


3

プロローグ(SWI)60 45バイト

無関係な文字列のおかげで

+[].
+[A,A|T]:- +T.
-X:-string_chars(X,Y),+Y.

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

それを文字列から原子の種類のリストに変換すると、スコアが台無しになりますが。



1
... 文字列を入力として使用し、アトムではなくても、のatom_chars代わりに使用することもできるようですstring_chars。しかし、バックティックで区切られた文字列(つまり、文字コードのリスト)を使用できる場合、それは無関係かもしれません。
無関係な文字列
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.