Znajdź optymalną szerokość drzwi przesuwnych

13

Drzwi przesuwne mają różne ceny w zależności od szerokości drzwi. Różne ceny są następujące:

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

Kupując szafę, oczywiście chcesz zminimalizować koszty, więc Twoim zadaniem jest znalezienie szerokości drzwi, która minimalizuje całkowity koszt w oparciu o całkowitą szerokość szafy.

Zasady:

  • Całkowita szerokość zostanie przyjęta jako dane wejściowe
  • Wszystkie drzwi będą miały tę samą szerokość
  • Wybierz najmniejsze drzwi, jeśli dwa rodzaje drzwi kosztują tyle samo
  • Szerokości podano w centymetrach, liczbach całkowitych, a nie dziesiętnych
    • Zaokrąglaj liczby dziesiętne
  • Cena zostanie zwrócona w postaci liczby całkowitej (bez znaku waluty)
  • Formaty wejściowe i wyjściowe są opcjonalne, ale kolejność wyjścia muszą być: Number of doors, Width, Price.
  • Dane wejściowe będą w zakresie [120 1000).

To jest kod golfowy. Najkrótszy kod w bajtach wygrywa.

Przykłady:

Input: 156
Output: 2, 78, 300

Input: 331
Output: 3, 111, 660

Input: 420
Output: 4, 105, 880
Stewie Griffin
źródło
Szerokość 201jest interesującym przypadkiem testowym ...
AdmBorkBork
8
Przesuwne drzwi? Oczywiście każde drzwi potrzebują @Doorknob.
Alex A.,

Odpowiedzi:

2

05AB1E , 47 bajtów

Kod:

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

Nie najlepsze zgłoszenie, ale przynajmniej coś :)

Wypróbuj online!

Adnan
źródło
Wstawienie 333 do TIO daje wynik [3, 112, 660], gdy (afaik) wynik powinien wynosić [3, 111, 660], ponieważ 3 * 111 równa się 333 doskonale
Helen
Podobny problem z 201 podaniem [2, 101, 400] zamiast [2, 101, 440]
Helen
4

JavaScript (ES6), 101 bajtów

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) jest taki sam jak Math.ceil (a / b) w 31-bitowych liczbach całkowitych.

Neil
źródło
4

Perl, 190 180 154 133 128 117 bajtów

zawiera +1 dla -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"

Skomentowano:

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"

  • Zaoszczędź 11 bajtów, wstawiając i dzieląc skrót na dwie tablice

  • Zaoszczędź 5 bajtów, używając -p(dzięki @ dev-null)

  • Zaoszczędź 18 bajtów, używając POSIX :: ceil i 3 więcej, używając składni listy dla skrótu (dzięki @ msh210)

Kenney
źródło
Krótszy niż sub r{$a=$_[0];~~$a==$a?$a:1+~~$a}jest sub r{use POSIX;ceil pop}.
msh210
Krótszy niż (80=>150,100=>200,120=>220)jest (80,150,100,200,120,220).
msh210
Czy działa to w przypadku bardzo bardzo szerokich drzwi (gdzie cena przekracza 10_000)?
msh210
@ msh210 Dzięki za wskazówki, wykorzystam je! Nie, działa tylko w zakresie określonym w pytaniu [120-1000), ale zawsze można zmienić 1E4na 1E9...
Kenney
Och, nie zauważyłem, że pytanie określało zakres.
msh210,
3

PowerShell, 137 135 bajtów

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

Dane wyjściowe są oddzielone znakiem nowej linii.

Bierzemy wkład $a, ustawiamy nasz koszt $jna 9000000000(duża liczba, która jest o wiele większa niż kiedykolwiek byśmy potrzebowali). Następnie zapętlamy od 60..120z |%{...}. Przy każdej iteracji obliczamy $pcenę bieżącego elementu za pomocą pseudo-trójki , a następnie obliczamy $cpułap $a/$_. Jeśli bieżąca suma jest mniejsza niż najmniejsza suma, jaką widzieliśmy ( $j), zapisz wszystkie te zmienne: $j(suma), $k(wymagana liczba drzwi) i $i(szerokość drzwi) i kontynuuj pętlę. Po zakończeniu pętli wyślij najlepsze wartości.

Edytuj - Zapisano dwa bajty, przenosząc przypisania $ci $pdo ifwarunkowego

AdmBorkBork
źródło
2

Pyth, 65 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie

Najpierw generuje listę wszystkich możliwych kombinacji liczby drzwi / szerokości drzwi i oblicza cenę dla każdej z tych kombinacji. Następnie musimy go zamówić tylko według ceny i szerokości drzwi i wziąć pierwszy element z wynikowej listy.

Wyjaśnienie kodu następuje po tym, jak grałem w golfa. Pomóż mi w tym zagrać w golfa.

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

                                                   m r2 17 # zasięg mapy (2,17) do
                                                    [d) # lista z liczbą drzwi jako pierwszą
                                                      .EcQd # i szerokość sekunda
                                        f # Filtruj wynik mapy za pomocą T
                                         } r60 121 # w zakresie (60,121)
                                          eT # szerokość drzwi
          m # wynik filtrowania mapy za pomocą d
           [d) # do listy z liczbą i szerokości drzwi jako pierwszą
             * Liczba drzwi HD # mult z
                ?> 81ed150? <101ed220 200 # cena za drzwi, proste wyszukiwanie za pomocą trójskładników
 o # zamów wynik mapy z N
  + eNcehNT # klucz zamówienia = cena + szerokość / 10
h # pierwszy element jest najlepszy
Denker
źródło
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]

Jak zauważył @Neil, =-~(~-n/d)jest równoważne dzieleniu z zaokrąglaniem w górę dla liczb całkowitych 32-bitowych lub mniejszych.

edc65
źródło
1

R , 135 104 bajtów

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

Wypróbuj online!

Zapisano 31 bajtów przez

  • dekompresowanie liczb
  • za pomocą utf8ToInt
  • za pomocą "!" skrócić wywołanie funkcji
  • za pomocą funkcji wektoryzowanych
  • brak określenia całkowitej długości
  • używając cbindbezpośrednio, a nie po zdefiniowaniu zmiennych

Jak to działa:

  1. approxzwraca cenę pojedynczych drzwi na podstawie ich długości. Zwraca NApoza zakres [60,120].
  2. Na podstawie specyfikacji całkowita liczba drzwi nie może być większa niż 16 (całkowita długość 1000). Testowana jest cała liczba drzwi od 16 do 1, a tryplet (number of doors, door width, total price)jest zwracany.
  3. orderFunkcja służy do zlokalizowania cenę minimalną; na tej podstawie wyodrębniany jest właściwy tryplet. W przypadku remisów order zwróci wpis, który jest pierwszy, a ponieważ zapętliliśmy od 16 do 1, zwrócona zostanie największa liczba drzwi (najmniejsza szerokość drzwi).
JayCe
źródło
Używanie stepfunjest dłuższe - ponieważ należy usunąć szerokość poza [60,120].
JayCe,