Toasty, Burnt, Brûlée!


8

Es stellt sich heraus, dass mein Toaster ein bisschen kaputt ist. Es hat WiFi verloren (Sie wissen, es ist einer dieser neuen intelligenten Toaster), und es ist verrückt geworden! Da es nicht mehr funktioniert, musste ich mich in den Quellcode meines Frühstücks hacken und Plate.bread.toastAs(3);jeden Morgen ausführen . Wirst du helfen?

Mein Toaster nimmt eine Eingabe vor: die Zeit, die Sie Ihr Brot rösten möchten. Dies ist geschrieben als min:sec, wie 5:45oder 0:40(bis zu 59:59). Anschließend wird ein bestimmter Wert für verschiedene Röststufen zurückgegeben:

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)

Aber hier ist der Haken: Mein Toaster hat eine kaputte Tastatur! Ihr Code darf keine Semikolons oder ... Doppelpunkte enthalten. Dies könnte schwieriger sein, als der Toaster-Mechaniker sagte ...

Hier sind einige Testfälle, damit Sie ... Ihre Fälle testen können?

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

Ist die Zeit höchstens 59:59?
xnor

5
Sollte es nicht sein 3:31 and up: Brulee?
Mego

3
Wo sind all die Golfsprachen, in denen Doppelpunkte sowieso nicht verwendet würden?
Jo King

1
Ich habe bis jetzt nicht bemerkt, warum es keine Python-Einreichungen gibt ...
Redwolf Programs

1
Können wir Eingaben mit einer führenden Null aufnehmen, sodass alle Eingaben 5 Zeichen lang sind?
Quintec

Antworten:


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])]

Probieren Sie es online aus!

-6 danke an @tsh und danke auch an die TIO-Testfälle.

-2 mit ein paar coolen Tipps von @BlackOwlKai

Wirft ein ValueErrorfür ungültige Eingaben, die nicht in einen Float konvertiert werden können. Bei Zahlen unter 0 wird "Brot" zurückgegeben, da es sich immer noch um Brot handelt. Ratet mal, wenn wir wirklich streng darauf achten, dass die Eingabe eine gültige Zeit ist, könnte dies erfolgen, aber für mich war das Interessante, wie man das :in Python vermeidet .



@tsh Danke für den tollen Trick und danke auch für die TIO-Tests.
ElPedro

-1 Byte durch Ersetzen floatdurcheval
Black Owl Kai

1
Danke @BlackOwlKai. Hatte das nicht gesehen. Wird morgen mit entsprechenden Credits aktualisiert ☺
ElPedro

1
-1 Byte, weil chr(58)auf"\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: entfernte AS Schlüsselwörter, kombinierte DECLARE Anweisungen (dank BradC )
-51 Bytes: geänderte Deklarationen / where-Klausel, um die Datetime-Funktionalität von SQL zu nutzen
-10 Bytes: geändert MINUTE in N und SECOND nach S (dank BradC )

Wussten Sie, dass SQL Zeichenfolgen in einer angemessenen Kapazität nicht nativ aufteilen kann? Lass dich nicht STRING_SPLITtäuschen. es funktioniert nicht dafür. Zumindest bin ich nicht klug genug, um es herauszufinden.

Anders als die tabellenbasierte T-SQL-Lösung von BradC .

Ungolfed:

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

Sie könnten so etwas tun SELECT value FROM STRING_SPLIT(@i,CHAR(58)), obwohl ich mich frage, ob a TRY_CAST(@i AS TIME)vielleicht ein paar Ecken abschneiden könnte.
BradC

Interessante Sprache zum Golfen!
Redwolf Programme

@BradC Ich habe es so versucht STRING_SPLIT, aber es funktioniert nicht genau so, wie Sie denken - es gibt tatsächlich beide Werte von jeder Seite gleichzeitig zurück, und Sie können die Daten nicht überprüfen (zumindest konnte ich das herausfinden ). Für die Verwendung TRY_CASTsieht es so aus, als müsste "00:" an die Vorderseite angehängt werden. Ich könnte vielleicht weiter damit arbeiten.
Erdmännchen

1
Ja, STRING_SPLITgibt sie als separate Zeilen zurück. Auch ohne diese Teile zu ändern, können Sie eine Menge Bytes sparen, indem Sie nur Ihre allerersten behalten DECLAREund den Rest in Kommas ändern. Auch fallen lassen ASund einfach tunDECLARE @i varchar(99),@a varchar(9)=...
BradC

Ja, guter Anruf. Da @aund @bbeides allerdings erfordern @i, muss ich das separat deklarieren. Kann dort aber noch einige Bytes sparen.
Erdmännchen

3

Java 8, 148 Bytes

ein Lambda von StringbisString

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}

\u003bund \u003asind Source-Level - Unicode - Escape - Sequenzen , die für ;und :verbunden.

Probieren Sie es online aus

Ungolfed

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
}

Danksagung


.replaceAllkann sein .replaceund Integer.parseIntkann sein new Integeroder new Shortsogar, um 10 Bytes zu sparen: Versuchen Sie es online 162 Bytes .
Kevin Cruijssen

148 Bytes durch Ändern der Aufteilung in einen einfachen ternären Operator und Verwenden eines floatanstelle eines int, um die "Hunderte" Bytes zu schonen.
Olivier Grégoire

Nett. Danke Leute!
Jakob


2

PHP, 96 Bytes

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

erfordert PHP 5.5 oder höher. Laufen Sie als Pipe mit -nFoder probieren Sie es online aus .


2

T-SQL, 143 155 145 Bytes

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)

Zeilenumbrüche dienen nur der Lesbarkeit. Andere Methode als die variablenbasierte SQL-Lösung von Meerkat .

Die Eingabe erfolgt über bereits vorhandene Tabelle entnommen i mit varchar Feld v , je unseren IO - Standards . Diese Eingabetabelle ist mit unseren Grenzwerten (in Sekunden) und den gewünschten Beschriftungen mit einer In-Memory-Tabelle t verbunden .

Die Magie geschieht in der WHEREKlausel: DATEDIFFBerechnet die Differenz in Sekunden zwischen Mitternacht und unserer Eingabe (mit einem zusätzlichen 0:an der Vorderseite) und gibt dann das niedrigste übereinstimmende Etikett zurück (über das TOP 1).

Ungültige Eingaben geben entweder einen unvorhersehbaren Wert zurück oder geben einen Fehler aus:
Conversion failed when converting date and/or time from character string.

Die Frage war etwas vage, aber bei Bedarf kann ich diese Fehler vermeiden (und nichts zurückgeben), indem ich LIKEder WHEREKlausel das folgende Muster hinzufüge und die Gesamtbytes auf 238 211 201 bringe :

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

BEARBEITEN : Meine ursprünglich kürzere Einreichung schlug für Eingaben fehl 24:00, da ich sie als behandelte hh:mm. Musste das '0'+CHAR(58)+Präfix hinzufügen , das 12 Bytes hinzufügte.

EDIT 2 : 27 Bytes aus der LIKEin meiner alternativen Version rasiert

EDIT 3 : Aus ORDER BYbeiden Versionen entfernt, da es sich beim Testen als unnötig erwiesen hat. (SQL garantiert nicht, dass die Sortierreihenfolge ohne explizite Beibehaltung beibehalten wird ORDER BY, aber in diesem speziellen Fall schien es für mich gut zu funktionieren.)


2

05AB1E , 43 42 Bytes

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

Probieren Sie es online aus oder überprüfen Sie weitere Testfälle .

Erläuterung:

þ                # 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"

Sehen Sie diese 05AB1E Spitze von mir (Abschnitte Wie das Wörterbuch benutzen? Und Wie zu komprimieren Strings nicht Teil des Wörterbuchs? ) Zu verstehen , warum „©Ãº™ist "warm bread"und .•liSÕô6>Āµ·•ist "bruleetoastyburnt".

þ30тx330)ćkann alternativ 30тx)DOªsþfür die gleiche Anzahl von Bytes sein: Probieren Sie es online aus.


1

Javascript (ES6 +), 180 Bytes

Node.js (180 Bytes)

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 Bytes):

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'")

Ich muss diese Unicode-Escape-Sequenzen verwenden :-) Nur eine große Kette ternärer Operatoren mit Variablen, die durch Standardparameter definiert sind. Auch ein Einzeiler, also keine semikolonhungrigen js


Ich habe einen regulären Ausdruck verwendet, um die 59:59 & keine negativen Regeln durchzusetzen :-)
Michael

OH WAIT Ich habe vergessen, dass ich hinzugefügt habe:
Michael

tatsächlich gemacht :-)
Michael

1
Sie brauchen keinen regulären Ausdruck, um die 59:59 zu erzwingen, und keine Negative ... sie können zu allem führen, sei es ein Fehler, nichts oder Brulee.
Redwolf Programme

1

Retina 0,8,2 , 97 Bytes

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

Probieren Sie es online aus! Link enthält Testfälle. Explantation:

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

Konvertieren Sie die Minuten und Sekunden in unär.

+`1#
#60$*

Multiplizieren Sie die Minuten mit 60 und addieren Sie sie zu den Sekunden.

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

Dekodiere die Sekunden in die Toastigkeit.

#1{31,}
Warm #

Dekodieren Sie warmes Brot, indem Sie beachten, dass #(für 0:00) dekodiert zu Bread.

#1*
Bread

Wenn wir noch keinen Toast haben, ist das Brot immer noch kalt.




1

Schnapp! 4,2 , 257 251 Bytes

Die Textversion wurde weiter minimiert.

Ich habe in Snap!, Einer visuellen Programmiersprache ähnlich wie Scratch, keine Antworten gefunden, daher verwende ich die Scratchblocks2-Syntax und tue so, als ob Snap! Exklusive Blöcke sind in Scratchblocks2 gültig.

Probieren Sie es online aus! (Klicken Sie auf die Schaltfläche mit den beiden Pfeilen, um den Code anzuzeigen.)

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 Bytes

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)

Probieren Sie es online aus!

Gibt a factormit dem entsprechenden Level zurück.

-5 Bytes dank JayCe.


Würde das funktionieren? tio.run/…
JayCe

@ JayCe IDK, die Eingabe ist "jedes akzeptable Format", aber dann nimmt alles die Zeichenfolge ... Ich werde in den Kommentaren fragen.
Giuseppe

@ JayCe Ich bin nicht sicher, was du meinst. Soweit ich sehen kann, dauert es die Zeit als Eingabe für eine Funktion, die eine akzeptable Eingabe ist. IMO
Redwolf Programs

Und Sie können auch tun30*c(0,1,2,4,7,Inf)
JayCe

@RedwolfPrograms die Eingabe ist keine Zeit, es ist ein Array, :ist der Sequenzoperator.
Giuseppe

1

Japt , 48 Bytes

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

Probieren Sie es online aus!

5 Bytes durch Lesen der Tipps gespart ...

Erläuterung:

`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 ":"

Ein zusätzliches Byte könnte durch Ausgabe in Kleinbuchstaben gespart werden.




@LuisfelipeDejesusMunoz Beide enthalten einen Doppelpunkt, der von der Herausforderung nicht zugelassen wird. spart jedoch ein Byte, und ich habe nicht darüber nachgedacht, ob alle Kleinbuchstaben zulässig sind.
Kamil Drakari

1

Gelee , 43 41 40 Bytes

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

Probieren Sie es online aus!

Erklärung (alt)

“¡Ḳḋ\ḞvṾƤSİƓƥeF½ÞØ+®°»ist die komprimierte Zeichenfolge Warm Bread\nToasty\nBurnt\nBrulee\nBread, die vom Komprimierungsoptimierer gefunden wird .

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.

Inspiriert von Kamil Drakaris Antwort .

-2 Bytes mit Snippet ~~Ḍvon Dennis.


1

Runenverzauberungen , 118 Bytes

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

Probieren Sie es online aus!

Verwendet einige nicht druckbare ASCII-Zeichen (STX, EOT, SOH, STX, VT, SOH, STX, DC2, SOH und STX in dieser Reihenfolge) in der ersten Zeile, die eine Folge von Bytes in der Reihenfolge lesen, in der sie sich befinden wird auf dem Stapel benötigt werden. Anschließend werden 3 Divide ( 't'/2Equals :) - und Reflective-Write-Operationen ausgeführt. Dadurch werden 3 :(doppelte) Befehle dort abgelegt, wo derzeit .(NOP) vorhanden sind, um die Eingabe zerstörungsfrei mit den Zeitschwellenwerten zu vergleichen. Ein vierter :bleibt auf dem Stapel, bevor die Eingabe gelesen wird.

Die Zeit wird als Zeichenfolge eingelesen, dann aufgeteilt :und wieder zu einer Zeichenfolge verkettet. Da die obigen Werte 59:59keine Spezifikation für die Ausgabe haben, haben Werte wie 1:00:00undefinierte (aber deterministische) Ausgabe. Diese Zeichenfolge wird dann in eine Zahl konvertiert und mit 30, 100, 200 und 330 (dem Bytewert von Ŋ) verglichen . "Bread"(Zeile 3, Ausführen von RTL) wird zweimal verwendet, sowohl für Breadals auch für die Warm BreadErgebnisse, wodurch mindestens 5 Bytes eingespart werden.

Spart 1 Byte, indem kein klassischer Terminator-Befehl ( ;) verwendet wird, indem stattdessen Fizzle in der letzten Zeile verwendet wird. Dies überzeugt den Parser davon, dass das Programm garantiert beendet wird, ohne dass dies sofort erfolgt (und, was noch wichtiger ist, den Stapel nicht berührt). Gültige Eingaben lassen den Stapel leer, sodass wdie IP-Adresse für die Ausführung einer unzulässigen Aktion beendet wird , wenn sie sich um eine Schleife dreht und eine berührt .


Nachdem ich den Namen dieser Sprache gelesen habe, habe ich aus irgendeinem Grund das Bild eines Assistenten, der ASCII-Codepunkte singt, in meinem Kopf.
Redwolf Programme


0

Javascript, 115 101 Bytes

-6 von 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]

Führen Sie einige Testfälle mit diesem Stack-Snippet aus:

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, ich habe ein paar Möglichkeiten verpasst, als ich versucht habe, Bytes zu speichern. Arbeiten an einem Fix.
Mego

0

F #, 177 Bytes

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"

Probieren Sie es online aus!

Vielen Dank an Jo King, der meine, ähm, unnötig wörtliche Interpretation der Herausforderung korrigiert hat ...

F # ist für Funktionen ohne Semikolons oder Doppelpunkte ziemlich in Ordnung. Das einzige wirkliche Problem war, dass ich i.Splitohne eine Typanmerkung nicht direkt auskommen konnte - F # hätte den Typ von nicht ibasierend auf dem Methodenaufruf ableiten können . Dazu hätte man den Typ direkt in der Funktion definieren müssen, wie let t (i:string)=es gegen die Regeln verstoßen hätte.

Aber ich konnte leicht daran vorbeikommen i.ToString(), was mir dann erlaubte, Splitdarauf zurückzugreifen. Dann char 58ist ein Doppelpunkt, und danach ist es einfach.


Aber genau das steht in der Anforderungsspezifikation! : P
Ciaran_McCarthy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.