シェークスピアプログラミング言語でのゴルフのヒント


43

シェークスピアプログラミング言語でゴルフをするための一般的なヒントは何ですか?コードゴルフの問題に適用でき、少なくともSPLに固有のアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。

回答ごとに1つのヒントを投稿してください。


17
SPLでゴルフできるかどうかわかりません。SPLは非常に冗長であるため、この質問にはコードトローリングタグが必要と思われます。:P
アレックスA.

SPLをゴルフすることはできません。少なくとも、Shakesperian伝承の私の微弱な知識...へ
ロドルフォ・ディアス

@RodolfoDias:フィーブル?あなたはPPCGの常駐シェークスピア学者だと思います。
アレックスA.

8
@AlexA。それは良いことではないかもしれません:それはちょうど私がSPLを試して理解するのに十分な痴呆だということを意味します:
ロドルフォ・ディアス

@AlexA。Spはそれを行うことができます...
コナーオブライエン

回答:


18

(まあ...これは私の採用言語1なので、ここに何かを追加する義務があるように感じます)

短い変数名を使用する

ええ、ええ、ええ、それはコードゴルフの標準です。1文字の変数名を使用するだけで、ここではニュースはありません。それともありますか?SPLを作成したチャップは、言語の変数に名前を付けられないほど奇抜だったためです。それら、キャラクターの長さの点で王室の苦痛であるシェイクスピア劇に由来する必要あります-しかし、SPLでコーディングしている場合、あなたはすでにそれを知っています。したがって、私のアドバイスは、インスタンスごとにカンタベリーの大司教の代わりに、AjaxFordPageまたはPuckなどの短い名前の文字を使用することです。

私はそれがすべてだ、私は恐れている。


1-私のJavaスキルは新生児のスキルと同等です。



13

(前の手順を実行した後、いくつかのことを思い出しました)

コードを慎重に選択してください

これが何を意味するかを説明するための例。

Ajax:
 You are as warm as a big red rich fair cute bold cat!

そして

Ajax:
 Thou art as blossoming as an embroidered trustworthy bottomless peaceful charming handsome chihuahua!

まったく同じ結果が得られます。つまり、話されているキャラクターの値が64になります(SPLとの長い戦いを読んだと仮定する、両方の行が2 * 2 * 2 * 2 * 2 * 2 *に相当することがわかります) 1); ただし、最初のバイトは59バイトで、2番目のバイトは107バイトです。

それでも、誰もSPLでチャレンジに参加できるほど痴呆になることはないので、...


10
説明で同じ形容詞を複数回使用できますか?たとえばa big big big big big big cat、さらに4バイトを節約しますか?私はそれが芸術性を台無しにすることを知っています...しかし、これは結局コードゴルフです。;)
DLosc

@DLosc、私が見たものから、それをすることを禁止するものは何もありません。だから...あなたは私よりゴルファーです^ _ ^
ロドルフォ・ディアス

1
エヘム。ロバート・フレイザーを痴呆と呼ばないでください。codegolf.stackexchange.com/a/69360/43394
wizzwizz4

12

ローマ数字はすべて有効なシーン番号です

つまり、次の代わりに:

Scene I
Scene II
Scene III
Scene IV
Scene V

できるよ:

Scene L
Scene I
Scene C
Scene X
Scene V

あるD有効なローマ数字?IIRC、500(ただし、SPLで有効かどうかはわかりません)
ジュゼッペ

あなたはちょうどそれをチェックしていない理由を私は理解していない@Giuseppeが、公式SPLインタプリタはM、C、D、X、Lをサポートし、IおよびV.
NieDzejkob

10

不要な単語を削除する

これを見てください(読みやすくするために改行と空白を挿入します):

Puck:You is a big big cat!
     Open your heart!
Ajax:Be you worse than I?
     If so, let us return to Scene V!
     If not, you is a cat.
     You is the sum of I and the sum of a cat and you
     Speak thy mind!
     [Exeunt]

ええ、かなりゴルフに見えますか?以下は、さらにわかりにくい形式です。

Puck:You big big cat!
     Open heart!
Ajax:Be you worse I?
     If so, let us Scene V!
     If not, you cat.
     You is the sum of I the sum of a cat you
     Speak mind!

参考までに、コードから簡単に削除できる単語のリストを次に示します。

  • あなたの心を話す -> あなたの話す
  • 心を開く -> 心を開く *
  • あなたの心に耳を傾ける -> あなたに耳を傾ける
  • 心を開く -> 心を開く *
  • あなたは猫です -> あなたの猫 *
    • などの定数にのみ適用されbig catます。それ以外の場合は、「is」が必要です
  • ->に戻りましょう
  • YよりX [op]ですか? -> X [op] Yになりますか?
  • あなたはXとYの[op]です -> あなたはX Yの[op]です
  • [Exeunt] ->(完全に削除)

伝説:

  • XそしてY、のような定数catIまたはyou
  • [op]以下のような操作はnicerthe sum of
  • *は、句読点が劇の最後の文である場合、句読点を削除できることを意味します

他に出くわした場合は、リストに追加します。

追加の参照用に、プログラムを開始するための最も短いヘッダーを次に示します。

,.Ajax,.Puck,.Act I:.Scene I:.[Enter Ajax and Puck]

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

必要に応じて、PageとFordを追加の文字として追加します。


1
さらに多くのキャラクターが必要な場合は、ここに
-NieDzejkob

:| ダウンストライピング
ASCIIのみ

6

短い言葉を使う

だからここにある:

  • 式などを除いて、orのa代わりに使用します。これらはで機能しないためです。anthethe sum ofa
  • 使用ambeまたはis代わりのareart
  • またはのI代わりに使用します。memyself
  • 使用するyou代わりにtheethouthyselfまたはyourself
  • big形容詞に使用します。
  • cat正数に使用します。
  • pig負の数に使用します。
  • zeroゼロに使用します。
  • (またはの代わりに)使用worseします。A < Bsmallerpunier
  • 使用nicerのためにA > B(代わりにbetterbiggerfresherfriendlierまたはjollier)。
  • キャラクター名:
    • 4文字:Ajax、Ford、Page、Puck
    • 5文字:エゲウス、ヘレン、ジュリア、ルシオ、モプサ、パリ、ピンチ、プリアム、リーガン、ロビン、ロミオ、ティモン、タイタス​​、ヴィーナス、ヴィオラ
    • 6文字:アドニス、エーゲオン、アロンソ、アンジェロ、アーサー、バンコ、ビアンカ、ブルータス、キケロ、ドーカス、ダンカン、エミリア、フェントン、ハムレット、ヘカテ、ヘクター、ヘレナ、ハーミア、イモージェン、ジュリエット、レノックス、オベロン、オリビア、オルシーノ、Portia、Thaisa、Thurio、Tybalt
    • 7文字:アドリアナ、アエミリア、アグリッパ、アントニオ、キャピュレット、カシウス、クラウディオ、ディオニーザ、エスカルス、ゴネリル、ホレイショ、レオナト、ルシアナ、マクベス、マクダフ、マルコム、マリアナ、ミランダ、オクタビア、オフィーリア、オーランド、オセロ、パンティーノ、プロテウス、プブリウス、シャロー、シャイロック、スレンダー、ソリヌス、テセウス、チタニア、トロイラス、ユリシーズ
    • 8文字:アキレス、ベアトリス、ベネディック、ベンヴォリオ、クラウディウス、コーデリア、クレシダ、ドッグベリー、ドンジョン、ファルスタッフ、ガートルード、ハーモニー、イザベラ、ライサンダー、メルキューチオ、モンタギュー、ペリクレス、ポロニウス、ポンペイウス、プロスペロ、ロザリンド、ステファノ
    • 9文字:アガメムノン、アンティオコス、オートリカス、バルタザール、ブラバンティオ、カサンドラ、クレオパトラ、コルネリウス、デメトリウス、デスデモナ、ドナルベイン、ドンペドロ、フェルディナンド、フランシスカ、ヒッポリタ、キングジョン、リア王、リチョリダ、セバスチャン、ゴースト、バレンタイン、ヴィンチェンティオ
    • 10文字:アンドロマケ、シンバライン、フォーティンブラス、ヨハン修道士、ヘンリー王
    • 11文字:マークアントニー
    • 12文字:カイオス医師、リチャード王、キャピュレット夫人、マクベス夫人、マクダフ夫人、ヘンリー王子、エリノア女王
    • 13文字:ガントジョン、ジュリアスシーザー、レディモンタギュー、ミストレスフォード、ミストレスページ
    • 14文字:修道士ローレンス、アポセカリー
    • 15文字:クリストファースライ、オクタビウスシーザー
    • 17通の手紙:ランカスターのジョン、ミストレス公爵、ミラノ公
    • 18文字:ヴェネツィア公
    • 24文字:ウェストミンスターの修道院長
    • 28文字:カンタベリー大司教
    • 本当にもっと必要な場合は、各キャラクターのスタックの使用を検討する必要があります。

複数の単語からなる文字が(から自分の名前の後に空白を省略することができることに注意してくださいuser202729の先端)、彼らは1つの単語だけで文字に好適であるので
ジョー・キング

5

「シーンXに戻りましょう」は、話しているキャラクターが舞台裏にいる場合でも使用できます。代わりに:

Puck:Am I as fat as the sum of a big big big big big big cat and a cat?
Ajax:If not,let us return to scene III.
[Exit Puck]
[Enter Page]
Ajax:You is a big big big big big big cat.

できるよ:

Puck:Am I as fat as the sum of a big big big big big big cat and a cat?
[Exit Puck]
[Enter Page]
Ajax:If not,let us return to scene III.You is a big big big big big big cat.

5

余分なスペースを削除する

些細なもの(2つの隣接するスペース、句読点に隣接する、改行に隣接する、末尾)を除き(いくつかの例外を除き)、次のトークンの後のスペースを削除できます。

  • the sum of
  • let us
  • the ghostこのように)(しかし、このキャラクターをとにかく使用する人)
  • if soそしてif not(削除,この後、および任意のスペースを追加する必要はありません例:。 if solet usact I
  • listen toこのようにlisten tothy動作します
  • 基本的に、複数ワードのトークン

注:これはPerlインタープリターでは機能しません。これはおそらく、Flexの解析動作によって引き起こされる意図しない効果にすぎません。「言語の標準は、」そのことについては明らかではありません。


戻って私の答えのいくつかを編集する時間です...とてもいい発見です!
ジョーキング

それはトークナイザーのバグですか、またはその動作は言語で定義されていますか?
クール

2
@Cœurアップデートを参照してください。
user202729

5

条件付きで人を切り替える必要はありません。

例えば、

Ajax:Is you better than the sum of a fat fat fat fat cat and a fat cat?
Puck:If so,let us return to Scene I.

より長い

Ajax:Is you better than the sum of a fat fat fat fat cat and a fat cat?If so,let us return to Scene I.

1
フープ。修正。
オリバーNi

4

減算する代わりに、定数を追加します

You is the difference between I and a big cat.

より長い

You is the sum of I and a big pig.

4

ジャンプを短くすることができます

return toシーンが先であっても使用でき、その逆も可能です。実際、インタプリタは完全に省略しても気にしません。つまり、これら3つのステートメントは100%同等です。

Let us proceed to Scene X.
Let us return to Scene X.
Let us Scene X.

Jo King(codegolf.stackexchange.com/a/164394/76162)は、「Let us Scene X」で十分であることを発見しました。
エドウィン

@EdWynn知っておくと良い。これを含めるように答えを書き直しました。
-NieDzejkob


4

1つのシーンのみを使用する

通常、行為の最初のシーンは常に[Enter Ajax and Puck]最初のものであるため、行為の最初のシーンを再利用することはできません。ただし、[Exeunt]プレイの最初のシーンを再利用できるように、これを前に付けることができます。[Exeunt]は、新しいシーンを宣言するよりも1バイト短く、Actにジャンプすることは、シーンにジャンプするより2バイト短くなります。

例:簡単な猫プログラム

,.Ajax,.Page,.Act I:.Scene I:.[Enter Page and Ajax]Scene V:.Ajax:Open mind!Speak thy!Let usScene V!

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

に:

,.Ajax,.Page,.Act I:.Scene I:.[Exeunt][Enter Page and Ajax]Ajax:Open mind!Speak thy!Let usAct I!

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


3

短い単語を使用する

例:

Thyおよびthyselfは、yourおよびより短いyourself

Isはより短いですare

もっと...


3

スマート条件を使用する

たとえば、使用しないでください

Ajax:Are you as good as or better than me?If so,let us return to Scene I.

むしろ、

Ajax:Are you worse than me?If not,let us return to Scene I.

3

If (so|not) 比較の直後に従う必要はありません。

Am I as big as you?You big big big big big cat.If so, you is the sum of you and a big big cat.

4
実際、比較の結果はフラグとして保存され、シーンのトランジションまたは数If so秒にわたって繰り返し使用できます。これは、比較の繰り返しを避けるのに役立ちます!
ジョーキング

2

定数を使用して大きな数を格納する

たとえば、あなたが持っている場合

Ajax:You is a fat fat fat fat fat fat fat fat fat fat cat!
Puck:You is the sum of thyself and a fat fat fat fat fat fat fat fat fat fat cat
Ajax:You is the sum of the difference of me and thyself and a fat fat fat fat fat fat fat fat fat fat cat!

一番上に別の人を宣言するだけです

Ford,a fat fat fat fat fat fat fat fat fat fat cat.

コードを

Ajax:You is Ford.
Puck:You is the sum of thyself and Ford.
Ajax:You is the sum of the difference of me and thyself and Ford.

8
公式インタープリターは、そのような定数の宣言をサポートしていません。
NieDzejkob

2

使用できるコマンドはGotosだけではありません If (so|not)

Am I as big as you?If so,you is the sum of you and a big big cat.If not,you is the sum of you and twice I.

2

すべての改行は無視されます

,.Ajax,.Puck,.Page,.Act:.Scene:.[Enter Ajax and Puck]Ajax:You Puck.[Exeunt]

2

使用<または>の代わりに、==

すべての状況に適用できるわけではありませんが、かなり短いです:

パック== Ajax

Puck:Is I as bad as you?

パック<AjaxまたはPuck> Ajax

Puck:Is I worse you?
Puck:Is I nicer you?

両方とも4バイト短い!


2

エンディング.やを必要としません!

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

これはの前にも使用でき[ます。(jimmy23013に感謝)

,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:You cat[Exeunt]

例:

  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:You cat
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Open mind[Exeunt]

動作しません:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](直後Scene {number}:)(ただし、これが機能するのに、理由はわかりません)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (およびより短いバリアント)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (およびより短いバリアント)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(唯一の空の後RecallRecall xまたはRecall@その他作品)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(なしmind

このようなあなたはすでに単語を削除したいくつかの状況で仕事にしませんSpeak thyLet us Scene I
ジョー・キング

2

「2回」と分配プロパティを使用する

の代わりに:

You is the sum of a big big big big cat a big big big cat.

つかいます:

You is twice twice twice the sum of a big cat a cat.

twice2回の使用bigは8バイト(スペースを含む)でtwiceあり、6バイトしかないため、これは2バイトを節約します。

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