Toasty, Burnt, Brûlée!


8

Acontece que minha torradeira está um pouco quebrada. Perdeu o WiFi (você sabe, é uma daquelas torradeiras inteligentes e novas), e está ficando louca! Como ele não funciona mais, eu tenho que invadir o código-fonte do meu café da manhã e executar Plate.bread.toastAs(3);todas as manhãs. Você vai ajudar?

Minha torradeira precisa de uma entrada: a quantidade de tempo que você deseja torrar seu pão. Isso está escrito como min:sec, como 5:45ou 0:40(Até 59:59). Em seguida, ele retorna um valor específico para diferentes níveis de tostagem:

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)

Mas aqui está o problema: minha torradeira tem um teclado quebrado! Seu código não pode conter ponto e vírgula ou ... dois pontos. Isso pode ser mais difícil do que o técnico de torradeira disse que seria ...

Aqui estão alguns casos de teste, para que você possa ... testar seus casos?

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

A hora é no máximo 59:59?
Xnor

5
Não deveria ser 3:31 and up: Brulee?
Mego

3
Onde estão todas as línguas do golfe em que os dois pontos não seriam usados?
Jo rei

1
I have't percebido até agora porque não existem quaisquer submissões Python ...
RedWolf Programas

1
Podemos receber entrada com um zero à esquerda, para que todas as entradas tenham 5 caracteres?
Quintec 3/11

Respostas:


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

Experimente online!

-6 com agradecimentos a @tsh e também obrigado pelos dois casos de teste TIO.

-2 com algumas dicas legais de @BlackOwlKai

Lança a ValueErrorpara entradas inválidas que não podem ser convertidas em um flutuador. Para números inferiores a 0, retorna "Pão" porque ainda é pão. Acho que se somos realmente rigorosos em garantir que a entrada seja um tempo válido, isso poderia ser feito, mas para mim o pouco interessante foi como evitar o :no Python.



@tsh Obrigado pelo truque e também pelos testes TIO.
ElPedro 03/11

-1 byte substituindo floatporeval
Black Owl Kai

1
Obrigado @BlackOwlKai. Não tinha visto isso. Irá atualizar amanhã com créditos apropriados ☺
ElPedro

1
-1 byte porque chr(58)pode ser reduzido para"\x3A"
Black Owl Kai

3

T-SQL, 409 379 328 318 bytes

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: AS palavras-chave removidas , DECLARE instruções combinadas (graças ao BradC )
-51 bytes: declarações alteradas / cláusula where para aproveitar a funcionalidade de data e hora do SQL
-10 bytes: alteradas MINUTE para N e SECOND para S (graças ao BradC )

Você sabia que o SQL não pode dividir nativamente cadeias de caracteres em nenhuma capacidade decente? Não deixe STRING_SPLITenganar você; não funciona para isso. Ou, pelo menos, não sou inteligente o suficiente para descobrir.

Diferente da solução T-SQL baseada em tabela da 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

Você poderia fazer algo como SELECT value FROM STRING_SPLIT(@i,CHAR(58)), embora eu esteja me perguntando se um TRY_CAST(@i AS TIME)pode cortar alguns cantos.
BradC

Linguagem interessante para jogar golfe!
Redwolf Programs

@BradC Tentei fazer STRING_SPLITisso assim, mas não funciona exatamente como você pensaria - na verdade, retorna os dois valores de cada lado simultaneamente e você não pode fazer nenhuma verificação nos dados (pelo menos eu poderia descobrir ) Quanto ao uso TRY_CAST, parece que seria necessário ter "00:" anexado à frente. Talvez eu possa trabalhar mais com isso.
Meerkat

1
Sim, STRING_SPLITretorna-os como linhas separadas. Mesmo sem alterar essas partes, você ainda pode economizar uma tonelada de bytes mantendo apenas o primeiro DECLAREe alterando o restante para vírgulas. Também queda ASe apenas fazerDECLARE @i varchar(99),@a varchar(9)=...
BradC

Sim, boa ligação. Desde @ae @bambos exigem @i, porém, eu tenho que declarar isso separadamente. Ainda é possível salvar alguns bytes lá.
Meerkat

3

Java 8, 148 bytes

um lambda de StringparaString

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}

\u003be \u003asão seqüências de escape Unicode no nível de origem para ;e :respectivamente.

Experimente Online

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
}

Agradecimentos


.replaceAllpode ser .replacee Integer.parseIntpode ser new Integer, ou new Shortaté mesmo, para salvar 10 bytes: Experimente online 162 bytes .
21718 Kevin Kevin Krijssen em

148 bytes , alterando a divisão para um operador ternário simples e usando um em floatvez de um int para poupar nos "centenas" de bytes.
Olivier Grégoire

Agradável. Obrigado rapazes!
Jakob


2

PHP, 96 bytes

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

requer PHP 5.5 ou posterior. Execute como pipe -nFou experimente online .


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)

Quebras de linha são apenas para legibilidade. Método diferente da solução SQL baseada em variáveis do Meerkat .

A entrada é obtida através da tabela preexistente i com o campo varchar v , de acordo com nossos padrões de IO . Essa tabela de entrada é unida a uma tabela na memória t com nossos valores de corte (em segundos) e os rótulos desejados.

A mágica acontece na WHEREcláusula: DATEDIFFcalcula a diferença em segundos entre a meia-noite e nossa entrada (com um acréscimo 0:anexado à frente) e, em seguida, retorna o rótulo correspondente mais baixo (por meio do TOP 1).

Entradas inválidas retornam um valor imprevisível ou geram um erro:
Conversion failed when converting date and/or time from character string.

A pergunta era um pouco vaga, mas, se necessário, posso evitar esses erros (e não retornar nada) adicionando o seguinte LIKEpadrão à WHEREcláusula, elevando o total de bytes para 238 211 201 :

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

Edição : Minha submissão mais curta original estava falhando para entradas mais 24:00, desde que eu estava tratando como hh:mm. Teve que adicionar o '0'+CHAR(58)+prefixo, que adicionou 12 bytes.

EDIT 2 : Raspado 27 bytes do LIKEna minha versão alternativa

EDIT 3 : Removido ORDER BYdas duas versões, pois se mostrou desnecessário nos testes. (O SQL não garante que a ordem de classificação seja mantida sem um explícito ORDER BY, mas parecia funcionar bem para mim nesse caso específico.)


2

05AB1E , 43 42 bytes

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

Experimente online ou verifique mais alguns casos de teste .

Explicação:

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

Consulte esta minha dica do 05AB1E (seções Como usar o dicionário? E Como compactar cadeias de caracteres que não fazem parte do dicionário? ) Para entender por que „©Ãº™é "warm bread"e .•liSÕô6>Āµ·•é "bruleetoastyburnt".

þ30тx330)ćcomo alternativa, pode ter 30тx)DOªsþo mesmo número de bytes: experimente online.


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

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

É preciso usar essas seqüências de escape unicode :-) apenas uma grande cadeia de operadores ternários, com variáveis ​​definidas por parâmetros padrão. Também é uma linha, portanto, nenhum js com fome de ponto e vírgula


Eu usei um regex para fazer cumprir a 59:59 e não negativos governar :-)
Michael

OH WAIT Eu esqueci que eu adicionei:
Michael

realmente feito :-)
Michael

1
Você não precisa de um regex para aplicar os 59:59 e nenhum negativo ... eles podem resultar em qualquer coisa, seja um erro, nada ou Brulee.
Redwolf Programs

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

Experimente online! O link inclui casos de teste. Explicação:

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

Converta os minutos e segundos em unário.

+`1#
#60$*

Multiplique os minutos por 60 e adicione aos segundos.

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

Decodifique os segundos no toastiness.

#1{31,}
Warm #

Decodifique Pão Quente observando que #(para 0:00) decodifica para Bread.

#1*
Bread

Se ainda não temos um brinde, o pão ainda está frio.




1

Snap! 4,2 , 257 251 bytes

Minimizei a versão em texto um pouco mais.

Não encontrei nenhuma resposta no Snap!, Uma linguagem de programação visual semelhante ao Scratch, então usarei a sintaxe scratchblocks2, fingindo que o Snap! blocos exclusivos são válidos em scratchblocks2.

Experimente online! (clique no botão com as duas setas para ver o código)

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)

Experimente online!

Retorna a factorcom o nível apropriado.

-5 bytes graças ao JayCe.


Isso funcionaria? tio.run/…
JayCe 8/11

@JayCe IDK, a entrada é "qualquer formato aceitável", mas tudo leva a string ... vou perguntar nos comentários.
9788 Giuseppe #

@ JayCe Eu não tenho certeza do que você quer dizer. Até onde eu posso ver, leva um tempo como entrada para uma função que é uma entrada aceitável. IMO
Redwolf Programs

E você também pode fazer30*c(0,1,2,4,7,Inf)
Jayce

@RedwolfProgramas a entrada não é uma hora, é uma matriz, :é o operador de sequência.
9788 Giuseppe

1

Japonês , 48 bytes

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

Experimente online!

Economizou 5 bytes lendo as dicas ...

Explicação:

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

Um byte extra pode ser salvo com saída em minúsculas.




@LuisfelipeDejesusMunoz ambos contêm dois pontos, o que não é permitido pelo desafio. salva um byte, e eu não pensei se todas as letras minúsculas são permitidas.
Kamil Drakari

1

Geléia , 43 41 40 bytes

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

Experimente online!

Explicação (antiga)

“¡Ḳḋ\ḞvṾƤSİƓƥeF½ÞØ+®°»é a sequência compactada Warm Bread\nToasty\nBurnt\nBrulee\nBread, encontrada pelo otimizador de compactação .

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.

Inspirado pela resposta de Kamil Drakari .

-2 bytes usando o snippet ~~Ḍde Dennis.


1

Encantos Rúnicos , 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/

Experimente online!

Utiliza alguns caracteres ASCII sem impressão (STX, EOT, SOH, STX, VT, SOH, STX, DC2, SOH e STX nessa ordem) na primeira linha, que está lendo em uma sequência de bytes na ordem em que são será necessário na pilha. 3 operações de divisão ( 't'/2iguais :) e gravação reflexiva são executadas. Isso coloca 3 :comandos (duplicados) onde há atualmente .(NOP) para comparar de maneira não destrutiva a entrada com os limites de tempo. Um quarto :é deixado na pilha antes de ler a entrada.

O tempo é lido como uma sequência, depois dividido :e concatenado novamente em uma sequência. Como os valores acima 59:59não têm nenhuma especificação na saída, valores como 1:00:00terão saída indefinida (mas determinística). Essa sequência é então convertida em um número e comparada com 30, 100, 200 e 330 (o valor do byte Ŋ). "Bread"(linha 3, executando RTL) é usado duas vezes, para Breade Warm Breadresultados, economizando pelo menos 5 bytes.

Salva 1 byte por não ter um comando terminador clássico ( ;) usando Fizzle na última linha. Isso convence o analisador de que o programa é garantido para terminar sem fazer com que ele o faça imediatamente (e, mais importante, sem tocar na pilha). Entradas válidas deixarão a pilha vazia, de modo que, quando ela fizer um loop e tocar em um, wo IP for encerrado por executar uma ação ilegal.


Depois de ler o nome desse idioma, por algum motivo, tenho a imagem de um assistente cantando pontos de código ASCII presos na minha cabeça.
RedWolf Programas


0

Javascript, 115 101 bytes

-6 de 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 bytes

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

Execute alguns casos de teste com este snippet de pilha:

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, eu perdi algumas possibilidades ao tentar salvar bytes. Trabalhando em uma correção.
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"

Experimente online!

Agradeço a Jo King por endireitar minha, umm, desnecessariamente literal interpretação do desafio ...

F # é razoável para funções sem ponto e vírgula ou dois pontos. O único problema real era que eu não poderia fazer i.Splitdiretamente sem uma anotação de tipo - o F # não seria capaz de deduzir o tipo com ibase na chamada do método. Isso exigiria definir o tipo diretamente na função, como o let t (i:string)=que seria contrário às regras.

Mas eu poderia facilmente passar por isso i.ToString(), o que me permitiu visitá Split-lo. Então char 58é um caractere de dois pontos, e depois disso é direto.


Mas foi o que a especificação de requisitos disse! : P
Ciaran_McCarthy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.