網膜、530 220 210 202 201 193 191 187 185(184)バイト
3バイトの節約に対するrandomraへのクレジット!(そして、さらに2、3の道を開きます。)
+`\.(\d)(.+)( .+)
$1.$2_$3_
\b
#
+`(\d*)#((((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|\w)
$1$1$1$1$1$1$1$1$1$1$3$4$5$6$7$8$9$10$11#
\d
11
(?=(1*)\1)[^.]
$1
^(1+)\.\1{90000}1+
Retina!
1.+
Trash!
バイトカウントの目的で、各行は個別のファイルに入りますが、-s
フラグを使用してRetinaを呼び出すことにより、単一のファイルから上記のコードをそのまま実行できます。
これは、最初に密度を期待し(末尾にある場合でも小数点を含む必要があります)、次に幅と高さ、つまりd w h
。
これは少し遅いです。与えられたテストケースのほとんどは試してみません。なぜなら、それは何年も実行されるからです。ただし、テストケースで正しく動作することを確認できます。
19. 4096 2160 -> Trash!
1. 180 240 -> Trash!
1. 181 240 -> Retina!
1. 180 241 -> Retina!
0.04 10 10 -> Retina!
基本的に、すべての数値を乗算して密度を整数にした後、幅と高さが4桁を超えないようにします。
これは遅いですが、完全に正確です...浮動小数点の問題などはありません。すべての算術演算は(単項)整数を使用しています。
原則として、もう1バイト削ることができます。これ^
は省略できますが、Trash!
過剰な量のバックトラックのためにテストケースがひどく遅くなります。
説明
まず、浮動小数点演算を回避するために不等式を再配置しましょう。
√(w2 + h2) / d > 300
√(w2 + h2) > 300 d
w2 + h2 > 90000 d2
これは乗算の下で不変であることを告知することもできw
、h
そしてd
同じ番号でx
:
w2 + h2 > 90000 d2
(x w)2 + (x h)2 > 90000 (x d)2
x2 (w2 + h2) > 90000 x2 d2
w2 + h2 > 90000 d2
単項数を2乗する方法はいくつかありますが、IDを使用します
n2 = Σi=1..2n ⌊i/2⌋
これにより、整数演算(単項で整数を表す)のみを使用して問題を解決することができます。
コードを見ていきましょう。行の各ペアは正規表現の置換です。
+`\.(\d)(.+)( .+)
$1.$2_$3_
これにより、密度の小数点が右に繰り返し移動され、幅と高さが10倍されます(x
上記)。これは、すべての数値が整数であることを確認するためです。ゼロを追加する代わりに、を追加し_
ます。これは後でゼロとして扱います。(これはゴルフのトリックです。そうでないと、...${3}0
あいまいさを避けるために書く必要があり$30
ます。)+
正規表現の前は、結果が変化しなくなるまで(パターンが一致しなくなった場合に)この置換を繰り返すようRetinaに指示します。。
\b
#
現在、単項への変換用に3つの数値を準備しています。原則として、#
各数値の前にマーカー()が必要ですが、各数値の末尾に1を追加する方が短いため、変換手順には影響しません。
+`(\d*)#((((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|\w)
$1$1$1$1$1$1$1$1$1$1$3$4$5$6$7$8$9$10$11#
これは、dan1111によって開発されたトリックを使用した、単項への変換です。基本的に、既存の数字に10を掛けながら(#
プロセスでマーカーを右に移動しながら)、各数字をそれ自体のrep-digitに変換しています。このバイナリ表現はさまざまな数字のごちゃ混ぜになりますが、合計数は元の整数の値に等しくなります。\w
最後に注意してください-通常、これは単なる0
ですが_
、ゼロとしても扱います(正規表現では単語文字と見なされます)。
\d
11
各桁を2桁に変換します1
。これにより、a)すべての桁が同じであることを確認し(後で必要になります)、b)各数値を2倍にします。
(?=(1*)\1)[^.]
$1
これは2つのことを行います。すべての数値(またはの合計を計算することで各数値の半分2n
)を2乗し、結果の幅と高さの2乗を加算します。s、マーカー、スペースに[^.]
一致することに注意してください。それがスペースの場合、先読みは何もキャプチャしません。つまり、それらすべてが単純に削除されます。つまり、幅と高さの結果が連結/追加されます。小数点は、結果とそれらを区別するために残ります。代わりにa に一致する場合、lookaheadはgroupでsの半分(切り捨て)をキャプチャすることを保証します。これにより、上記で述べた合計が計算され、元の数の2乗が得られます。1
#
#
.
d
[^.]
1
1
1
^(1+)\.\1{90000}1+
Retina!
文字列は(単項で)、次に、(単項で)です。最初の単項式の回数が2番目の単項式の回数よりも短いかどうかを知りたい。キャプチャグループと繰り返し構文を使用して、この乗算を簡単に行うことができます。その後、(ではなく)を使用して、2番目の数値が実際にはそれより大きく、単なる等しくないことを確認します。その場合、すべてをに置き換えます。d2
.
w2 + h2
90000
{n}
1+
1*
Retina!
1.+
Trash!
2番目の数値が十分でない場合、前のステップで何も変更されず、文字列はで始まり1
ます。その場合は、文字列全体を置き換えるだけでTrash!
完了です。