拡張ウェクスラー形式を解読する


18

この課題は、user48538によるサンドボックス投稿に基づいています。彼はもうこのサイトで活動していないので、私はこの挑戦を引き継ぎました。


apgsearch、ライフゲームのための分散スープ検索プログラムおよび検索結果のデータベース、Catagolueの使用apgcodesパターンを分類して示すために。apgcode自体は、1992年にAllan Wechslerによって開発されたパターン表記の拡張である拡張Wechsler形式を使用します

以下の例と画像はLifeWikiから取られています

  1. 正規表現に一致するセット内のn文字の文字列は[0-9a-v]n列幅の5行のストリップを示します。各文字はビット列に対応する垂直列内の5つのセルを表し、[ 000001000001000... 00010100100101011010... 11111]。

    たとえば27deee6重量級の宇宙船に対応します:

27deee6

[01100001101111011111100111100000000]
  1. 文字zは、連続する5行のストリップを分離します。

    たとえば0ca178b96z69d1d96、31ビットの静物に対応します。

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

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

[000110110001010101010010001011001110000000000011111000100000100101010100011011000000000000]
  1. 文字wおよびxは、それぞれ00およびを短縮するために使用され000ます。

    だから、w33z8kqrqk8zzzx33に対応トランス女王蜂シャトル

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

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

(10の空白行が省略されました)

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

[0011000001100000000000000000000000000010000011100010001010111010111110000000000000000000000000000000000000000000000000000000000000000000000000011000001100000000000000000000000]
  1. 最後に、正規表現に一致するシンボルは、4〜39のy[0-9a-z]連続した0sの実行に対応します。

    良い例は31a08zy0123cko四重極の船に対応しています

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

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

[1100000000101000000000000000000010100000000000000000001010000000011000000000011000000001010000000011]

チャレンジ

上記で定義された拡張Wechsler形式の文字列を解析するプログラムまたは関数を作成し、この文字列に対応するパターンを出力(または返す)します。

文字列は空ではなく、で始まったり終わらないと仮定できzます。

文字列、行列、2次元配列など、妥当な出力形式を使用できます。答えで宣言する01、とを表すために任意の2つの値を使用できます。

出力で末尾のゼロ行を省略したり、末尾のゼロ行を追加したりできます。出力ですべての行の長さが同じである限り、各行の末尾のゼロを追加または削除することもできます。

より便利な場合は、配列の転置を返すことができます。

これはなので、最短のコードが優先されます。

テストケース

153 => [[1, 1, 1], [0, 0, 1], [0, 1, 0], [0, 0, 0], [0, 0, 0]]
27deee6 => [[0, 1, 1, 0, 0, 0, 0], [1, 1, 0, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0]]
0ca178b96z69d1d96 => [[0, 0, 0, 1, 1, 0, 1, 1, 0], [0, 0, 1, 0, 1, 0, 1, 0, 1], [0, 1, 0, 0, 1, 0, 0, 0, 1], [0, 1, 1, 0, 0, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0, 1, 0, 0], [1, 0, 1, 0, 1, 0, 1, 0, 0], [0, 1, 1, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]
w33z8kqrqk8zzzx33 => [[0, 0, 1, 1, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 1, 1, 1, 0, 0], [0, 1, 0, 0, 0, 1, 0], [1, 0, 1, 1, 1, 0, 1], [0, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
31a08zy0123cko => [[1, 1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1]]
o5995ozes88sezw33 => [[0, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 1, 0], [1, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 1], [1, 1, 0, 0, 1, 1], [1, 1, 1, 1, 1, 1], [0, 1, 0, 0, 1, 0], [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
y3343x6bacy6cab6x343zkk8yy8kkzgo8gywg8ogz0123yw321zzgo4syws4ogzgh1yy1hgz221yy122zy3c2cx6d53y635d6xc2c => [[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1], [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0], [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1], [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

ウィルzこれまで非常に最初に起こりますか?
氏Xcoder

@ Mr.Xcoder LifeWikiページはそれについて何も言っていません。ただし、ここでは、文字列がで始まったり終わったりしないと仮定できますz
-alephalpha

3
実際にはゲームオブライフのパターンではなく、ただの楽しみのために:vv99f60vv99f60uv11320uv19rqz33y133y11322310132231
アーナウルド

1
「配列の転置を返すことができます」-それでいいなら、逆さまなどの他の対称性はどうでしょうか?
ジョナサンアラン

1
:最初の3つの答えの二つは、これらのいくつかのために失敗し1yx11yy11yw11yz1。たぶんそれらはテストであるべきです。
ジョナサンアラン

回答:


2

、50バイト

UB0≔⁺⭆χιββFS¿υ×0⁺⊟υ⌕βι≡ιz×⸿⁵y⊞υ⁴x×0³w¦00«P↓⮌⍘⌕βι²→

オンラインでお試しください!リンクは、コードの詳細バージョンです。とを使用10ます。説明:

UB0

背景、つまり出力を囲む長方形の印刷されていないセルをに設定し0ます。

≔⁺⭆χιββ

定義済みの小文字アルファベットの前に数字を付けます。

FS

入力文字列をループします。

¿υ

定義済みの空のリストが空でない場合...

×0⁺⊟υ⌕βι

...次に0、リストからポップされた数字と数字と文字の現在の文字のインデックスの合計で指定されたの数を出力します。その番号が常に何であるかについては、以下を参照してください。

≡ι

現在のキャラクターを切り替えます。

z×⸿⁵

それはだ場合はz、次の出力ストリップに私たちを取って、その後、出力5キャリッジリターン。

y⊞υ⁴

aの場合、事前定義された空のリストにyプッシュ4して、4+n 0次回にsが出力されるようにします。

x×0³

それがx3 0秒を出力する場合。(これは、リテラルが次のリテラルに0触れないようにするために繰り返し行われxます。)

w¦00

aの場合、w2 0秒を出力します。(¦2つの文字列リテラルを分離するために必要です。)

«P↓⮌⍘⌕βι²→

それ以外の場合は、数字と文字の現在の文字にインデックスを付け、バイナリに変換し、結果を最下位ビットから順に出力します。次にカーソルを右に移動して次の列に移動します。


6

JavaScript(ES8)、197バイト

入力を文字列として受け取ります。「#」とスペースを含む文字列の配列を返します。出力には、各行に余分な(ただし一貫性のある)末尾スペースが含まれる場合があります。

s=>[x='x',...s.replace(/w|x|y./g,s=>''.padEnd(s<x?2:s>x?P(s[1],36)+4:3),P=parseInt)].map(c=>[!++w,1,2,3,4].map(i=>c<x?o[y+i-5]+=' #'[P(c,36)>>i&1]:o=[...++y&&o,'']),w=y=o=[])&&o.map(r=>r.padEnd(w))

オンラインでお試しください!(きれいな出力)

どうやって?

グローバル変数

  • 文字"x"は数回使用されるため、変数xに格納する価値があります。
  • この関数parseIntは2回使用されるため、変数Pに格納する価値があります。
  • yは行インデックスで、0に初期化されます
  • wは、最終出力の埋め込みに使用される幅の上限を追跡します。
  • o []は出力配列で、最初は空です。

繰り返されるゼロの前処理

私たちは、最初にすべてのパターンを置き換え"w""x"および"yX"スペースの適切な数の入力文字列インチ これらのスペースは後でと解釈され"0"ます。

s.replace(
  /w|x|y./g,
  s => ''.padEnd(
    // w --> 2
    s < x ? 2 :
    // yX --> value of X + 4
    s > x ? P(s[1], 36) + 4 :
    // x --> 3
    3
  )
)

デコード

結果の文字列を分割し、イニシャル"x"を先頭に追加し、各文字cで 5回(i = 0から4で)繰り返します

  • 場合cがより低い"x"、我々は次の5行に対応するパターンを追加します。

    o[y + i - 5] += ' #'[P(c, 36) >> i & 1]
  • cが以上の場合"x"o []に 5つの新しい空の文字列を割り当て、y5を追加します。これは、文字列の先頭に追加されたイニシャル、または元のコンテンツのいずれかによってトリガーされます。"x""z"

    o = [...++y && o, '']

パディング

最後に、すべての文字がw文字になるように、o []の各文字列にスペースを埋め込みます。

o.map(r => r.padEnd(w))

6

05AB1E148の 132 98バイト

私は高校生で、ゴルフと05AB1Eの使用の両方が初めてでしたので、コメントを歓迎します!

„YY¾38×:'Yð:žLRDUsð«#εNĀiDнXsk4+s¦sú]'W¾2×:'X¾3×:J'Z¶:.Bð¾:vNUyvDykDNX‚Š32VY‹iY+b¦RX_i¶ì}‚ˆ]¯{€¦˜J

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

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

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

入力を大文字として受け取り、転置行列を1と0の複数の出力行として出力します。余分なゼロを追加する場合があります。

小文字の文字列でテストする場合uは、TIOヘッダーを追加します。

きれいに印刷した出力が必要な場合'1'█:'0'.:は、TIOフッターを追加します。

説明

(転置行列を生成するため、予想されるものとは反対の「行」と「列」を呼び出しています)

基本的なアルゴリズムは次のとおりです。

  1. 「yy」を38の0に置き換えます
  2. 「y」で分割し、0ランを展開します。
  3. 「w」と「x」を置き換えます
  4. 最も長い列(つまり、z間の最も長い文字列)を計算し、他のすべての列がその長さになるようにパディングします。(これは、以下のアルゴリズムの仕組みのために必要です)
  5. zで分割
  6. この時点で、入力文字列は列の配列で、各列は[0-9A-V]の文字列です。各列は同じ長さです。
  7. 出力形式に変換するアルゴリズムは
    1. ルックアップ文字列でindexOfを使用して、文字を数字に変換します
    2. 文字をバイナリに変換し、長さ5にパディングします
    3. 最初の列の場合、2進数の前に改行を追加します
    4. 行の文字列を格納するバイナリ文字列の先頭にプレフィックスを追加します。
    5. プレフィックス付きのバイナリ文字列を05AB1Eの「グローバル配列」レジスタ/変数にプッシュします
  8. グローバル配列をソートします。並べ替え順序を決定するプレフィックス文字列は、すべてが正しい順序になり、改行が正しい場所にあることを確認します。
  9. グローバル配列の各要素からプレフィックス文字列を削除します
  10. 配列を「」で結合して印刷します。

以下に展開されたコードで見ることができる他のいくつかの小さな詳細があります。行末のタブ以降はすべてコメントであり、無視できます。(このコメントスキームは、ちなみに05AB1Eの一部ではありません。見栄えが良かったのでこの方法で行いました。) "@"で始まるコメントがある行はデバッグ用であり、最終出力を変更せずに省略できます。

„YY¾38×:                                        Replace "YY" with 38 0's. (y is the 34th character in the index, so need to add 34+4 = 38). ¾ is initialized to zero, which saves one byte from typing '038
'Yð:                                            Replace "Y" with " "                                
"Replaced input Stage1 = "?D,                   @DEBUG

žLR                                             Pushes [0-9A-Za-z]
DU                                              Set X to [0-9A-Za-z] and leave [0-9A-Za-z] on the stack.
s                                               Swap top two elements. Now the stack is [0-9A-Za-z],input

ð«                                              Append a space so the below splitter works even if there are no other spaces.
#                                               Split input on " ", which "Y" has been replaced with
ε                                               Map. This map replaces the y runs
    "Element = "?D,                             @DEBUG
    "N = "?N,                                   @DEBUG
    NĀi                                         If N != 0   
        "Replacing!",                           @DEBUG
        Dн                                      Get the first letter
        X                                       Push X
        s                                       Swap
        k                                       X (which is [0-9A-Za-z]) .indexOf(firstLetter)
        "indexOf run token = "?D,               @DEBUG
        4+                                      Add 4 to the index, now becoming the number of zeros to add
        s                                       Swap. Now top is the string between runs
        ¦                                       Remove the first character
        s                                       Swap again. Now the top is the number of zeros to add.
        ú                                       Add that many spaces (will be replaced with zeros later) to the start of the element.
        "Element Replaced = "?D,                @DEBUG
]
'W¾2×:                                          Need to do this replacement after the Y replacement so stuff like YW gets parsed properly. Again, ¾ is zero.
'X¾3×:
J                                               Join with ""
"Replaced input Stage2 = "?D,                   @DEBUG
'Z¶:                                            Replace "Z" with "¶".
.B                                              "Squarify" command. Splits on \n and appends spaces to the end of each element so each is the same length. In this case, that is equivalent to adding zeros to the end of each column, which is what we want.
ð¾:                                             Replace spaces (which we used for padding above) with zeros.
"Replaced input Stage3 = "?D,                   @DEBUG
"0 Stack top = "?D,                             @SDEBUG
"0 Stack top-1 = "?sD,s                         @SDEBUG
v                                               pop and loop over top element, which is array of column code
    NU                                          Store the column number in X
    yv                                          Loop over each character in the column              
        "1 Stack top = "?D,                     @SDEBUG
        "1 Stack top = "?D,                     @SDEBUG
        D                                       Duplicate top element (which is now [0-9A-Za-z])
        y                                       Push y (special loop variable)
        "Character = "?D,                       @DEBUG
        k                                       Push indexOf y in [0-9A-Za-z]
        "Index = "?D,                           @DEBUG
        "2.1 Stack top = "?D,                   @SDEBUG
        "2.1 Stack top-1 = "?sD,s               @SDEBUG
        D                                       Duplicate index.
        NX‚                                     Push [rowNumber,columnNumber]. This result is used for sorting.
        Š                                       Triple swap. The top of the stack is now sortPrefix, index, index
        32V                                     Set Y to 32
        Y‹i                                     index < 32. This uses up one copy of index
            Y+                                  Add 32 to the index
            b                                   Push the index in binary. This uses the second copy of index. 
            ¦                                   Remove the first character, which will be a 1 because we added 32. The result is now a padded binary string of length 5
            "Binary = "?D,                      @SDEBUG
            R                                   Reverse the binary string. This gives the proper transposed output. 
            X_i                                 This will only run if X (which is set to the column number) == 0. (Runs !X)
                ¶ì                              Stick a linebreak at the beginning of the binary string
            }
            "2.5 Stack top = "?D,               @SDEBUG
            "2.5 Stack top-1 = "?sD,s           @SDEBUG         
            ‚                                   At this point the top of the stack is sortPrefix,binaryString. This will combine the two into a list.
            "Pushing '"?D?"'",                  @DEBUG
            ˆ                                   Push [[rowNumber,columnNumber],binaryString] to global array
            "2.6 Stack top = "?D,               @SDEBUG
            "2.6 Stack top-1 = "?sD,s           @SDEBUG
        ]                                       Close all blocks
¯                                               Push global array

{                                               Sort global array. 
"Sorted Data = "?D,                             @DEBUG
€¦                                              Remove the sort prefix              
˜                                               Flatten. Before doing this, the array is in the format [[<binary string>],[<binary string>],[<binary string>],...]
J                                               Join with ""
'1'█:'0'.:                                      @DEBUG pretty print 

1
こんにちは、PPCGへようこそ。とても素敵な最初の投稿!あなたのバイト数に関して:あなたは正しい。TIOは、05AB1Eコードページを使用して、148文字が148バイトで表されることを手軽に表示します。
ジョナサンフレッチ

1つの小さなメモ:ほとんどのゴルフ言語は暗黙的な印刷を実装しています。最後を省略できると思います,
ジョナサンフレッチ

私はそれを見て、いくつかの改善を行いました。行または列が1000を超えるものの場合、動作は(理論的に)異なります。この時点で、小さなプログラムは予期しないことを行います。
kerwizzy

始めるのが最も簡単な挑戦ではありません!良い仕事です。05AB1Eの頑固な人が来ると便利なポインタを与えると思います。
ジョナサンアラン

1
PPCGと05AB1Eの世界へようこそ。私はゴルフのプロはまだどちらかが、ここではいくつかの小さなもののことあまりないですので、私は今、その多くの時間を持っていない、と私はほんの数ヶ月前05AB1Eの使用を開始しました:"yy"可能„yy(05AB1Eが持っています2文字と3文字の両方の文字列が組み込まれています)。>≠することができますĀ(真実化され、基本的に0残り0、他はすべてになります1)。}}可能](すべてのループとif-elsesを閉じる)。一部のプロ05AB1Eゴルファーは、私よりも実質的なものをゴルフできると確信しています。
ケビンCruijssen

4

APL(Dyalog Unicode)87 80 77 67 63バイト

7バイトを保存してくれたH.PWizと、別の13バイトのためにngnに感謝します17。

a←⎕D,⎕A⋄,⍉↓⊖(5/2)⊤↑35(≠⊆⊢)a'Y.|W|X'R{'0'/⍨30 36|a2↑⍵.Match}⍞

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

NB:入力を大文字の文字列として受け取ります。

きれいに印刷された出力

説明

a←⎕D,⎕A文字列で'0123...89ABCD...XYZ'
'Y.|W|X'⎕R{'0'/⍨+/30 36|a⍳2↑⍵.Match}の対応する数とXWとのYxを置き換え'0'S(詳細後述) 35(≠⊆⊢)a⍳にindeciesのベクターに文字列を変換aし、上の分割35(すなわち)'Z'ネストされたベクターの作成
とマトリックスパディング端に入れ子にされたベクトルを変換し0、sは
(5/2)⊤それぞれ変換します主軸に沿ったバイナリーベクターを用いて3次元マトリックスを生じるバイナリーベクターに数
主軸に沿って反転は
、それが2次元であるので、行列の階数を低減する
,⍉適切な出力する整形結果

'Y.|W|X'R{'0'/⍨30 36|a2↑⍵.Match}
'Y.|W|X'R                          Regular expression replace. mathing the string.
                        2↑⍵.Match   Takes matching string (either 'X' 'W' or 'Y.') and pads with spaces to length 2
                      a            Returns the indecies of each charactor in a. on the spaces this is 36 (length of a)
                30 36|              Takes the remainders of the indecies when divided by 30 and 36 respectively. Overall 'W' -> 'W ' -> 32 36 -> 2 0, 'Y2' -> 'Y2' -> 34 2 -> 4 2.
           '0'/⍨                    Make vector of repeating '0's with length equal to the sum of the result. '0'/⍨4 2  '000000'

7バイトの節約を次に示しますa←⎕D,⎕A⋄,↓↑{⊖(5/2)⊤a⍳⍵}¨'Z'(≠⊆⊢)('Y.|W|X'⎕R{'0'/⍨{0::2+'WX'⍳⍵⋄4+a⍳1⊃⍵}⍵.Match})⍞。エラーキャッチもあまりゴルフっぽくないようです
H.PWiz

ありがとう@ H.PWiz。ええ、エラーキャッチも好きではありませんが、そうでない場合は、2つの正規表現置換を使用していました。
jslip

@jslipカッコ⎕Rとそのオペランドは不要です
-ngn

2+'WX'⍳⍵->2+'X'=⍵
ngn

{0::2+'X'=⍵⋄4+a⍳1⊃⍵}⍵.Match->30 36|a⍳2↑⍵.Match
ngn

3

Perl 6156 142バイト

Jo Kingのおかげで14バイト節約されました。(また、構文解析に関する小さなバグを修正しy、プリティファイアを追加しました。)

のバグのある解析を修正しましたy[wxy]

{s:g/y(.)/000{0 x:36(~$0)}/;s:g/x/w0/;s:g/w/00/;s/$/z/;map {
.flatmap:{:32($_).fmt("%05b").flip.comb}},[Z] .split("z").map: (*~0 x.chars).comb}

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

改行は、画面にテキストを合わせるためだけにあります。プログラムの一部ではありません。

仕組み

変更可能な文字列を受け取る匿名関数です。(これにより、リテラルではなく変数のみを指定できるため、関数の使用が少し奇妙になります。)いくつかの作業の後、元の投稿と同じ意味で、0と1を含むリストのリストを返します。

入力文字列は変数に入ります$_。まず、一連の置換ステートメントを使用して、さまざまな数のゼロのすべての略記を取り除きます。まず、またはyの場合、(または)はそれ自体では省略形を構成しないため、を整理する必要があります。(および記憶している1つの文字)を検索して置き換えます。3つのゼロをそのままコピーし、次の文字を36から10に変換し()、さらに多くのゼロを追加します。その後、我々は交換するのは、使用して、そして「sが使用して。最後に、で、を追加しますyxywwxy(.)y000{"0"x:36(~$0)}:36(~$0)ws:g/w/00/xs:g/x/000/s/$/z/z最後に、空の行を一番下に追加します。(理由は後で確認します。)

残りの部分は、大きなマップステートメントです。をマッピングします。.split("z").map: (*~0 x.chars).comb})これは、入力文字列(ゼロショートハンドなし)で行に分割されz、各行は最初に0 x.chars(ゼロのトン、つまり入力文字列の長さと同じ数)でパディングされます。次に、個々の文字のリストに分割されます(.comb)。最後に、[Z](zipで縮小)で転置します。最短リストがなくなるとすぐに圧縮が終了し、すべての行が同じ長さになります。(右側の無用な後続ゼロの数は、最短行の長さと等しくなります。また、この転置トリックは、1行のみの「マトリックス」では失敗します。そのため、前に強制的に別の行を追加しました。)

ここで、行(元の行列の列)をマップし、検出された各文字を対応する5ビットに置き換えます。これは、:32($_)(ベース32からベース10).fmt("%05b")(幅5のビット.flip文字列としてフォーマットされ、ゼロが埋め込まれます)(LSBが最下部ではなく最上行にあるため、文字列を逆にします).comb(文字列を以下のリストに分割します)文字)。.flatmap結果のリストを平坦化するを使用しました(それ以外の場合、各列にリストのリストを取得します)。次に、結果の転置が暗黙的に返されます。

(末尾の0の可能性を酷く乱用したため、少し気分が悪くなりました。しかし、バイト数がかなり減りました:-)。)



@JoKing —そうそう、どうもありがとう!
ラミリーズ

失敗したため1yx11yw1
ジョナサン・アラン

@ジョナサンアラン、あなたは正しい、ありがとう。すぐに修正します。(最初は何らかの理由でしかないy[0-9a-v]と考えていましたが、そうではないことがわかったときは、簡単な(そして間違った)修正を追加しました。)
Ramillies

000yの置換を置き換えることができますx
ジョーキング


2

網膜、203バイト

y(.)
#$1
{`#
0#
#0
000
)T`dl`_dl`#.
w
000
x
00
z
¶
%(`.+
$&¶$&¶$&¶$&¶$&
T`g-v`#`.+$
T`dl` `.+$
T`g-v`dl
T`89l`#`.+¶.+$
T`d` `.+¶.+$
T`89l`d
T`d`    #`.+¶.+¶.+$
T`4-7`d
T`d`  #`.+¶.+¶.+¶.+$
)T`d` # #
P`.+

オンラインでお試しください!リンクにはテストケースが含まれます。代替ソリューション、203バイト:

y(.)
#$1
{`#
0#
#0
000
)T`dl`_dl`#.
w
000
x
00
z
¶
%(`.+
$&¶$&
T`g-v`#`¶.+
T`dl` `¶.+
T`g-v`dl
^.+
$&¶$&
T`89l`#`¶.+
T`d` `¶.+
T`89l`d
^.+
$&¶$&
T`d`    #`¶.+
T`4-7`d
^.+
$&¶$&
T`d`  #`¶.+
)T`d` # #
P`.+

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

y(.)
#$1

まず、yコマンドの厄介なケースを処理します。悲しいことに、この後の手紙はa yまたはa zでさえ許されるので、ここで注意する必要があります。すべての魔法yは最初にに変換され#ます。

{`#
0#
#0
000
)T`dl`_dl`#.

次に、ループが#sを処理します。最初に、0がに付加されます#。これがされている場合は#0、その後に変更された000操作を完了しており、それ以外の場合は後の文字が#デクリメントされ、すべてのまでのループを繰り返す#のは、処理されています。

w
000
x
00

wsとxsを修正します。

z
¶

新しい行で分割します。(S`z同じバイト数でも機能します。)

%(`.+
$&¶$&¶$&¶$&¶$&
T`g-v`#`.+$
T`dl` `.+$
T`g-v`dl
T`89l`#`.+¶.+$
T`d` `.+¶.+$
T`89l`d
T`d`    #`.+¶.+¶.+$
T`4-7`d
T`d`  #`.+¶.+¶.+¶.+$
)T`d` # #

各行のコピーを5つ作成し、適切なビットの文字をマッピングして#そのビットをクリアすることでバイナリ変換を実行します。他の文字はスペースになります。ビットは16、8、4、2の順序で処理され、最後の2変換は1ビットのクリアとビットの変換を同時に処理します。(代替バージョンは各コピーを個別に作成するため、より多くのバイトがかかりますが、ビット処理が簡素化されるためこれらは保存されます。)

P`.+

すべての行を同じ長さに詰めます。


1

パイソン2249の 244バイト

def f(s,Z='0'):
 while'y'in s:i=s.find('y');s=s[:i]+4*Z+Z*int(s[i+1],36)+s[i+2:]
 t=s.replace('w',2*Z).replace('x',3*Z).split('z');return map(''.join,zip(*[[(Z*5+bin(int(c,32))[2:])[:-6:-1]for c in r]+[Z*5]*(max(map(len,t))-len(r))for r in t]))

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

Jonathan Frechによって5バイトが保存されました。


に余分なスペースがありwhile 'y'inます。下付き文字[-5:][::-1]はにゴルフできると思います[:-6:-1]。returnステートメントは前の行に置くことができます。
ジョナサンフレッチ

1

JavaScript(ES8)、192バイト

s=>[...s,"z"].map(c=>{h=parseInt(c,36);k="wxy".search(c)+1;y?k=h-y--:h-35?y=h>33:m=m.map(P,z+=5,i=k--);for(h=k?0:h;~k--;m[i]=h.toString(2)+P(m[i++]||""));},P=d=>d.padStart(z,0),m=[i=z=y=0])&&m

転置...を返します。これは垂直軸に反映されます。それがこのエントリを無効にするかどうかを教えてください。出力は、次を含む文字列の配列です 0 sおよび1s。

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

説明

各文字についてck+1変更する行の数を評価します。 k = "wxy".search(c) + 1;searchメソッドはインデックスまたはを返します-1k次に-1、チェックすることにより到達するまでデクリメントされます~k--、真理値をします。

現在の文字が「y」の場合、次の文字のbase-36値-1がの値になるようにフラグを設定しkます。

「z」に遭遇したら、文字列を左側に埋め込み、埋め込み量を5で増やし、配列インデックスをにリセットし0ます。

s =>
    [...s, "z"].map(c => {                  // append a "z" to ensure final output is properly padded
        h = parseInt(c, 36);
        k = "wxy".search(c) + 1;            // note that "y" -> 4 zeroes
        y                                   // if previous char is "y"...
            ? k = h - y--                   //      decrement y after subtracting y=1 since k is decremented to -1 and the previous y already pushed 4 zeroes
        : h - 35                            // else if current char is not "z"...
            ? y = h > 33                    //      set y if current char = "y"
        : m = m.map(P, z += 5, i = k--);    // else if current char is "z", pad
        for (
            h = k ? 0 : h;                  // if k is truthy, push zeroes
            ~k--;
            m[i] = h.toString(2)            // convert to boolean representation
                + P(m[i++] || "")           // prepend to row or to a newly padded row
        );
    },
        P = d => d.padStart(z, 0),
        m = [i = z = y = 0]                 // the logical OR 4 lines above replaces this value with ""
    ) &&
    m

入力の転置を返さないほうが理にかなっていると思います。
mbomb007

1

Haskell、399バイト

splitパッケージをインストールします。cabal install split

import Data.Char
import Data.List.Split
import Data.List
p=map
r=replicate
a c|47<c&&c<58=c-48|96<c&&c<123=c-87
o=a.ord
m l n|l==0=[]|True=(mod n 2):m(l-1)(div n 2)
t a=p(\l->l++r((maximum$p length a)-length l)'0')a
y s|length s==0=""|h=='y'=(r(4+(o$s!!1))'0')++y(drop 2 s)|h=='w'="00"++y t|h=='x'="000"++y t|True=h:y t where h=head s;t=tail s
w=(p concat).transpose.(p$p$(m 5).o).t.(splitOn "z").y
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.