Roti bakar, Burnt, Brûlée!


8

Ternyata pemanggang roti saya sedikit rusak. Itu kehilangan WiFi (Anda tahu, itu salah satu pemanggang roti pintar bermodel baru), dan itu sudah gila! Karena tidak lagi berfungsi, saya harus meretas kode sumber sarapan saya dan menjalankannya Plate.bread.toastAs(3);setiap pagi. Maukah Anda membantu?

Pemanggang roti saya membutuhkan satu input: jumlah waktu yang Anda inginkan untuk memanggang roti Anda. Ini ditulis sebagai min:sec, seperti 5:45atau 0:40(Hingga 59:59). Ini kemudian mengembalikan nilai spesifik untuk berbagai tingkat roti panggang:

0:00-0:30 = Bread
0:31-1:00 = Warm Bread
1:01-2:00 = Toasty
2:01-3:30 = Burnt
3:31 and up = Brûlée (or Brulee)

Tapi inilah intinya: pemanggang roti saya memiliki keyboard yang rusak! Kode Anda tidak boleh mengandung titik koma atau ... titik dua. Ini mungkin lebih sulit daripada tukang reparasi pemanggang roti mengatakan itu akan ...

Berikut ini beberapa kasus uji, jadi Anda dapat ... menguji kasus Anda?

0:00 = Bread
5:50 = Brulee or Brûlée
2:00 = Toasty
ChicknMcNuggets = Anything
-1:00 = Anything
0:60 = Anything
1 = Anything
60:00 = Anything
1:00:00 = Anything

Apakah waktu paling banyak 59:59?
xnor

5
Bukankah seharusnya begitu 3:31 and up: Brulee?
Mego

3
Di mana semua bahasa golf di mana titik dua tidak akan digunakan?
Jo King

1
Saya belum menyadari sampai sekarang mengapa tidak ada pengiriman Python ...
Program Redwolf

1
Bisakah kita menerima input dengan nol di depan sehingga semua input panjangnya 5 karakter?
Quintec

Jawaban:


3

Python 2 , 124 118 116

t=eval(input().replace("\x3A","."))
print["Bread","Warm Bread","Toasty","Burnt","Brulee"][sum([t>3.3,t>2,t>1,t>.3])]

Cobalah online!

-6 dengan terima kasih kepada @tsh dan juga terima kasih atas kasus uji TIO.

-2 dengan beberapa tips keren dari @BlackOwlKai

Melempar ValueErrorinput yang tidak valid yang tidak dapat dikonversi ke float. Untuk angka kurang dari 0 mengembalikan "Roti" karena masih roti. Tebak jika kita benar-benar ketat untuk memastikan bahwa input adalah waktu yang valid, itu bisa dilakukan tetapi bagi saya yang menarik adalah bagaimana menghindari dengan :Python.



@tsh Terima kasih atas triknya dan terima kasih juga untuk tes TIO.
ElPedro

-1 byte dengan mengganti floatoleheval
Black Owl Kai

1
Terima kasih @BlackOwlKai. Belum melihat itu. Akan diperbarui besok dengan kredit yang sesuai ☺
ElPedro

1
-1 byte karena chr(58)dapat disingkat menjadi"\x3A"
Black Owl Kai

3

T-SQL, 409 379 328 318 byte

DECLARE @i varchar(9)DECLARE @a time='0'+CHAR(58)+@i DECLARE @ int=DATEPART(N,@a),@s int=DATEPART(S,@a)SELECT CASE WHEN @<1AND @s<31THEN'Bread'WHEN @<1OR @=1AND @s=0THEN'Warm Bread'WHEN @<2OR @=2AND @s=0THEN'Toasty'WHEN @<3OR @<4AND @s<31THEN'Burnt'ELSE'Brulee'END WHERE LEN(RIGHT(@i,LEN(@i)-CHARINDEX(CHAR(58),@i)))=2

-30 bytes: dihapus AS kata kunci, dikombinasikan DECLARE pernyataan (terima kasih kepada BradC )
-51 bytes: berubah deklarasi / mana klausa untuk mengambil keuntungan dari SQL fungsi datetime
-10 byte: berubah MINUTE ke N dan SECOND untuk S (terima kasih kepada BradC )

Tahukah Anda bahwa SQL tidak dapat secara alami membagi string dalam kapasitas yang layak? Jangan biarkan STRING_SPLITmembodohi Anda; tidak berhasil untuk ini. Atau setidaknya, saya tidak cukup pintar untuk mengetahuinya.

Berbeda dari solusi T-SQL berbasis tabel BradC .

Tidak Disatukan:

-- Input variable
DECLARE @i varchar(9)

-- Time declarations (passes in as form "00:mm:ss")
-- CHAR(58) maps to ':'
DECLARE @a time = '0' + CHAR(58) + @i

-- Integer declarations
DECLARE @ int = DATEPART(N, @a),    -- minutes
        @s int = DATEPART(S, @a)    -- seconds

SELECT CASE
            WHEN @ < 1 AND @x < 31              -- 0:00 - 0:30
                THEN 'Bread'
            WHEN @ < 1 OR @ = 1 AND @x = 0      -- 0:31 - 1:00
                THEN 'Warm Bread'
            WHEN @ < 2 OR @ = 2 AND @x = 0      -- 1:01 - 2:00
                THEN 'Toasty'
            WHEN @ < 3 OR @ < 4 AND @x < 31     -- 2:01 - 3:30
                THEN 'Burnt'
            ELSE 'Brulee'                       -- 3:31 - 59:59
       END

-- Setting input as a time means that you only have to check if the seconds input is two characters, all other checks accounted for
WHERE LEN(RIGHT(@i, LEN(@i) - CHARINDEX(CHAR(58), @i))) = 2

Anda dapat melakukan sesuatu seperti SELECT value FROM STRING_SPLIT(@i,CHAR(58)), meskipun saya bertanya-tanya apakah TRY_CAST(@i AS TIME)mungkin ada jalan pintas.
BradC

Bahasa yang menarik untuk bermain golf!
Program Redwolf

@BradC Saya mencoba melakukan hal STRING_SPLITitu, tetapi tidak persis bekerja seperti yang Anda pikirkan - itu benar-benar mengembalikan kedua nilai dari setiap sisi secara bersamaan, dan Anda tidak dapat melakukan pemeriksaan data apa pun (setidaknya saya bisa mencari tahu ). Sedangkan untuk menggunakan TRY_CAST, sepertinya perlu "00:" ditambahkan ke depan. Saya mungkin bisa bekerja lebih jauh dengan itu.
Meerkat

1
Ya, STRING_SPLITkembalikan sebagai baris terpisah. Bahkan tanpa mengubah bagian-bagian itu, Anda masih dapat menghemat banyak byte dengan hanya mempertahankan yang pertama DECLAREdan mengubah sisanya menjadi koma. Juga turun ASdan lakukan sajaDECLARE @i varchar(99),@a varchar(9)=...
BradC

Ya, panggilan yang bagus. Karena @adan @bkeduanya memerlukan @i, saya harus menyatakan itu secara terpisah. Masih bisa menyimpan beberapa byte di sana.
Meerkat

3

Java 8, 148 byte

sebuah lambda dari StringkeString

t->{float n=new Float(t.replace("\72","."))\u003breturn n>3.3?"Brulee"\u003an>2?"Burnt"\u003an>1?"Toasty"\u003an>.3?"Warm Bread"\u003a"Bread"\u003b}

\u003bdan \u003amerupakan urutan pelepasan Unicode tingkat sumber untuk ;dan :masing - masing.

Cobalah secara Online

Tidak disatukan

t -> {
    float n = new Float(t.replace("\72",".")) \u003b
    return
        n > 3.3 ? "Brulee" \u003a
            n > 2 ? "Burnt" \u003a
            n > 1 ? "Toasty" \u003a
            n > .3 ? "Warm Bread" \u003a
            "Bread"
    \u003b
}

Ucapan Terima Kasih


.replaceAlldapat .replacedan Integer.parseIntdapat new Integer, atau new Shortbahkan, untuk menyimpan 10 byte: Cobalah secara online 162 byte .
Kevin Cruijssen

148 byte dengan mengubah split menjadi operator ternary sederhana dan menggunakan floatbukan int untuk cadangan pada "ratusan" byte.
Olivier Grégoire

Bagus. Terima kasih teman-teman!
Jakob


2

PHP, 96 byte

<?=[Bread,"Warm Bread",$t=Toasty,$t,$u=Burnt,$u,$u,Brulee][min(7,2*$argn+substr($argn,-2)/30)]?>

membutuhkan PHP 5.5 atau yang lebih baru. Jalankan sebagai pipa dengan -nFatau coba online .


2

T-SQL, 143 155 145 byte

SELECT TOP 1b FROM i,
(VALUES(31,'Bread'),(61,'Warm Bread'),(121,'Toasty'),(211,'Burnt'),(1E4,'Brulee'))t(a,b)
WHERE a>DATEDIFF(s,0,'0'+CHAR(58)+v)

Jeda baris hanya untuk keterbacaan. Metode yang berbeda dari solusi SQL berbasis variabel Meerkat .

Input diambil melalui tabel i yang sudah ada sebelumnya dengan bidang varchar v , sesuai standar IO kami . Tabel input tersebut disatukan secara silang ke tabel in-memory t dengan nilai cutoff kami (dalam detik) dan label yang diinginkan.

Keajaiban terjadi di WHEREklausa: DATEDIFFmenghitung perbedaan dalam detik antara tengah malam dan input kami (dengan tambahan yang 0:terpasang di depan), lalu mengembalikan label pencocokan terendah (melalui TOP 1).

Input yang tidak valid baik mengembalikan nilai yang tidak dapat diprediksi atau melemparkan kesalahan:
Conversion failed when converting date and/or time from character string.

Pertanyaannya agak kabur, tetapi jika perlu saya bisa menghindari kesalahan ini (dan tidak mengembalikan apa pun) dengan menambahkan LIKEpola berikut ke WHEREklausa, menjadikan total byte ke 238 211 201 :

AND RIGHT('0'+v,5)LIKE'[0-5][0-9]'+CHAR(58)+'[0-5][0-9]'

EDIT : Kiriman asli saya yang lebih pendek gagal menerima input 24:00, karena saya memperlakukannya sebagai hh:mm. Harus menambahkan '0'+CHAR(58)+awalan, yang menambahkan 12 byte.

EDIT 2 : Mencukur 27 byte dari LIKEdalam versi alternatif saya

EDIT 3 : Dihapus ORDER BYdari kedua versi, karena terbukti tidak perlu dalam pengujian. (SQL tidak menjamin tata urutan akan dipertahankan tanpa eksplisit ORDER BY, tetapi tampaknya berfungsi dengan baik untuk saya dalam kasus khusus ini.)


2

05AB1E , 43 42 byte

þ30тx330)ć‹O„©Ãº™D#θ‚R.•liSÕô6>µ·•6ôÀ«™sè

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Penjelasan:

þ                # Leave only the digits of the (implicit) input
                 #  i.e. "1:15" → 115
 30              # Push 30
   т             # Push 100
    x            # Pop and push 100 and 100 doubled (200)
     330         # Push 330
        )        # Wrap the stack into a list: [inputDigits,30,100,200,330]
         ć       # Pop and push the head and rest of array as separated items to the stack
                # Check for each if its smaller than the head (1=truthy, 0=falsey)
                 #  i.e. [30,100,200,330] and 115 → [1,1,0,0]
           O     # Take the sum of this
                 #  i.e. [1,1,0,0] → 2
„©Ãº™            # Push string "warm bread"
     D#          # Duplicate it, and split it by spaces: ["warm","bread"]
       θ         # And only leave the last element: "bread"
        R       # Pair them into a list, and reverse that list: ["bread","warm bread"]
.•liSÕô6>µ·•    # Push string "bruleetoastyburnt"
             6ô  # Split into parts of size 6: ["brulee","toasty","burnt"]
               À # Rotate it once towards the left: ["toasty","burnt", "brulee"]
«                # Merge both lists together:
                 #  ["bread","warm bread","toasty","burnt","brulee"]
                # Titlecase each word: ["Bread","Warm Bread","Toasty","Burnt","Brulee"]
  s              # Swap so the number is at the top of the stack again
   è             # Index it into the list (and output implicitly)
                 #  i.e. 2 → "Toasty"

Lihat tip tambang 05AB1E ini (bagian Cara menggunakan kamus? Dan Cara mengompresi string bukan bagian dari kamus? ) Untuk memahami mengapa „©Ãº™ini "warm bread"dan .•liSÕô6>µ·•sekarang "bruleetoastyburnt".

þ30тx330)ćatau bisa juga 30тx)DOªsþuntuk byte-count yang sama: Coba online.


1

Javascript (ES6 +), 180 byte

Node.js (180 byte)

let f=(s,i=s.split("\u{3a}"),j=i[0]*60+1*i[1],k="Bread",l=assert(new RegExp("^(.|[0-5].)\u{3a}[0-5].$").test(s)))=>eval("(j<31)?k\u{3a}(j<61)?'Warm '+k\u{3a}(j<121)?'Toasty'\u{3a}(j<211)?'Burnt'\u{3a}'Brulee'")

Browser (188 byte):

let f=(s,i=s.split("\u{3a}"),j=i[0]*60+1*i[1],k="Bread",l=console.assert(new RegExp("^(.|[0-5].)\u{3a}[0-5].$").test(s)))=>eval("(j<31)?k\u{3a}(j<61)?'Warm '+k\u{3a}(j<121)?'Toasty'\u{3a}(j<211)?'Burnt'\u{3a}'Brulee'")

Harus menggunakan urutan escape unicode :-) hanya rantai besar operator ternary, dengan variabel yang ditentukan oleh parameter default. Juga satu-liner, jadi tidak ada js lapar titik koma


Saya menggunakan regex untuk menegakkan aturan 59:59 & tidak ada aturan negatif :-)
Michael

OH TUNGGU Saya lupa saya menambahkan:
Michael

benar-benar dilakukan :-)
Michael

1
Anda tidak perlu regex untuk menerapkan 59:59 dan tidak ada negatif ... mereka dapat menghasilkan apa pun, baik itu kesalahan, tidak ada, atau Brulee.
Program Redwolf

1

Retina 0.8.2 , 97 byte

.+(..)
$*1#$1$*
+`1#
#60$*
#1{211,}
Brulee
#1{121,}
Burnt
#1{61,}
Toasty
#1{31,}
Warm #
#1*
Bread

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

.+(..)
$*1#$1$*

Ubah menit dan detik menjadi unary.

+`1#
#60$*

Lipat gandakan menit dengan 60 dan tambahkan ke detik.

#1{211,}
Brulee
#1{121,}
Burnt
#1{61,}
Toasty

Dekode detik ke dalam roti panggang.

#1{31,}
Warm #

Decode Warm Bread dengan mencatat bahwa #(untuk 0:00) diterjemahkan ke Bread.

#1*
Bread

Jika kita belum bersulang, maka roti itu masih dingin.



1

C (gcc) , 130 byte

f(a){if(*strchr(a,58)=48,a=atoi(a),a=(int*[]){"Bread","Warm Bread","Toasty","Burnt","Brulee"}[(a>30)+(a>1e3)+(a>2e3)+(a>3030)]){}}

Cobalah online!


1

Jepret! 4.2 , 257 251 byte

Minimalkan versi teks lagi.

Saya belum menemukan jawaban di Snap !, bahasa pemrograman visual yang mirip dengan Scratch, jadi saya akan menggunakan sintaks scratchblocks2, berpura-pura bahwa Snap! blok eksklusif berlaku di scratchblocks2.

Cobalah online! (klik tombol dengan dua panah untuk melihat kode)

when gf clicked
ask[]and wait
set[l v]to(split(answer)by(unicode(58)as letter
set [t v]to(((item(1 v)of(l))*(60))+(item(2 v)of(l
if<(t)<[31
say[Bread
else
if<(t)<[61
say[Warm Bread
else
if<(t)<[121
say[Toasty
else
if<(t)<[211
say[Burnt
else
say[Brulee

1

R , 127 122 byte

function(t)cut((x=eval(parse(t=t)))[1]*60+tail(x,1),30*c(0:2,4,7,Inf),c("Bread","Warm Bread","Toasty","Burnt","Brulee"),T)

Cobalah online!

Mengembalikan a factordengan level yang sesuai.

-5 byte terima kasih kepada JayCe.


Apakah ini akan berhasil? tio.run/…
JayCe

@JayCe IDK, inputnya adalah "format apa pun yang dapat diterima" tetapi kemudian semuanya mengambil string ... Saya akan bertanya dalam komentar.
Giuseppe

@JayCe Saya tidak yakin apa yang Anda maksud. Sejauh yang saya bisa lihat, dibutuhkan waktu sebagai input ke fungsi yang merupakan input yang dapat diterima IMO
Redwolf Programs

Dan Anda juga bisa melakukannya30*c(0,1,2,4,7,Inf)
JayCe

@RedwolfPrograms input bukanlah waktu, ini adalah array, :adalah operator urutan.
Giuseppe

1

Japt , 48 byte

`BÎ%
W‡m BÎ%
To†ty
B¨›
BrÔ‡`·g[30LLÑ,330]è<Ur58d

Cobalah online!

Disimpan 5 byte dengan benar-benar membaca tips ...

Penjelasan:

`BÎ%...BrÔ‡`·                       Compressed array of possible outputs
             g                      Get the one at the index given by...
                         è          The number of items...
              [30LLÑ,330]           From the list [30,100,200,330]...
                          <Ur58d    Which are less than the input without ":"

Sebuah byte ekstra bisa diselamatkan oleh keluaran dalam semua kasus yang lebih rendah.




@LuisfelipeDejesusMunoz keduanya mengandung titik dua, yang tidak diizinkan oleh tantangan. menghemat satu byte, dan saya tidak memikirkan apakah semua huruf kecil diperbolehkan.
Kamil Drakari

1

Jelly , 43 41 40 byte

fØD~~ḌH“Ð2dʠ‘<Sị“¡Ḳḋ\ḞvṾƤSİƓƥeF½ÞØ+®°»Ỵ¤

Cobalah online!

Penjelasan (lama)

“¡Ḳḋ\ḞvṾƤSİƓƥeF½ÞØ+®°»adalah string terkompresi Warm Bread\nToasty\nBurnt\nBrulee\nBread, ditemukan oleh optimizer kompresi .

fØD                               Filter out the non-digits (i.e. colon) from input
   ~~                             Use binary NOT twice to convert to digit list
     Ḍ                          
      HḞ                        Halve and floor. Now we have "01:45" -> 72.
        “Ç1cƥ‘                    The array [14,49,99,164]
              <                   Vectorized less than
               S                  Sum
fØD~~ḌHḞ“Ç1cƥ‘<S                How many threshold times is input less than?
                                           (0 -> Bread, 4 -> Brulee.)
                ị               Index (note 0ị gives the last list item) into
                       ¤        the new dyadic link given by
                 “...»            The long string, decoded and
                      Ỵ           split by newlines.

Terinspirasi oleh jawaban Kamil Drakari .

-2 byte menggunakan cuplikan ~~Ḍdari Dennis.


1

Pesona Rahasia , 118 byte

\>`tttt`,kw,kw,kw,ki
\uqn.3X)?\ . 1C)?\.2C)?\'Ŋ)?\"Brulee"
\D"daerB"L" mraW"/
$L"ytsaoT"L?9"tnruB"L?aL?3 F/

Cobalah online!

Memanfaatkan beberapa karakter ASCII yang belum dicetak (STX, EOT, SOH, STX, VT, SOH, STX, DC2, SOH, dan STX dalam urutan itu) pada baris pertama, yang membaca dalam urutan byte dalam urutan bahwa mereka akan dibutuhkan di stack. 3 membagi ( 't'/2sama dengan :) dan operasi menulis reflektif kemudian dilakukan. Ini menempatkan 3 :(duplikat) perintah di mana ada saat ini .(NOP) untuk membandingkan secara non-destruktif input dengan ambang waktu. Yang keempat :ditinggalkan di tumpukan sebelum membaca input.

Waktu dibaca sebagai string, kemudian dibagi :, dan digabungkan kembali menjadi string. Karena nilai-nilai di atas 59:59tidak memiliki spesifikasi pada output, nilai-nilai seperti 1:00:00akan memiliki output yang tidak ditentukan (tetapi deterministik). String ini kemudian dikonversi ke angka dan dibandingkan dengan 30, 100, 200, dan 330 (nilai byte Ŋ). "Bread"(baris 3, menjalankan RTL) digunakan dua kali, baik untuk Breaddan Warm Breadhasil, menghemat setidaknya 5 byte.

Menghemat 1 byte dengan tidak memiliki perintah terminator klasik ( ;) dengan menggunakan Fizzle pada baris terakhir. Ini meyakinkan parser bahwa program dijamin akan berakhir tanpa menyebabkannya melakukannya segera (dan, yang lebih penting, tidak menyentuh tumpukan). Input yang valid akan meninggalkan tumpukan kosong sehingga ketika loop dan menyentuh wIP dihentikan untuk melakukan tindakan ilegal.


Setelah membaca nama bahasa ini, saya karena beberapa alasan memiliki gambar penyihir meneriakkan titik kode ASCII terjebak di kepala saya.
Program Redwolf


0

Javascript, 115 101 byte

-6 dari tsh

d=>[b="Bread","Warm "+b,a="Toasty",a,c="Burnt",c,c][~~(parseInt(d)*1.999+d.slice(-2)/30.1)]||"Brulee"

0

JavaScript (ES6), 171 byte

(x,y=Math.ceil(x.split(/\D/).reduce((a,b)=>(+a)*60+(+b))/30))=>["Bread","Bread","Warm Bread","Toasty","Toasty","Burnt","Burnt","Burnt","Brulee","Brulee","Brulee"][y>8?8:y]

Jalankan beberapa test case dengan Stack Snippet ini:

var f=(x,y=Math.ceil(x.split(/\D/).reduce((a,b)=>(+a)*60+(+b))/30))=>["Bread","Bread","Warm Bread","Toasty","Toasty","Burnt","Burnt","Burnt","Brulee","Brulee","Brulee"][y>8?8:y]

var result = document.getElementById("result");
["0:00", "0:30", "0:31", "1:00", "1:01", "2:00", "2:01", "2:30", "2:31", "3:00", "3:01", "3:30", "3:31", "4:00", "4:01", "4:30", "4:31", "5:00", "6:00"].forEach(x => result.innerHTML += `${x}: ${f(x)}\n`);
<pre id="result"></pre>


@JoKing Whoops, saya melewatkan beberapa kemungkinan saat mencoba menyelamatkan byte. Bekerja pada perbaikan.
Mego

0

F #, 177 byte

let t i=
 let s=i.ToString().Split(char 58)
 let m=int s.[0]*60+int s.[1]
 if m<31 then"Bread"elif m<61 then"Warm Bread"elif m<121 then"Toasty"elif m<211 then"Burnt"else"Brulee"

Cobalah online!

Terima kasih kepada Jo King karena telah meluruskan interpretasi literal saya yang tidak perlu tentang tantangan ...

F # cukup oke untuk fungsi tanpa tanda titik dua atau titik dua. Satu-satunya masalah sebenarnya adalah bahwa saya tidak dapat melakukan i.Splitsecara langsung tanpa anotasi tipe - F # tidak akan dapat menyimpulkan tipe iberdasarkan pada pemanggilan metode. Itu akan membutuhkan mendefinisikan jenis langsung di fungsi, seperti let t (i:string)=yang akan melanggar aturan.

Tapi saya bisa dengan mudah mendapatkannya i.ToString(), yang kemudian memungkinkan saya untuk memanggilnya Split. Kemudian char 58adalah karakter titik dua, dan setelah itu lurus ke depan.


Tapi itulah yang dikatakan spesifikasi kebutuhan! : P
Ciaran_McCarthy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.