En uygun sürgülü kapı genişliğini bulun


13

Sürgülü kapılar, kapıların genişliğine göre değişen fiyatlara sahiptir. Farklı fiyatlar aşağıdaki gibidir:

  • 60-80 cm: ¤150
  • 81-100 cm: 200
  • 101-120 cm: ¤220

Bir dolap satın alırken, maliyeti en aza indirmek istersiniz, bu yüzden göreviniz, dolabın toplam genişliğine göre toplam maliyeti en aza indiren kapıların genişliğini bulmaktır.

Kurallar:

  • Toplam genişlik girdi olarak alınacaktır
  • Tüm kapılar aynı genişliğe sahip olacaktır
  • İki tip kapı aynı maliyete sahipse en küçük kapıları seçin
  • Genişlikler santimetre cinsindendir, tamsayı ondalık değil
    • Ondalık sayılar topla
  • Fiyat bir tamsayı olarak iade edilecektir (para birimi işaretine gerek yoktur)
  • Giriş ve çıkış biçimleri isteğe bağlıdır, ancak çıkış sırası olmalıdır: Number of doors, Width, Price.
  • Giriş aralıkta olacaktır [120 1000).

Bu kod golf. Bayt kazanmak için en kısa kod.

Örnekler:

Input: 156
Output: 2, 78, 300

Input: 331
Output: 3, 111, 660

Input: 420
Output: 4, 105, 880

Genişlik 201olduğunu ilginç bir test durum ...
AdmBorkBork

8
Kayar kapı? Açıkçası her kapı bir @Doorknob gerekir.
Alex

Yanıtlar:


2

05AB1E , 47 bayt

Kod:

D120/ó>DU=/ó>=D101›iX220*=q}D80›iX200*=q}X150*=

En iyi teslim değil, ama en azından bir şey :)

Çevrimiçi deneyin!


TIO'ya 333 koymak, (afaik) çıktının [3, 111, 660] olması gerektiğinde [3, 112, 660] çıktı verir, çünkü 3 * 111
Helen

201 yerine [2, 101, 440] yerine [2, 101, 400] verilmesi ile ilgili benzer problem
Helen

4

JavaScript (ES6), 101 bayt

t=>[[80,150],[100,200],[120,220]].map(([w,p])=>[n=-~(~-t/w),-~(~-t/n),n*p]).sort((a,b)=>a[2]-b[2])[0]

-~(~-a/b) 31 bit tamsayılarda Math.ceil (a / b) ile aynıdır.


4

Perl, 190 180 154 133 128 117 bayt

için +1 içerir -p

use POSIX;$m=1E4;for$q(80,100,120){($m,@z)=($p,$n,ceil$_/$n)if$m>($p=(150,200,220)[$x++]*($n=ceil$_/$q))}$_="@z $m"

Yorumlananlar:

use POSIX;                                  # for ceil()
$m = 1E4;                                   # init min price to 10k
for $q (80,100,120) {                       # iterate widths
    ($m,@z) = ($p,$n, ceil $_/$n)           # update min, output
    if $m > (                               #
       $p = (150,200,220)[$x++]             # grab price
          * ( $n = ceil $_/$q )             # times nr of doors needed
    )
}
$_="@z $m"

  • Kare değerini iki diziye ayırarak ve bölerek 11 bayt tasarruf edin

  • Kullanarak 5 bayt tasarruf edin -p(@ dev-null sayesinde)

  • POSIX :: ceil kullanarak 18 bayt ve karma için liste sözdizimini kullanarak 3 bayt tasarruf edin (@ msh210 sayesinde)


Daha kısa sub r{$a=$_[0];~~$a==$a?$a:1+~~$a}DİR sub r{use POSIX;ceil pop}.
msh210

Daha kısa (80=>150,100=>200,120=>220)DİR (80,150,100,200,120,220).
msh210

Bu çok geniş kapılar için çalışıyor mu (fiyat 10_000'den fazla ise)?
msh210

@ msh210 İpuçları için teşekkürler, bunları dahil edeceğim! Hayır, yalnızca söz konusu belirtilen aralık için çalışır [120-1000), ancak bir zaman değiştirebilir 1E4için 1E9...
Kenney

Oh, sorunun bir aralık belirlediğini fark etmedim.
msh210

3

PowerShell, 137135 bayt

param($a)$j=9e9;60..120|%{if((($c=[math]::ceiling($a/$_))*($p=(220,(200,150)[$_-le80])[$_-le100]))-lt$j){$j=($k=$c)*$p;$i=$_}}
$k;$i;$j

Çıktı satırsonu ile ayrılmıştır.

Biz girdi almak $a, bizim maliyet belirleyebilirsiniz $jiçin 9000000000(daha biz olur ihtiyacı her zamankinden çok yolu çok sayıda). Sonra, 60..120ile döngü |%{...}. Her bir yineleme, $psöz konusu öğenin sözde üçlü bir ifadeyle fiyatını , ardından $ctavanını hesaplıyoruz $a/$_. Mevcut toplam gördüğümüz en küçük toplamdan ( $j) küçükse , tüm bu değişkenleri kaydedin: $j(toplam), $k(gerekli kapı sayısı) ve $i(kapı genişliği) ve döngüye devam edin. Döngü bittiğinde, en iyi değerleri çıkarmanız yeterlidir.

Düzenle - $cve $patamaları ifkoşullu duruma getirerek iki bayt kaydetti


2

Pyth, 65 bayt

ho+eNcehNTm[d*hd?>81ed150?<101ed220 200)f}eTr60 121m[d.EcQd)r2 17

Burada deneyin!

açıklama

İlk olarak, tüm olası kapı sayısı / kapı genişliği kombinasyonlarının bir listesini oluşturur ve bu kombinasyonların her birinin fiyatını hesaplar. O zaman sadece fiyat ve kapı genişliğine göre sipariş vermeli ve sonuç listesinin ilk elemanını almalıyız.

Bu açıklama golf sonra Kod açıklaması takip Lütfen bana bu golf yardım edin, bu çok uzun.

ho + eNcehNTm [d * hd?> 81ed150? <101ed220 200) f} eTr60 121m [d.EcQd) r2 17 # Q = giriş

                                                   m r2 17 # harita aralığı (2,17) ila
                                                    [d) Önce kapı sayısı olan # liste
                                                      .EcQd # ve ikinci genişlik
                                        f # Harita sonucunu T ile filtrele
                                         } r60121 # (60.121) aralığında
                                          eT # kapı genişliği
          d ile m # harita filtresi sonucu
           [d) # önce kapı sayısı ve genişliği olan bir listeye
             * hd # ile çoklu kapı sayısı
                ?> 81ed150? <101ed220 200 # kapı başına fiyat, üçlülerle basit arama
 o # ile sipariş haritası sonucu
  + eNcehNT # sipariş anahtarı = fiyat + genişlik / 10
h # ilk eleman en iyisidir

1

JavaScript (ES6) 96

n=>[80,100,120].map((d,i)=>[d=-~(~-n/d),-~(~-n/d),d*[150,200,220][i]]).sort((a,b)=>a[2]-b[2])[0]

@Neil tarafından belirtildiği gibi =-~(~-n/d), 32 bit veya daha küçük tamsayılar için yuvarlama ile bölünmeye eşdeğerdir.


1

R , 135104 bayt

"!"=utf8ToInt;cbind(n<-16:1,w<-ceiling(scan()/n),p<-n*approx(!"<Qex",!"–ÈÜÜ",w,"c")$y)[order(p)[1],]

Çevrimiçi deneyin!

31 bayt tarafından kaydedildi

  • sıkıştırılmış sayılar
  • kullanma utf8ToInt
  • "!" kullanarak işlev çağrısını kısaltmak için
  • vectorized fonksiyonları kullanma
  • toplam uzunluğu tanımlamıyor
  • cbinddeğişkenleri tanımladıktan sonra doğrudan kullanma

Nasıl çalışır:

  1. approxtek bir kapının fiyatını uzunluğuna göre döndürür. NAAralığın dışında döner [60,120].
  2. Spesifikasyona göre, toplam kapı sayısı 16'dan fazla olamaz (toplam uzunluk 1000). 16'dan 1'e kadar tüm kapılar test edilir ve üçüz (number of doors, door width, total price)döndürülür.
  3. orderFonksiyon minimum fiyat bulmak için kullanılır; buna göre doğru üçüz çıkarılır. Bağlar durumunda, order önce gelen girişi döndürür ve 16'dan 1'e kadar döngü yaptığımızdan en fazla sayıda kapı (en küçük kapı genişliği) döndürülür.

Kullanmak stepfundaha uzundur - bir kişinin genişliği dışında olması gerektiği için [60,120].
JayCe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.