網膜かゴミか?


47

私たちは素晴らしい技術の時代に生きており、テレビに美しく詳細な8Kスクリーンを、そしてモバイルブラウジングの喜びのために携帯電話に2Kディスプレイさえ持つことができます。私たちは近年、スクリーン技術の面で大きな進歩を遂げました。

この製品の1つは、AppleのRetinaで人気のある用語です。これは、問題のディスプレイのピクセル密度が非常に高いことを示しており、10〜12インチ離れた視距離では、個々のピクセルを簡単に選択することはできません。

Steve Jobsは、これが発生するピクセル密度は1インチあたり300ピクセルであると述べ、広告に使用されるRetina流行語を使用して、デバイスでこの範囲のピクセル密度の使用を開始しました。

ピクセル密度は、次の式で計算できます。

D = sqrt(w ^ 2 + h ^ 2)/ d

ここdインチの画面の対角であり、w横軸上のピクセルの数であり、h縦軸の画素数です。

あなたのタスク

このタスクでは、Retina標準を使用して、購入する価値のある製品を決定します。あなたが現代の消費者であるため、デバイスを購入するときは、90年代のデバイスではなく、良い製品を手に入れたいと思います!そのように、あなたが作成したいプログラムや機能として、画面の幅、高さと対角線の長さを取る入力または関数のパラメータ、および(網膜画面として特定の画面条件を満たしているかどうかを示しますD > 300ことで)画面に印刷したり、帰国を

Retina以外のデバイスに対する軽のため、デバイスが適格である場合とそうでない場合にプログラムまたは機能が出力されます。Retina!Trash!

すべての数値が0より大きいと仮定することができます。幅と高さのピクセル値は常に整数です。画面サイズは、小数をサポートしている限り、どのように解釈されてもかまいません。入力は任意の順序で行うことができ、最大3行まで入力できます。

I / Oの例

1920 1080 4.95   -> Retina!
2560 1440 5.96   -> Retina!
1920 1080 10.5   -> Trash!
10 10 0.04       -> Retina!
4096 2160 19(.0) -> Trash!
8192 4320 100.00 -> Trash!
3000 1500 11.18  -> Retina!
180 240 1(.0)    -> Trash!

これはなので、バイト数が最も少なくなります。


スタックベースのプログラミング言語であるスタックソリューションを以下に示します。

r;`;/300>"Retina!""Trash!"?

34
誰か、網膜の答えをしてください
デジタル外傷

2
@DigitalTraumaしかし浮かぶ。
Sp3000

7
@ Sp3000 pfft、言い訳!Retinaで独自のフロート解析正規表現を構築します!
オプティマイザー

46
@ Sp3000さて、賭け金を上げましょう。私は、このコメント投稿タイムスタンプから1週間、この質問に対する最短の法的(コミュニティコンセンサス)Retina回答に対して、500 ptの大きなジューシーな賞金を平手打ちすることを約束します。
デジタル外傷

2
うーん、選択されたしきい値はAppleのマーケティングと完全には一致しません。たとえば、Retina iMacの場合:5120 2880 27
Ed Avis

回答:



115

網膜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

これは乗算の下で不変であることを告知することもできwhそして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[^.]111

^(1+)\.\1{90000}1+
Retina!

文字列は(単項で)、次に、(単項で)です。最初の単項式の回数が2番目の単項式の回数よりも短いかどうかを知りたい。キャプチャグループと繰り返し構文を使用して、この乗算を簡単に行うことができます。その後、(ではなく)を使用して、2番目の数値が実際にはそれより大きく、単なる等しくないことを確認します。その場合、すべてをに置き換えます。d2.w2 + h290000{n}1+1*Retina!

1.+
Trash!

2番目の数値が十分でない場合、前のステップで何も変更されず、文字列はで始まり1ます。その場合は、文字列全体を置き換えるだけでTrash!完了です。


24
まあ、それは起こった。今、私たちはすべて幸せに死ぬことができます。
アレックスA.

94
追記として、これはRetinaであるため、他のすべての回答はゴミになりますか?
アレックスA.

5
私たちの神が到着しました!
カデ

7
わかりました、それで私の賞金約束はまだ有効ですが、私は徹底的な説明を見たいです(概念的には、私はそれがどのように行われたか知っていますが、詳細を見たいと思います)。また、私は最短の法的Retina回答に対する賞金を授与するので、皆さん、賞金はまだ短いRetina回答に対して開かれています!
デジタル外傷

2
@AlexA。いいえ、別のRetina回答があるためです。
イスマエルミゲル

38

Python、49

lambda w,h,d:"RTertaisnha!!"[w*w+h*h<=9e4*d*d::2]

文字列インターリーブを使用します。

複雑なノルムを使用するよりも両側を正方形にする方が短いことがわかりました。

w*w+h*h<=9e4*d*d
abs(w+1j*h)<=300*d

18
Retina!またはを印刷することになっていたTrash!!@ertaisnhaをリツイートしないでください!!
オプティマイザー


2
@Mewしかしそれは反対です;)
オプティマイザー

ニース、私はまだ(AB)の使用は、1つのまたは別の文字列に印刷することを見ていない
ニック・T

15

網膜、312バイト

(\d+) (\d+) (\d+)(?:\.(\d+))?
a$1bc$2dj300ke$3fg$4h9iiiiiiiii8iiiiiiii7iiiiiii6iiiiii5iiiii4iiii3iii2ii1i0
+`(b.*)(d.*)fg(\d)
0$10$2$4fg
+`(a|c|e|j)(\d)(\d*)(i*)((?:b|d|f|k).*h.*\2(i*))
$1$3$4$4$4$4$4$4$4$4$4$4$6$5
g`(i+)
Q$1R$1
+`Q(i+)Ri
$1Q$1R
+`(j(i*).*e)i(.*f)
$1$3$2
a(i*).*c(i*).*f\1\2.*
Trash!
.*0
Retina!

これを実行するにはかなり時間がかかりますが、うまくいくようです。

おそらくもっと多くのゴルフをすることができます...

説明:

(\d+) (\d+) (\d+)(?:\.(\d+))?
a$1bc$2dj300ke$3fg$4h9iiiiiiiii8iiiiiiii7iiiiiii6iiiiii5iiiii4iiii3iii2ii1i0

タグを追加して文字列を解析しやすくし、ジャンクを追加してベース1に変換しやすくし、300を追加して後で乗算します

+`(b.*)(d.*)fg(\d)
0$10$2$4fg

追加0の幅と高さに、整数部分に対角の小数部分を付加しています。これが行われると、対角線は整数になり、幅と高さに多く10のsが必要になります。

+`(a|c|e|j)(\d)(\d*)(i*)((?:b|d|f|k).*h.*\2(i*))
$1$3$4$4$4$4$4$4$4$4$4$4$6$5

最初の手順で追加した検索テーブルを使用して、すべての数値を基数1に変換します

g`(i+)
Q$1R$1

すべての数字を二乗する準備をする

+`Q(i+)Ri
$1Q$1R

各数を二乗する

+`(j(i*).*e)i(.*f)
$1$3$2

対角線の二乗に、最初のステップで挿入した300の二乗を掛けます

a(i*).*c(i*).*f\1\2.*
Trash!

高さに追加された幅が計算したばかりの製品に収まる場合、ピクセル密度が低すぎるため、ゴミです!

.*0
Retina!

それ以外の場合は、Retinaです!



9

APL、40 36バイト

デニスのおかげで4バイト節約できました!

{(9E4×⍵*2)<+/⍺*2:'Retina!''Trash!'}

これにより、左側の最初の2つの引数と右側の3番目の引数を取る名前のないダイアディック関数が作成されます。左の値の二乗の合計が右の二乗の300 ^ 2倍より大きいかどうかをチェックします。出力はそれに応じて印刷されます。

オンラインで試すことができます


投稿する前に更新する必要があります...左側の最初の2つの引数を使用して、数バイトを保存できます。
デニス

@Dennisご協力ありがとうございます!あなたの方が良かったので、私はあなたの答えを見たときに私の答えを削除することを考えました。:P
アレックスA.

9

TI-BASIC、43

ホーム画面の幅と高さを2要素のリストとして取得し、入力を介して対角線を取得します。

Input D
If 300D>√(sum(Ans²
Then
Disp "Retina!
Else
"Trash!

TI-BASICの2バイトの小文字は7バイトを追加します(iは、仮想単位であり、1バイトです)。ありがたいことに、!それは階乗関数を表すため、1バイトでもあります。


9

JavaScript ES6、49バイト

(w,h,d)=>Math.hypot(w,h)/d>300?'Retina!':'Trash!'

JavaScriptにこのような長い数学演算子があるのは嫌です。しかし、たとえあったとしても、Math.pythagoreanこれはより短くなります。


誰かが投票権を説明しますか?
ダウンゴート

おそらく長すぎるため。
リトシアスト

1
@ThomasKwa Pythonはわずか1バイト短い
オプティマイザー

5
値の平方を比較すると、平方根を計算する代わりに短くなる場合があります。
レトコラディ

4
@RetoKoradiはい、短くなっています:(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
pepkin88

8

Excel、44バイト

これらのセルに入力を入力します。

  • A1 =ピクセル単位の幅
  • B1 =ピクセル単位の高さ
  • C1 =対角線(インチ)

そして、この式はあなたの結果を与えます:

=IF((300*C1)^2<A1^2+B1^2,"Retina!","Trash!")

4
入力の9E4*C1^2代わりに(300*C1)^2...を入力して、2バイトをゴルフしようとしました。ただし、長さは42になります。ただし、9E4Excelで数式を入力すると、90000Enterキーを押すとすぐに変更されます。:(
ロスプレッサー

7

プロローグ、51バイト

a(W,H,D,R):-9e4*D*D<W*W+H*H,R="Retina!";R="Trash!".

実行中のa(8192,4320,100.0,R).出力:R = "Trash!" .

編集:エッジケースの修正と1バイトのゴルフをしてくれた@PaulButcherに感謝します。


180 240 1 -> Trash!例から密度が300(例:)の場合、これは「Retina!」を返します。幸いにも、あなたが変化する、E表記を持つ2つの文字をオフに剃ることができるため>>=52で葉を:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
ポール・ブッチャー

@PaulButcher 90000の代わりに9e4を使用すると、実際には1文字ではなく2文字が削られます。おかげで、このエッジケースを修正するだけでなく、私の回答を事実上1バイト短くしました。
4

1
よくやった!かなり短いPrologの例を見るのは良いことです。
ポール・ブッチャー

@PaulButcher 2つの文字列の結果の<代わりに実際に使用>=してスワップすることにより、もう1バイト削りました
...-

5

JavaScript(ES6)、45バイト

f=(w,h,d)=>w*w+h*h>d*d*9e4?'Retina!':'Trash!'

CoffeeScript、47バイト

三項演算子はありませんが、累乗があります(これは最新の試みでは役に立ちません)。

f=(w,h,d)->w*w+h*h>d*d*9e4&&'Retina!'||'Trash!'

# Previous attempt
f=(w,h,d)->(w*w+h*h)**.5/d>300&&'Retina!'||'Trash!'

1
仕様によると、(f=)という名前の関数を持つ必要はありません。すべてのバージョンで2バイトを切り捨てることができます。
クロルタン


5

純粋バッシュ(NO BC /他の外部コマンド)138の 136 135 82 83バイト

a=${3#*.}
d=${a//?/0}
r=(Trash Retina)
echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!

純粋なbashでやってみることにしました。これは私の初めてのコードゴルフであるため、おそらくいくつかの明らかな非効率性を生み出しましたが、私はbashに非常に精通しており、外部コマンドを使用しないもの(つまり、純粋なbash)を作成しようとして過去に楽しんでいます。

printfステートメントは最も厄介です。数字をゼロで埋めるためのアイデアはありますか?

編集:2バイトを保存し、printfはゼロの空の引数を取ることがわかります。別のバイトを保存すると、以前に誤ってカウントされていたことがわかり、printfの出力を変数に割り当てるだけで-vを使用するよりも小さくなります。

EDIT2:コメントのDigital Traumaのおかげで、これは今よりも大幅に減少しています。トリック:bashの正規表現サポートを使用して、数字の文字列をカウントしてからゼロに置き換えるのではなく、数字の文字列をゼロに置き換えて(そのように配置すると明らかなようです...)、文字列をbash配列に保存してエコーを保存し、また、ルールのわずかな変更を考慮して、すべての入力番号を.0で終了できることを意味します。

EDIT3:Digital Traumaの提案された修正によって導入されたバグを修正するためのバイトを追加しました。


スコアが102のa=${3#*.};d=${a/./0};((${#a}-${#3}))||d=;r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}! 場合は次のようになります:(;改行で置き換えることができます-コメントで取得しようとしていました)。
デジタル外傷

そして、もしあなたが密度整数が.0(OK、私は思う)で終わると仮定するなら、あなたは82を獲得することができます:a=${3#*.};d=${a/./0};r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
デジタル外傷

元の例には、.0で終わらないものがありましたが、質問が変更されたことに気づいたので、かなり節約できます。アイデアをありがとう!特に、2つのエコーステートメントを削減するというアイデアが気に入っています。私はそれを行う方法を考えていましたが、何らかの理由でアレイを使用することは起こりませんでした!何らかの理由で、あなたが使用できるということも私には決して発生しませんでした......あなたの答えを確認しようとしますが、ここで$ dがどのように機能するかについて少し混乱していますが、それを理解します。
ミューザー

$dあまりにもトリッキーではありません。 a小数点以下の密度の数字が含まれます。d=${a/./0}これらすべての数字をゼロに置き換えるだけです。したがって、私たちはの最後に、これらのゼロを連結することができるwhから小数点を除去することによって達成される10の同じ力で乗算しますd
デジタル外傷

1
乾杯、ちょっと気が狂っていると思った!
ミューザー

4

dc、41バイト

[[Retina!]pq]sr?d*rd*+vr/300<r[Trash!]p

引数をd, w, h順番に入力する必要があります-これで問題ないことを願っています。

テスト出力:

$ for t in \
> "4.95 1920 1080" \
> "5.96 2560 1440" \
> "10.5 1920 1080" \
> "0.04 10 10" \
> "19 4096 2160" \
> "100.00 8192 4320" \
> "11.18 3000 1500" ; do \
> echo $t | dc -e'9k[[Retina!]pq]sr?d*rd*+vr/300<r[Trash!]p'
> done
Retina!
Retina!
Trash!
Retina!
Trash!
Trash!
Retina!
$ 

3

ジュリア、46 45 42バイト

f(w,h,d)=w^2+h^2>9e4d^2?"Retina!":"Trash!"

これにより、3つの数値を受け入れて文字列を返す関数が作成されます。

これは数式を直接実装したもので、少し再配置されています。不等式の両側に乗算してdから二乗しました。


3

R、59 55バイト

名前のない関数として

function(h,w,d)if(h^2+w^2>9e4*d^2)'Retina!'else'Trash!'

インデックス参照の必要性を排除する非常にシンプルな実装。

cat(if((n=scan()^2)[1]+n[2]>9e4*n[3])'Retina!'else'Trash!')

かなり単純です。スキャンから入力をベクトル(単一行、スペースで区切られた行、または複数行)に入れます。ベクトルを二乗します。計算を行い、結果をcatします。


3

MATLAB- 49 45バイト

c={'Trash!','Retina!'};c{(w*w+h*h>9e4*d*d)+1}

最初に、セル配列の位置1と2に格納されているセル配列を宣言する必要がTrash!ありRetina!ました。次に、整数演算のみを使用して条件をチェックするように、多数の観測値を使用して方程式を再配置します。9e4いくつかのバイトを節約するために90000を表しました。この条件が真の場合、1を出力し、そうでない場合は0を出力します。この出力を使用して、セル配列に直接インデックスを付けます。MATLABは1からインデックス作成を開始するため、1を追加してインデックス作成を完了する必要がありました。true1を追加すると2が得られ、1を追加すると1が得られるのが便利ですfalse。これにより、Trash!またはRetina!MATLABコマンドプロンプトに出力されます。

>> w=1920;h=1080;d=4.95;
>> c={'Trash!','Retina!'};c{(w*w+h*h>9e4*d*d)+1}

ans =

Retina!

必要ありませんint8。true+ 1はdouble(2)です。
ジョナス

@ジョナス私はそれを試してみました。MATLAB R2013aでは2に変更されません...奇妙です。
rayryeng-モニカの復元

@Jonas- logical式が機能するためには、式を括弧で囲む必要がありました。操作の順序... d'oh。ヒントをありがとう!
rayryeng-モニカの復職

素敵なアプローチ!(試してみましたhypotが、あなたw*w+h*h>9e4*d*dはもっと短いです)。ただし、これは質問の要件を満たしていますか?関数ではなくプログラムです。そのためw、入力として、hおよびdを使用する必要があります。私は、手段は、コードの挑戦でいつものように、標準入力と仮定
ルイスMendo

@LuisMendoああ私はそれを変えなければなりません!おかげで
rayryeng-モニカの復活

3

XSLT、400バイト

これはPPCGでこれまで見たことのない言語のデビューであり、私はそれをもっと知るようになるので、将来もっと使用したいと思っています。

コード:

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="input"><xsl:variable name="n" select="for $i in tokenize(.,'[^\d\.]+')return number($i)" /><xsl:choose><xsl:when test="$n[1]*$n[1]+$n[2]*$n[2]>90000*$n[3]*$n[3]">Retina!</xsl:when><xsl:otherwise>Trash!</xsl:otherwise></xsl:choose></xsl:template></xsl:stylesheet>

プリティプリント

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="input">
        <xsl:variable name="n" select="for $i in tokenize(.,'[^\d\.]+')return number($i)" />
        <xsl:choose>
            <xsl:when test="$n[1]*$n[1]+$n[2]*$n[2]>90000*$n[3]*$n[3]">
                Retina!
            </xsl:when>
            <xsl:otherwise>
                Trash!
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

ノート:

XSLTにはSTDINを介して入力を取得する方法がないため、2つの<input>タグの間に入力があるXMLファイルを使用する必要があります。もちろん、この方法には制限がありますが、ほとんどの課題に対して完全に機能します。

I / Oの例

入力ファイル:

<?xml version="1.0" encoding="ISO-8859-1"?>
<input>3000 1500 11.18</input> 

出力ファイル:

<?xml version="1.0" encoding="UTF-8"?>Retina!

入力ファイル:

<?xml version="1.0" encoding="ISO-8859-1"?>
<input>1920 1080 10.5</input>

出力ファイル:

<?xml version="1.0" encoding="UTF-8"?>Trash!

2

C#(81)

string D(int w,int h,double d){return Math.Sqrt(w*w+h*h)/d>300?"Retina":"Trash";}

ゴルフをしていない:

string Density(int width, int height, double diagonal)
{
    return Math.Sqrt(width * width + height * height) / diagonal > 300 ? "Retina" : "Trash";
}

他のいくつかの人が式を書き直してsqrt操作を削除するために使用したトリックを使用して、これを73まで短縮できますstring D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}。しかし、!各文字列にを追加して、75に戻す必要があると思います。
ゴリック

2

Swift、77バイト

関数パラメーターの宣言は、これが必要以上に多くの文字を使用することを意味します。

func r(w:Float,h:Float,d:Float){print((w*w+h*h)>9e4*d*d ?"Retina!":"Trash!")}


2

Swift、56バイト

let r={print($0*$0+$1*$1>9e4*$2*$2 ?"Retina!":"Trash!")}

基本的にGoatInTheMachineと同じですが、暗黙的なクロージャーパラメーターを使用します

Swiftでコードゴルフをするときは、常にこのようなメソッドを宣言します。


2

ハスケル、46

f w h d|w^2+h^2>d^2*9e4="Retina!"|0<1="Trash!"

どのHaskellシステムを使用する必要がありますか?私が試したghciのバージョンでは動作しません<interactive>:2:8: parse error on input '|'
エドエイビス

@EdAvis:GHCiはプログラムを実行しません。そこで試すには、が必要let f w h d|…です。
Ry-

2

C ++ 72 70バイト

void F(int w,int h,float d){cout<<w*w+h*h>9e4*d*d?"Retina!":"Trash!";}

他のソリューションと同じように、コードゴルフでウォームアップすることを考えました。


1
あなたは書き込むことでカップルを剃ることができます90000よう9e4
トビースパイツ

2

この問題に対する私の貢献は次のとおりです

Ruby、stdinからの67バイトの読み取り

w,h,d=ARGV.map{|v|Float(v)}
puts w*w+h*h>d*d*9e4?"Retina!":"Trash!"

Ruby、関数内の56バイト

少し短い

def r(w,h,d)
puts w*w+h*h>d*d*9e4?"Retina!":"Trash!"
end

9e4の以前の貢献者に感謝します!


2

Bash、85バイト

if [ $(echo "sqrt($1^2+$2^2)/$3"|bc) -gt 300 ];then
echo Retina!
else
echo Trash!
fi

1
これは「3000 1500 11.18」では機能しません。デフォルトでは、bcの精度は小数点以下0桁です。設定する必要がありscaleます。または、おそらくbc -l暗黙的にスケールを20に設定することで逃げることができます
デジタル外傷

ああ、答えを更新しました。ありがとう!
アディソン

1
ああ、codegolf.stackexchange.com / questions / 15279 /…をチェックしてください。例えば((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
デジタルトラウマ

2

PHP、47、43、40 38バイト

<?=sqrt($w*$w+$h*$h)/$d>300?'Retina':'Trash'?>!
<?=sqrt($w*$w+$h*$h)/$d>300?Retina:Trash?>!
<?=$w*$w+$h*$h>9e4*$d*$d?Retina:Trash?>!

<?=hypot($w,$h)/$d>300?Retina:Trash?>!

register_globals==trueGET値w、h、dを使用する必要があります(絶対に使用しないでください!)
-文字列の周りの引用符を削除して4バイトを保存しました。悪いコーディングですが、動作します。
-移動してd、平方根を方程式の反対側に移動し、sqrt()関数を保存します
-切り替えて2バイトを節約しましたhypot()(ありがとうLucas Costa)


これはPHP4.1の回答であり、register_globalsディレクティブを設定する必要はないと言う必要があります。
イスマエルミゲル

2
どちらのオプションも同じように悪いです
Martijn

2

C#6、67バイト

string D(int w,int h,double d)=>w*w+h*h>9e4*d*d?"Retina!":"Trash!";

この回答は、Wolfsheadsの回答に基づいています。C#6の新機能を使用して、8バイト短くしました。


2

JavaScript(ES6)58 54 43バイト

43バイト

関数割り当てを削除(PPCGルールに従って)(-2)、および平方根を削除し、900(300 ^ 2)と比較(-12)

(w,h,d)=>w*w+h*h/d*d>300?"Retina!":"Trash!"

54バイト

不要な括弧を削除しました(-4バイト)

a=(w,h,d)=>Math.sqrt(w*w+h*h)/d>300?"Retina!":"Trash!"

58バイト

a=(w,h,d)=>Math.sqrt((w*w)+(h*h))/d>300?"Retina!":"Trash!"

ここでの説明:

a =                           // The function is a
 (w,h,d) =>                   // Accepts the three arguments
   Math.sqrt((w*w)+(h*h))/d   // Calculate pixel density
   > 300                      // Above the threshold
   ? "Retina!"                // If so, return "Retina!"
   : "Trash!"                 // Otherwise return "Trash!"

これは、三項演算子を使用して密度をテストし、矢印関数を使用して数バイトを殺します


1
平方根を避け、代わりに値の二乗を比較することにより、これを短くすることができます。
レトコラディ

1

Java、82 74バイト

String g(int w,int h,double d){return 9e4*d*d>w*w+h*h?"Trash!":"Retina!";}

で呼び出す g(width,height,diagonal)


1
あなたは高価なのを取り除くことによって、このダウンをカットすることができますdoubleのような配列:String g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}時々最も簡単なのは最高です:)
Geobits

@Geobitsおかげで、2つのアプローチのバイトを予算に費やす時間がありませんでした。
DeadChex

1

Clojure、58バイト

#(if(>(+(* %1%1)(* %2%2))(* %3%3 90000))"Retina!""Trash!")

@Kroltanの派手な数学を使用してこれを短縮しました。(w、h、d)の順序で渡される暗黙的な引数を使用します。

最初のClojureゴルフ...私がどれだけの空白を残すことができるかに驚いた

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