「便利な回文」チェッカー


39

これまでに回文コードを記述しようとしたことがあるなら、どれだけの括弧が邪魔になる傾向があるか知っているでしょう。()()、それがあるべきように、それはちょっと見えていても、回文されていない状態())(()(両方見て非常にダムパリンドロームとの両方です。逆の場合は便利ではないでしょうか?

文字列は、逆の括弧()、括弧()、および中括弧()がすべて反転しているときに導出された文字列と等しい場合、便利な回文です。他のキャラクターは特別ではなく、反転が必要です。(ペアになっていることもありますが、そうではないことが多いため、省略されています。)()[]{}<>

あなたの仕事は、あなたの言語で、プログラム(STDINで入力を取得する)または関数(単一の文字列引数を取得する)を書くことです。それ以外の場合、および(b)それ自体は回文的に便利です。

たとえば、次の入力は便利な回文です。

racecar
(a)(bb)(a)
void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov

そして、以下はそうではありません:

non-palindrome
A nut for a jar of tuna?
(old [style] parens) )snerap ]elyts[ dlo(
ingirumimusnocte)etconsumimurigni

インタープリター/コンパイラフラグを除き、外部状態(特定のファイル名、ディレクトリ構造、他のユーザー入力、Webアクセスなど)に依存することはできません。

また、使用している言語のコメント機能を利用して、コメントアウトまたは未使用のコードをレンダリングする「コメントトリック」を使用することはできません。たとえば、次のすべては、安全に削除または破棄できる非機能部品が含まれているため、許可されません(便利なパリンドローム性が失われます)。

{some code} // {edoc emos}
{some code} NB.BN {edoc emos}
"n\" ;{edoc emos} ;"; {some code}; "\n"

明らかにこれはそのようなすべてのケースをカバーするわけではないかもしれませんが、ここでの挑戦の精神はコメントと未解析**コードを使用して回文性を達成するのではなく、代わりに修正された括弧と括弧を使用することです。私はあなたを見ています、LISP、Brainfuck。

これはであるため、最短のコードが優先されますが、あらゆる長さのコードを歓迎します。

* 一貫したtrueとfalseの値により1、trueと0false、またはFalsetrueと"no"falseのように、これらの値が互いに異なり、プログラムの実行ごとに変更します。あなたのキャラクターを救うものを使用してください。

** 実行と混同しないでください:有効で、奇妙なことをするかもしれませんが、呼び出されないコードは問題ありません。


以下のようなものはどうif(false){some code}か、未使用の変数?彼らは許可されていますか?
ace_HongKongIndependence

@ace言語が何らかの形で型の一致または構文の妥当性について未実行コードを解析またはチェックする場合、それは問題ありません。あなたの言語がそのブロックの内部をチェックしないためにコメントに等しい場合、もしそうなら構文エラーをスローするでしょうが、それは大丈夫ではありません。の有効な使用法を見つけることができれば、使用できるようになると思い(eslaf)fiますif(false)
algorithmshark

58
なぜ()()パリンドロームではないのかを理解するのに時間がかかりすぎた
モニカを復活させる

コードは複数行入力で動作する必要がありますか?
ヴェンテロ

@Ventero改行とキャリッジリターンは文字であり、それらには反転するペアがないため、通常の文字としてカウントされます。
algorithmshark

回答:


13

J(60)

(|.-:'())([]][{}}{'&charsub) :: (busrahc&'}{{}][[])(()':-.|)

これは引数を取る関数です:

   (|.-:'())([]][{}}{'&charsub) :: (busrahc&'}{{}][[])(()':-.|) 'ingirumimusnocte)etconsumimurigni'
0
   (|.-:'())([]][{}}{'&charsub) :: (busrahc&'}{{}][[])(()':-.|) '(a)(bb)(a)'
1

説明:

  • f :: gf入力に対して関数を実行し、エラーなしで戻った場合に結果を返します。場合はf失敗し、それが実行されますg代わりに。

  • fここで(|.-:'())([]][{}}{'&charsub)実際の作業を行いいます、:

    • |.:逆
    • -::等しい
    • '())([]][{}}{'&charsub:各ブラケットを対向するブラケットに交換
  • g機能があり(busrahc&'}{{}][[])(()':-.|)、ナンセンスが、構文的に有効です。busrahc定義されていませんが、実行時にのみ解決されるため(実行されないため)、それは問題ではありません。

あなたは回して文字を保存することができますf :: gにをg@-@fgフックと同等である(-.|)ための:出力になるように、-1と便利なパリンドロームではなく、それぞれのための空のリスト。
algorithmshark

34

GolfScript、107 91

.4:ab-1:ba=;1
%ba%{...fi@@=
c43.=;)('"([{
}])"'~?~'"([{
}])"')(;=.34c
=@@if...}%ab%
1;=ab:1-ba:4.

改行は芸術的です。fic43およびcnoopsですが、コード全体が実行されます。

それ以外の場合は-3-1-1、便利な回文印刷用に印刷し-4-1-1ます。オンラインでお試しください!

代替バージョン、155バイト

64バイトのコストで、これは次の場合に改善できます。

0!*1{!}\;:);0:f;0:i;-1:ab;9:ba;
...=;1%ab%{....i@f@@fi@@=@.=@\)
+""'"([{}])"'~+?+~'"([{}])"'""+
(\@=.@=@@if@@f@i....}%ba%1;=...
;ab:9;ba:1-;i:0;f:0;(:;\{!}1*!0

前と同様に、コード全体が実行され、すべての単一バイトが出力に影響します。

それ以外の場合は010、便利な回文印刷用に印刷し-100ます。オンラインでお試しください!

テストと例

$ base64 > palindrome.gs -d <<< LjQ6YWItMTpiYT07MSViYSV7Li4uZmlAQD1jNDMuPTspKCciKFt7fV0pIid+P34nIihbe31dKSInKSg7PS4zNGM9QEBpZi4uLn0lYWIlMTs9YWI6MS1iYTo0Lg==
$ wc -c palindrome.gs
91 palindrome.gs
$ rev palindrome.gs | tr '([{}])' ')]}{[(' | diff - palindrome.gs
$ echo -n 'r(a[c{"e"}c]a)r' | golfscript palindrome.gs
-3-1-1
$ echo -n 'totallynotapalindrome' | golfscript palindrome.gs
-4-1-1
$
$ base64 > pal.gs -d <<< MCEqMXshfVw7Oik7MDpmOzA6aTstMTphYjs5OmJhOy4uLj07MSVhYiV7Li4uLmlAZkBAZmlAQD1ALj1AXCkrIiInIihbe31dKSInfis/K34nIihbe31dKSInIiIrKFxAPS5APUBAaWZAQGZAaS4uLi59JWJhJTE7PS4uLjthYjo5O2JhOjEtO2k6MDtmOjA7KDo7XHshfTEqITA=
$ wc -c pal.gs
155 pal.gs
$ rev pal.gs | tr '([{}])' ')]}{[(' | diff - pal.gs
$ echo -n 'r(a[c{"e"}c]a)r' | golfscript pal.gs
010
$ echo -n 'totallynotapalindrome' | golfscript pal.gs
-100
$ for i in {1..154}; do head -c $i pal.gs > tmp.gs; tail -c +$[i+2] pal.gs >> tmp.gs
> [ "$(echo -n 'r(a[c{"e"}c]a)r' | golfscript tmp.gs 2> /dev/null)" = "010" ] && echo $i
> done; rm tmp.gs
1
for i in {1..154}; do head -c $i pal.gs > tmp.gs; tail -c +$[i+2] pal.gs >> tmp.gs
>  [ "$(echo -n '42' | golfscript tmp.gs 2> /dev/null)" = "-100" ] && echo $i
> done | grep '^1$'; rm tmp.gs

使い方

.             # Duplicate the input string.
4:ab-1:ba     # Save 4 in “ab” and -1 in “ba”.
=;            # Compare 4 to -1 and discard the result.
1%            # Save every element from the input string in a new string.
ab%           # Reverse the input string.
{             # For each character in the input string:
  ...         # Duplicate the character thrice.
  fi          # Variable “fi” is undefined; this does nothing.
  @@=         # Verify that the character is equal to itself; push 1.
  c43         # Variable “c43” is undefined; this does nothing.
  .=;         # Verify that 1 is equal to itself and discard the result.
  )(          # Increment and decrement the character.
  '"([{}])"'~ # Push that string and evaluate it. Result: '([{}])'
  ?           # Retrieve the character's position in '([{}])'. -1 means not found.
  ~           # Negate the position.. Examples: -1 -> 0    0 -> -1    2 -> -3
  '"([{}])"') # Push that string and pop its last element. Result: '"([{}])' 34
  (;          # Decrement 34 (the ASCII code of a double quote) and discard.
  =           # Retrieve the corresponding character.
  .34         # Duplicate the character and push 34.
  c           # Variable “c” is undefined; this does nothing.
  =           # If the character is a double quote, the index was -1.
  @@if        # In that case, replace the double quote with the original character.
  ...         # Duplicate the new character thrice.
}%            #
ab%           # Save every fourth element in a new string to discard dummy values.
1;            # Push 1 and discard.
=             # Push 1 if the modified string matches the original, 0 otherwise.
ab:1-         # Save 4 in “1” and subtract.
ba:4.         # Save -1 in “4” and duplicate.

0!*           # Pop and push the input string.
1{!}\;:);     # Make “)” an alias for “!”.
0:f;0:i;      # Variables.
-1:ab;9:ba;   # Moar variables.
...=;         # Duplicate the input string.
1%ab%         # Reverse the copy.
{             # For each character in the input string:
  ....        # Duplicate the character four times.
  i@          # Push 0 and rotate a string copy on top of it.
  f@@fi@@     # Push 0 and rotate 0 on top of it.
  =@          # Push 1 and rotate a string copy on top of it.
  .=@         # Push 1 and rotate 1 on top of it.
  \)+         # Negate a 1 and add. Result: 1
  ""          # Push that string.
  '"([{}])"'  # Push that string.
   ~+         # Evaluate the second string and concatenate. Result: '([{}])'
   ?          # Retrieve the characters position in '([{}])'. -1 means not found.
   +~         # Add 1 to the position and negate. Ex.: -1 -> -1 | 0 -> -2 | 1 -> -3
  '"([{}])"'  # Push that string.
  ""          # Push that string.
  +           # Concatenate. Result: '"([{}])"' 
  (\          # Pop the first double quote and swap it with the rest of the string.
  @=.         # Retrieve the corresponding character and duplicate it.
  @=          # If the character is a double quote, the index was -1.
  @@if        # In that case, replace the double quote with the original character.
  @@          # Rotate the modified character to the bottom.
  f@i....     # Push dummy values.
  }%          #
  ba%         # Save every ninth element in a new string to discard dummy values.
  1;          # Push 1 and discard.
  =           # Push 1 if the modified string matches the original, 0 otherwise.
  ...;        # Duplicate thrice and discard the last copy.
  ab:9;ba:1-; # Variables.
  i:0;f:0;    # Moar variables.
  (:;\        # Negate, override “;” and swap.
  {!}1*!0     # Negate twice and push 0.

13

ルビー、110

(z=gets;r=z.tr *["([{}])",")]}{[("];p *z==r.reverse;1)||(1;esrever.r==z* p;[")]}{[(","([{}])"]* rt.z=r;steg=z)

印刷しtrueた入力が便利回文である場合とfalseそうでない場合。この解決策は、入力が改行で終了しないことを前提としているため、次でテストすることに注意してくださいecho -n

echo -n '(a)(bb)(a)' | ruby convpal.rb
true

echo -n '(a)(bb()a(' | ruby convpal.rb
false

# note that for this to work, the file must not contain a newline
# to remove a trailing newline, pipe it through tr -d $'\n'
cat convpal.rb | ruby convpal.rb
true

これは多少の簡単なポートである私の答え回文回文チェッカー(そして実際に、これまでgolfedません)。使用される主なトリックは、最初の括弧で囲まれた式が常にを返す1ため、ブール式の後半は決して評価されません(ただし、解析されます)。

これを適合させる唯一の難点は、呼び出しを追加する方法を考え出すたz.trその「便利なリバース」も構文的に有効になるように-しかし、私は単に私がすでにプットを使用したのと同じトリック使用することができます*、前半のように解析されますsplat演算子(関数のパラメーターとして配列の内容を使用)および後半の配列の乗算(または反復)演算子として。

ルビー、157 297、実行されたすべてのコード

w=tsoh=gets p
o=rt=esrever=Gem
q=tsoh.tr *["([{}])",")]}{[("]
q==esrever.host=w=tsoh.reverse==q
[")]}{[(","([{}])"]* rt.host=q
meG=reverse=tr=o
p steg=host=w

この(少し長い)バージョンはすべてのコードを実行、2行を除くすべてが出力に影響します。出力は最後の行に出力されますが、すべての行がエラーなしで解析および実行されます。このバージョンは、後続の改行を入力の一部として解釈するため、それを使用echo -nしてテストするか、入力に改行を追加します。true入力が便利な回文である場合は印刷し、falseそうでない場合は印刷します。

説明

# Read the input by calling gets(nil), which is achieved by passing the return
# value of a call to Kernel#p (which returns nil if no argument is supplied) to
# gets.
w=tsoh=gets p
# Assign the global Gem module to three variables.
# The variable names are the reversed names of methods we have to call later.
# This doesn't necessarily have to be the Gem module, any global module/variable
# (or class that allows object creation through a call to the module itself,
# e.g. Hash or GC) with a writable property would do, but Gem#host was
# the shortest one I could find. This is necessary because Ruby doesn't
# allow setting previously undefined properties through the dot syntax.
o=rt=esrever=Gem
# Replace the parentheses with the corresponding flipped one.
# sserts is the reverse of the property name we're going to use later.
q=tsoh.tr *["([{}])",")]}{[("]
# Do the convinient palindrome check and assign its result to a few variables
# and Gem's host property.
q==esrever.host=w=tsoh.reverse==q
# Here, the * is parsed as array join operator.
[")]}{[(","([{}])"]* rt.host=q
# Nothing special here.
meG=reverse=tr=o
# Print the result of the palindrome check, which was stored in w.
p steg=host=w

9

GolfScript、61文字

OK、GolfScriptのベースラインソリューションです。私はそれがさらに改善されると確信しています:

{.-1%{"([{}])".2$?~@[.]@+=}%=}~{=%{=+@[.]@~?$2."([{}])"}%1-.}

GolfScriptの場合と同様に、このプログラムは標準入力から入力を読み取ります。以下を出力します:

1{=%{=+@[.]@~?$2."([{}])"}%1-.}

上記の課題で定義されているように、入力が便利な回文である場合、および

0{=%{=+@[.]@~?$2."([{}])"}%1-.}

そうでない場合。

説明:このプログラムは、解析される限り、未実行コードはOKであるという裁定に大きく依存しています。これは、中括弧({ })で区切られた2つのコードブロックで構成されます。これらのブロックは、互いのミラーイメージです。

最初のコードブロックは、によって実行される~入力出力、便利回文である場合、それに続く、およびチェック1がある場合には0それがない場合。2番目のコードブロックは実行されないため、プログラムが終了し、GolfScriptインタープリターによってスタック上のすべてが自動的に文字列化されて出力されるまで、単にスタックに残ります。

GolfScriptインタプリタはないことに留意すべきである非常に(そのことについては、これまで以上)解析時に、いくつかの構文チェックを。GolfScriptコードブロックリテラルには、実行時にクラッシュする可能性がある場合でも、ほとんどすべてを含めることができます。それでも、未終了の文字列リテラルなどのいくつかの構文エラーは、実行されていないコードでもエラーを発生させるため、このソリューションは(ほとんど)ルール内に収まると考えています。

追伸 実際に実行されたコードを見ると、@[.]@文字列リテラル"([{}])"、さらにはloop などの便利な回文要素がいくつか含まれています%{ ... }%。これは、完全なパリンドロームプログラムが実行され機能する「本質的にパリンドロームの」GolfScriptソリューションが実際に可能になる可能性があるという魅力的な提案を提供します。私はまだ自分で作成することができていないので、最初に作成した人に+100の報奨金を提供します!


3
待って、あなたのコードは回文そのものですか?:O
Fabricio

私はこの解決策"n\";X;";X;"\n"をコメントのようなものと考えたいと思いますが、疑問の恩恵をあなたに与えます。私は、そのような「本質的に回文的な」解決策を本当に探していましたが、少なくとも、ブロックの非実行がもう少し手に負えない解決策を探していました。
algorithmshark

私の答えには、noop(未定義の変数)と何も達成しないいくつかの部分(例:)があります1;。それはまだ完全に機能するとみなされますか?
デニス

@デニス:そうだね。おめでとう、それは確かに十分に印象的です。この質問はまだ十分に新しいようで、まだその賞金を投稿することはできませんが、数日後には問題が解決するでしょう。
イルマリカロネン

1
出力形式leeway abuuuse :-)
ジョンドヴォルザーク14

4

JavaScript(ES6)、245バイト

ブラウザで実行できるJSの回答が必要だったので、ここにあります。

eurt=>eurt==(("",eurt))["split"||"nioj"]("")["map"||"esrever"](x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x||[x]({')':'(','(':')',']':'[','[':']','}':'{','{':'}'})>=x)["reverse"||"pam"]("")["join"||"tilps"]((true,""))==true>=true

実際には実行されないすべてのコードを削除すると、次のようになります。

eurt=>eurt==(("",eurt))["split"||"nioj"]("")["map"||"esrever"](x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x||[x]({')':'(','(':')',']':'[','[':']','}':'{','{':'}'})>=x)["reverse"||"pam"]("")["join"||"tilps"]((true,""))==true>=true
eurt=>eurt==(("",eurt))["split"        ]("")["map"           ](x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x                                                           )["reverse"       ]("")["join"         ]((true,""))==true>=true

これは簡単にできます:

eurt=>eurt==eurt.split("").map(x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x).reverse("").join("")

true / eurtの代わりにn1 / 1nを使用し、||の代わりにコンマを使用し、ブラケットスイッチャーをいじることにより、約60バイトを節約できます。n1=>n1==(('',n1))['nioj','split']``['esrever','map'](c=>`()[]{}`[`()[]{}`['indexOf'](c)^1]||c||[1^(c)['fOxedni']`{}[]()`]`{}[]()`>=c)['pam','reverse']``['tilps','join']((1n,''))==1n>=1n(185バイト)
Yair Rand

3

Javascript(ES6)288

Spidermonkeyコマンドラインシェルで実行されます。STDINから1行を読み取り、入力が便利な回文であるかどうtrueかにfalse応じて出力します。

((print)((eval)('r=readline()')==([0]['map']['call'](r,x=>({'{':'}','}':'{','[':']',']':'[','(':')',')':'('})[x]||x)['reverse']()['join']('')))&&((('')['nioj']()['esrever'](x||[x]({')':'(','(':')',']':'[','[':']','}':'{','{':'}'})>=x,r)['llac']['pam'][0])==('()enildaer=r')(lave))(tnirp))

このコードは構文的に有効ですが&&print関数がfalsey値を返すため、その後のすべては実行されません。

Firefoxのコンソールでこのコードを実行するにはreadline、最初にこのshimを実行して、print機能をエミュレートします。readline必要に応じて内部の入力を編集します。

readline = function(){ 
    return "void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov"; 
}, print = console.log.bind(console);

次に、出力の簡単な例を示します。

コマンドラインの例


利点を取ることは&&本当に賢いだった、私はあなたを称賛(しかし、それは少しcheatyに思えるん)
MayorMonty

2

05AB1E、35バイト

"{[()]}"DRr‡`rJ¹Q,Q¹Jr`‡rRD"{[()]}"

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

説明:

                     # Implicit input
 "{[()]}"            # Push "{[()]}" onto the stack
         DR          # Pushes a reversed copy onto the stack
           r         # Reverse the order of the stack
            ‡        # Transliterate
             `       # Flatten array on stack
              r      # Reverse order of stack
               J     # Join stack
                ¹Q   # Check equality with first input
                  ,  # Print
                     # Everything after is still syntactically correct, but just does not print anything.

答えが無効であるため、これは役に立たないと思いますが、代わりに"()[]{}"あなたができるžu„<>-
-acrolith

@daHugLenny今では有効です
オリバーNi

プログラムの残りの部分は、q少なくとも構文の妥当性を解析した後ですか?そうでない場合は、コードの後半をコメントアウトすることに等しいと考えます。
algorithmshark

@algorithmshark修正済み。
オリバーNi

1

CJam、38バイト

Q~"=re%W_@%W_q"`{[()]}`"q_W%@_W%er="~Q

印刷"=re%W_@%W_q"1入力が便利パリンドロームとあれば"=re%W_@%W_q"0そうでありません。

CJamインタープリターでオンラインで試してください。

使い方

Q~                                     e# Evaluate an empty string.
  "=re%W_@%W_q"                        e# Push that string.
               `                       e# Inspect. Pushes "\"=re%W_@%W_q\"".
                {[()]}                 e# Push that block.
                      `                e# Inspect. Pushes "{[()]}".
                       "           "~  e# Push and evaluate.
                        q              e# Read from STDIN.
                         _W%           e# Push a reversed copy.
                            @          e# Rotate "{[()]}" on top of the stack.
                             _W%       e# Push a reversed copy.
                                er     e# Perform transliteration.
                                  =    e# Compare to the input string.
                                     Q e# Push an empty string.

プログラムの実行後、CJamは自動的にスタック上の3つの項目すべてを検査します。検査された文字列、文字列比較からのブール値、空の文字列です。


0

Perl、83 + 2 = 85バイト

で実行 -nl

say$_~~reverse y-"({[]})"-")}][{("-r;exit;tixe;r-")}][{("-"({[]})"-y esrever~~_$yas

入力の真実性を出力した後、コードは終了します。セミコロン以降はすべて解釈されます(スクリプトがそのポイントに到達するとクラッシュしますexit)。exit;tixe;コードを省略した場合、クラッシュする前に結果が正しく出力されます。

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