Kita hidup di zaman teknologi yang luar biasa di mana kita dapat memiliki layar 8K yang sangat indah di TV kita, dan bahkan 2K yang ditampilkan di ponsel kita untuk kesenangan menjelajah seluler kita. Kami telah datang jauh dalam beberapa tahun terakhir dalam hal teknologi layar.
Salah satu produk dari ini adalah istilah yang dipopulerkan oleh Apple, Retina . Ini merujuk pada kerapatan piksel layar yang dipermasalahkan begitu tinggi, sehingga pada jarak pandang 10-12 inci, masing-masing piksel tidak dapat dengan mudah dipilih.
Steve Jobs mengatakan bahwa kerapatan piksel tempat ini terjadi tepat di sekitar 300 piksel per inci , dan mereka mulai menggunakan kerapatan piksel dalam kisaran ini di perangkat mereka dengan kata kunci Retina yang digunakan untuk iklan.
Kerapatan piksel dapat dihitung dengan rumus berikut:
Dimana d
diagonal layar dalam inci, w
adalah jumlah piksel pada sumbu horizontal, dan h
jumlah piksel pada sumbu vertikal.
Tugas Anda
Untuk tugas ini, Anda akan menggunakan standar Retina untuk memutuskan produk apa yang layak dibeli. Menjadi konsumen modern seperti Anda, ketika Anda berbelanja untuk perangkat yang ingin memastikan bahwa Anda mendapatkan produk yang bagus, bukan perangkat dari tahun 90-an! Dengan demikian, Anda ingin membuat program atau fungsi yang menggunakan lebar layar, tinggi dan panjang diagonal sebagai parameter input atau fungsi , dan memberi tahu Anda apakah layar tertentu memenuhi syarat sebagai layar retina ( D > 300
) dengan mencetak ke layar atau kembali .
Karena penghinaan Anda untuk perangkat non-Retina, program atau fungsi Anda akan ditampilkan Retina!
ketika perangkat memenuhi syarat, dan Trash!
ketika itu tidak.
Anda dapat mengasumsikan bahwa semua angka akan lebih besar dari 0. Nilai piksel untuk lebar dan tinggi akan selalu menjadi angka utuh. Ukuran layar dapat ditafsirkan dengan cara apa pun, asalkan mendukung desimal. Input mungkin dalam urutan apa pun yang Anda pilih, dan mungkin juga hingga 3 baris terpisah.
Contoh 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!
Ini adalah kode-golf , sehingga jumlah byte terkecil yang menang.
Inilah solusi Stuck, bahasa pemrograman berbasis stack yang saya buat:
r;`;/300>"Retina!""Trash!"?
Jawaban:
Pyth - 27 byte
Menggunakan operator ternary dan
abs
menghitung pythagoras.Mengambil input dalam dua baris, baris pertama
width, height
, baris keduadiag
.Aturannya santai jadi berputar kembali.
Cobalah online di sini .
sumber
Retina ,
530220210202201193191187185 (184) byteKredit ke randomra untuk menghemat 3 byte! (Dan membuka jalan untuk beberapa lagi.)
Untuk keperluan penghitungan byte, setiap baris menggunakan file terpisah, tetapi Anda dapat menjalankan kode di atas seperti dari satu file dengan memanggil Retina dengan
-s
flag.Ini mengharapkan kepadatan pertama (yang harus mengandung titik desimal, bahkan jika itu trailing), diikuti oleh lebar dan tinggi, yaitu
d w h
.Ini agak lambat. Saya tidak akan mencoba sebagian besar kasus uji yang diberikan, karena akan berjalan lama. Namun, Anda dapat memeriksa apakah itu berfungsi dengan benar dengan kasus uji
Pada dasarnya, setelah mengalikan semua angka hingga menjadikan kerapatan bilangan bulat, Anda tidak ingin lebar dan tinggi memiliki lebih dari 4 digit.
Meskipun ini lambat, itu sepenuhnya tepat ... tidak ada masalah floating point atau sesuatu seperti itu. Semua aritmatika menggunakan bilangan bulat (unary).
Pada prinsipnya, saya bisa mengurangi satu byte lagi: byte
^
dapat dihilangkan, tetapi itu akan membuatTrash!
kasus uji sangat lambat karena jumlah backtracking yang berlebihan.Penjelasan
Pertama, mari kita atur ulang ketimpangan untuk menghindari operasi floating point:
Kami juga dapat melihat bahwa ini tidak berubah di bawah penggandaan
w
,h
dand
dengan nomor yang samax
:Ada beberapa cara untuk mengkuadratkan angka unary, tetapi kami akan menggunakan identitas itu
Ini memberi kita cara untuk menyelesaikan masalah hanya menggunakan bilangan bulat aritmatika (mewakili bilangan bulat di unary).
Mari kita lihat kodenya. Setiap pasangan garis adalah pengganti regex.
Ini berulang kali memindahkan titik desimal dalam kepadatan ke kanan sambil mengalikan lebar dan tinggi dengan 10 (di
x
atas). Ini untuk memastikan bahwa semua angka adalah bilangan bulat. Alih-alih menambahkan nol, saya menambahkan_
, yang saya akan memperlakukan sebagai nol nanti. (Ini adalah trik golf, karena kalau tidak saya harus menulis...${3}0
untuk menghindari ambiguitas dengan$30
.) Di+
depan regex memberitahu Retina untuk mengulangi penggantian ini sampai hasilnya berhenti berubah (yang merupakan kasus ketika polanya tidak lagi cocok) .Kami sedang menyiapkan tiga angka untuk konversi ke unary sekarang. Pada prinsipnya, kita membutuhkan penanda (di
#
) di depan setiap angka, tetapi lebih pendek untuk menambahkan satu ke akhir setiap angka juga, yang tidak akan mempengaruhi langkah konversi.Ini adalah konversi ke unary, menggunakan trik yang telah dikembangkan oleh dan1111 . Pada dasarnya saya menerjemahkan setiap digit ke rep-digit sendiri, sambil mengalikan digit yang ada dengan 10 (memindahkan
#
marker ke kanan dalam proses). Representasi biner ini akan menjadi campuran yang berbeda dari angka-angka yang berbeda, tetapi jumlah totalnya akan sama dengan nilai integer asli. Perhatikan\w
pada bagian akhir - biasanya ini hanya saja0
, tetapi kami juga ingin memperlakukannya_
sebagai nol (yang dianggap sebagai karakter kata dalam regex).Kami mengubah setiap digit menjadi dua
1
s, dengan demikian a) memastikan semua digit adalah sama (yang akan diperlukan nanti) dan b) menggandakan masing-masing angka.Ini melakukan dua hal: itu menguadratkan semua angka (atau lebih tepatnya setengah dari setiap angka, dengan menghitung jumlah di atas
2n
), dan menambahkan kuadrat yang dihasilkan dari lebar dan tinggi. Perhatikan bahwa[^.]
cocok1
dengan,#
spidol dan spasi. Jika a#
atau spasi, lookahead tidak akan menangkap apa pun, yang berarti semua itu hanya dihapus, yaitu hasil untuk lebar dan tinggi digabungkan / ditambahkan. Titik desimal.
tetap memisahkan hasild
dari itu. Jika[^.]
cocok dengan1
sebaliknya, maka lookahead memastikan bahwa kami menangkap setengah dari1
setelah itu (dibulatkan ke bawah) dalam grup1
. Ini menghitung jumlah yang saya sebutkan di atas, yang kemudian akan menghasilkan kuadrat dari angka aslinya.String sekarang (di unary), lalu , lalu (di unary). Kami ingin tahu apakah angka unary pertama kali lebih pendek dari yang kedua. Kita dapat dengan mudah melakukan perkalian ini menggunakan capturing group dan sintaks pengulangan. Kami menggunakan (bukan ) setelah itu untuk memastikan bahwa angka kedua sebenarnya lebih besar dari itu dan tidak hanya sama. Jika demikian, kami mengganti semua itu dengan .
d2
.
w2 + h2
90000
{n}
1+
1*
Retina!
Jika angka kedua tidak cukup besar, maka langkah sebelumnya tidak akan mengubah apa pun dan string akan tetap dimulai dengan a
1
. Jika itu masalahnya, kami hanya mengganti seluruh string denganTrash!
dan selesai.sumber
Python, 49
Menggunakan interleaving string.
Ternyata lebih pendek untuk menyejajarkan kedua sisi daripada menggunakan norma kompleks.
sumber
Retina!
atauTrash!
! Tidak me-retweet @ertaisnha !!Retina , 312 byte
Ini berjalan cukup lama, tetapi tampaknya berhasil.
Mungkin bisa bermain golf lebih banyak ...
Penjelasan:
Tambahkan tag untuk membuat string lebih mudah diurai, dan tambahkan beberapa sampah untuk membuatnya lebih mudah dikonversi ke basis 1, dan tambahkan 300 untuk dikalikan nanti
Tambahkan
0
ke lebar dan tinggi, sambil menambahkan bagian desimal dari diagonal ke bagian integer. Ketika ini dilakukan, diagonal akan menjadi bilangan bulat, dan lebar dan tinggi akan dikalikan dengan berapa banyak10
pun yang diperlukan.Ubah semua angka menjadi basis 1, menggunakan tabel pencarian yang saya tambahkan pada langkah pertama
Bersiaplah untuk menyusun semua angka
Kuadratkan setiap angka
Kalikan kuadrat diagonal dengan kuadrat 300 yang kami sisipkan di langkah pertama
Jika lebar yang ditambahkan ke ketinggian cocok dengan produk yang baru saja kami hitung, kerapatan piksel terlalu rendah, dan itu Sampah!
Kalau tidak, itu Retina!
sumber
CJam,
30 2927 byteMembutuhkan input dalam bentuk
diagonal width height
UPDATE: 1 byte disimpan berkat Dennis!
Cobalah online di sini
sumber
APL,
4036 byteDisimpan 4 byte berkat Dennis!
Ini menciptakan fungsi diad tanpa nama yang mengambil dua argumen pertama di sebelah kiri dan yang ketiga di sebelah kanan. Ia memeriksa apakah jumlah kuadrat dari nilai kiri lebih besar dari 300 ^ 2 kali kuadrat dari nilai yang tepat. Output dicetak sesuai.
Anda dapat mencobanya secara online !
sumber
TI-BASIC, 43
Mengambil lebar dan tinggi melalui homescreen sebagai daftar dua elemen, dan diagonal melalui Input.
Huruf kecil dua-byte TI-BASIC menambahkan 7 byte (
i
, sebagai unit imajiner, adalah satu byte) menyebabkannya menjadi sangat tidak kompetitif. Untungnya,!
ini juga satu byte karena mewakili fungsi faktorial.sumber
JavaScript ES6, 49 byte
Saya benci bahwa JavaScript memiliki operator matematika yang sangat panjang. Tetapi bahkan jika ada,
Math.pythagorean
ini akan lebih pendek.sumber
(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
Excel, 44 byte
Ketikkan input Anda di sel-sel ini.
Dan formula ini memberikan hasil Anda:
sumber
9E4*C1^2
alih-alih(300*C1)^2
... ini menghasilkan panjang 42. Namun, mengetikkan9E4
rumus di Excel, akan diubah menjadi90000
begitu Anda menekan enter. :(Prolog, 51 byte
Menjalankan
a(8192,4320,100.0,R).
output:R = "Trash!" .
Sunting: Terima kasih kepada @PaulButcher karena mengoreksi casing tepi dan bermain golf satu byte.
sumber
180 240 1 -> Trash!
) dari contoh. Untungnya, karena Anda dapat mencukur dua karakter dengan notasi, berubah>
untuk>=
meninggalkannya di 52:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
<
alih-alih>=
dan menukar dua hasil string ...JavaScript (ES6), 45 byte
CoffeeScript, 47 byte
Tidak ada operator ternary, tetapi ada eksponensial (yang tidak membantu dalam upaya terbaru).
sumber
f=
). Anda dapat memotong 2 byte di semua versi.O ,
4037 byteBanyak byte untuk pemformatan input: \
Cobalah online
sumber
Pure Bash (tanpa bc / perintah eksternal lainnya),
1381361358283 byteSaya memutuskan untuk mencoba melakukannya di bash murni. Saya mungkin telah membuat beberapa inefisiensi yang jelas karena ini adalah golf kode waktu pertama saya, tetapi saya SANGAT akrab dengan bash dan bersenang-senang di masa lalu mencoba menulis hal-hal yang tidak menggunakan perintah eksternal (yaitu pure bash).
Pernyataan printf adalah yang paling menjengkelkan. Adakah yang punya ide lebih baik untuk menambahkan nomor dengan angka nol?EDIT: Disimpan dua byte, ternyata printf akan mengambil argumen kosong untuk nol. Disimpan byte lain, ternyata saya sebelumnya salah hitung dan hanya menetapkan output printf ke variabel lebih kecil daripada menggunakan -v.
EDIT2: Berkat Digital Trauma di komentar, ini sekarang turun jauh lebih signifikan. Trik: menggunakan dukungan regex bash untuk mengganti string angka dengan nol alih-alih menghitungnya kemudian mencetak angka nol itu (tampak jelas ketika saya meletakkannya seperti itu ...), menyimpan string dalam array bash untuk menyimpan gema, dan dengan mempertimbangkan sedikit perubahan dalam aturan yang berarti Anda dapat mengakhiri semua angka input dalam .0.
EDIT3: Menambahkan byte untuk memperbaiki bug yang diperkenalkan oleh modifikasi yang disarankan Digital Trauma.
sumber
a=${3#*.};d=${a/./0};((${#a}-${#3}))||d=;r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
(Anda dapat mengganti;
dengan baris baru - Saya hanya mencoba untuk mendapatkannya dalam komentar)..0
(ok, saya pikir) maka Anda dapat skor 82:a=${3#*.};d=${a/./0};r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
$d
tidak terlalu rumit.a
berisi digit kerapatan setelah titik desimal.d=${a/./0}
hanya mengganti semua angka itu dengan nol. Dengan demikian kita dapat menyatukan nol tersebut sampai akhirw
danh
mengalikannya dengan kekuatan sepuluh yang sama yang dicapai dengan menghilangkan titik desimal darid
.dc, 41 byte
Membutuhkan args sebagai input
d, w, h
agar - saya harap ini OK.Output tes:
sumber
Julia,
464542 byteIni menciptakan fungsi yang menerima tiga nilai numerik dan mengembalikan string.
Ini adalah implementasi langsung dari formula, hanya disusun ulang sedikit. Kedua sisi ketimpangan dikalikan
d
saat itu kuadrat.sumber
R,
5955 BytesSebagai fungsi yang tidak disebutkan namanya sekarang
Implementasi yang sangat sederhana, yang menghilangkan kebutuhan untuk referensi indeks.
Sebelumnya
Cukup sederhana, dapatkan input dari pemindaian menjadi vektor (satu baris, spasi terpisah atau multi-baris). Kuadratkan vektor. Lakukan perhitungan dan hasilkan cat.
sumber
MATLAB -
4945 byteSaya pertama kali harus mendeklarasikan array sel yang berisi
Trash!
danRetina!
yang disimpan di lokasi 1 dan 2 di dalam array sel. Selanjutnya, saya menggunakan pengamatan yang diamati oleh banyak orang untuk mengatur ulang persamaan sehingga Anda memeriksa kondisi hanya menggunakan bilangan bulat aritmatika. Saya mewakili 900009e4
untuk menghemat beberapa byte. Jika kondisi ini benar, kita output 1, kalau tidak kita output 0. Saya menggunakan output ini untuk mengindeks langsung ke dalam array sel. Karena MATLAB mulai mengindeks pada 1, saya juga harus menambahkan 1 untuk menyelesaikan pengindeksan. Yang menyenangkan adalah menambahkantrue
dengan 1 memberi 2, sementara menambahkanfalse
dengan 1 memberi 1. Ini akan menampilkan salah satuTrash!
atauRetina!
di command prompt MATLAB.Contoh
sumber
int8
, true +1 adalah dobel (2).logical
ekspresi dalam tanda kurung agar berfungsi. Urutan operasi ... Ya ampun. Terima kasih atas tipnya!hypot
tetapi Andaw*w+h*h>9e4*d*d
lebih pendek). Namun, apakah ini memenuhi persyaratan pertanyaan? Ini sebuah program, bukan fungsi. Jadi harus mengambilw
,h
dand
sebagai input. Saya berasumsi itu berarti stdin, seperti biasa dalam tantangan kodeXSLT, 400 byte
Ini adalah debut dari bahasa yang belum pernah dilihat sebelumnya di PPCG, dan saya berharap dapat menggunakannya lebih banyak di masa depan karena saya lebih mengenalnya.Kode:
Cukup Dicetak
Catatan:
Karena XSLT tidak memiliki cara untuk mengambil input melalui STDIN, kita harus menggunakan file XML, dengan input di antara dua
<input>
tag. Tentu saja, metode ini memiliki keterbatasan tetapi akan bekerja dengan baik untuk sebagian besar tantangan.Contoh I / O
File input:
Berkas keluaran:
File input:
Berkas keluaran:
sumber
C # (81)
Tidak Disatukan:
sumber
string D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}
. Tetapi Anda juga perlu menambahkan!
ke setiap string sehingga akan kembali ke 75 saya pikir.Swift, 77 byte
Deklarasi parameter fungsi berarti ini membutuhkan lebih banyak karakter daripada seharusnya:
func r(w:Float,h:Float,d:Float){print((w*w+h*h)>9e4*d*d ?"Retina!":"Trash!")}
sumber
Swift, 56 byte
Pada dasarnya sama dengan GoatInTheMachine tetapi dengan parameter penutupan implisit
Ketika Code Golfing dengan Swift, selalu mendeklarasikan metode seperti ini, itu jauh lebih pendek
sumber
Haskell, 46
sumber
<interactive>:2:8: parse error on input '|'
.let f w h d|…
.C ++
7270 ByteSerupa dengan solusi lain, mencari tahu sendiri untuk pemanasan dengan kode golf.
sumber
90000
sebagai9e4
Inilah kontribusi saya untuk masalah ini
Ruby, 67 byte membaca dari stdin
Ruby, 56 byte dalam suatu fungsi
Sedikit lebih pendek
Terima kasih kepada kontributor sebelumnya untuk 9e4!
kode-golf ruby
sumber
Bash, 85 byte
sumber
bc
presisi adalah 0 tempat desimal. Anda akan perlu mengaturscale
, atau Anda mungkin bisa lolos denganbc -l
yang secara implisit menetapkan skala ke 20((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
PHP,
47,43,4038 byteMembutuhkan
register_globals==true
(yang seharusnya tidak!), Dengan GET nilai w, h, d- Disimpan 4 byte dengan menghapus tanda kutip di sekitar string. Pengodean yang buruk, tetapi berhasil.
- Pindah
d
dan akar kuadrat ke sisi lain dari persamaan, menyimpansqrt()
fungsi- Menyimpan 2 byte dengan beralih ke
hypot()
(terima kasih Lucas Costa)sumber
register_globals
arahan untuk ditetapkan.C # 6, 67 Bytes
Jawaban ini didasarkan pada jawaban Wolfsheads. Saya membuatnya 8 byte lebih pendek menggunakan fitur baru C # 6.
sumber
JavaScript (ES6)
585443 Bytes43 Bytes
Penugasan fungsi yang dihapus (sesuai aturan PPCG) (-2), serta menghapus akar kuadrat dan membandingkannya dengan 900 (300 ^ 2) (-12)
54 Bytes
Menyingkirkan tanda kurung yang tidak sehat (-4 byte)
58 Bytes
Penjelasan di sini:
Ini menggunakan operator ternary untuk menguji kepadatan dan membunuh beberapa byte dengan menggunakan fungsi panah
sumber
Java,
8274 byteSebut saja dengan
g(width,height,diagonal)
sumber
double
array mahal seperti:String g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}
Kadang-kadang paling sederhana adalah yang terbaik :)Clojure, 58 byte
Menggunakan matematika mewah @ Kroltan untuk mempersingkat ini. Menggunakan argumen implisit yang disahkan dalam urutan (w, h, d).
Golf Clojure pertama ... Saya terkejut seberapa banyak ruang putih yang saya boleh tinggalkan
sumber