トースティー、バーント、ブリュレ!


8

私のトースターは少し壊れていることがわかりました。それはWiFiを失い(あなたが知っている、それはそれらの新しいスマートなトースターの1つです)、そしてそれは途方もなく進んでいます!機能しなくなったので、朝食のソースコードをハッキングして毎朝実行する必要がありましたPlate.bread.toastAs(3);。手伝ってくれませんか?

私のトースターは1つの入力を受け取ります。パンをトーストしたい時間です。これはmin:sec5:45または0:40(最大59:59)のようにと表記されます。次に、さまざまなレベルのトーストネスに対して特定の値を返します。

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)

しかし、ここに問題があります。トースターのキーボードが壊れています!コードにセミコロンや...コロンを含めることはできません。これは、トースターの修理工が言うよりも難しいかもしれません...

ここにいくつかのテストケースがありますので、あなたは...あなたのケースをテストできますか?

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

時間はせいぜい59:59ですか?
xnor 2018年

5
そうじゃないの3:31 and up: Brulee
Mego 2018年

3
コロンが使用されないゴルフ言語はどこにありますか?
Jo King

1
なぜPythonへの提出がないのか、今まで知りませんでした...
Redwolfプログラム

1
すべての入力が5文字になるように、先頭にゼロを付けて入力を取り込むことはできますか?
Quintec、2018年

回答:


3

パイソン2124 118 116

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

オンラインでお試しください!

-6 @tshとTIOテストケースに感謝します。

-2 @BlackOwlKaiからのいくつかのクールなヒント

スローValueErrorフロートに変換できない無効な入力のために。まだパンなので、0未満の数値の場合は「パン」を返します。入力が有効な時間であることを確認することが本当に厳密であるかどうかを推測しますが、私にとって興味深い点は:、Python を回避する方法でした。



@tsh巧妙なトリックに感謝し、TIOテストにも感謝します。
ElPedro

置き換えることにより、-1バイトfloateval
黒フクロウカイ

1
@BlackOwlKaiに感謝します。それを見ていませんでした。明日、適切なクレジットで更新されます
El

1
-1バイトchr(58)に短縮できるため"\x3A"
Black Owl Kai

3

T-SQL、409 379 328 318バイト

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バイト:削除され AS たキーワード、組み合わせた DECLARE 文(のおかげBradC
-51バイト:句はSQLの日時機能を利用するために変更宣言/
-10バイト:変更 MINUTE する N SECOND する S(のおかげBradC

SQLは文字列をネイティブで適切に分割できないことをご存知ですか?だまされてはいけませSTRING_SPLITん。これでは機能しません。または、少なくとも、私はそれを理解するのに十分なほど賢くない。

BradCのテーブルベースのT-SQLソリューションとは異なります

未ゴルフ:

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

あなたはのようなことをすることができますがSELECT value FROM STRING_SPLIT(@i,CHAR(58))、私はTRY_CAST(@i AS TIME)がいくつかの角を切るかもしれないかと思っています。
BradC 2018年

ゴルフのための興味深い言葉!
Redwolfプログラム

@BradC私はそのSTRING_SPLITようにしてみましたが、あなたが思うように正確に機能しません-実際には両側から両方の値が同時に返され、データに対してチェックを行うことはできません(少なくとも私は理解できました) )。を使用TRY_CASTする場合は、先頭に「00:」を追加する必要があるようです。これでさらに作業できるかもしれません。
Meerkat

1
うん、STRING_SPLITそれらを別々の行として返します。これらの部分を変更しなくても、最初DECLAREの部分だけを残し、残りをコンマに変更することで、大量のバイトを節約できます。また、ドロップASして実行DECLARE @i varchar(99),@a varchar(9)=...
BradC '

うん、いい電話。ただし、両方とも必要なので@a、個別に宣言する@b必要@iがあります。それでもかなりの数のバイトを保存できます。
Meerkat

3

Java 8、148バイト

ラムダStringString

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}

\u003bおよび\u003a;:それぞれおよびのソースレベルのUnicodeエスケープシーケンスです。

オンラインで試す

未ゴルフ

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
}

謝辞


.replaceAll可能.replaceInteger.parseIntすることができnew Integer、またはnew Short10のバイトを保存するために、さえ:オンラインそれを試してみてください162バイト
Kevin Cruijssen

分割を単純な3項演算子に変更しfloat、intの代わりにaを使用して「数百」バイトを節約することにより、148バイト
OlivierGrégoire18年

いいね。みんなありがとう!
Jakob、

2

JavaScript(SpiderMonkey)、100バイト

a=>'Bread,Warm Bread,Toasty,Burnt,Brulee'.split`,`[((t=a.replace(/\D/,'.'))>3.3)+(t>2)+(t>1)+(t>.3)]

オンラインでお試しください!


JavaScript(Node.js)、91バイト

a=>[,b='Bread','Warm '+b,o='Toasty',o,u='Burnt',u,u][new Date([70,a])/-~18e5+1|0]||'Brulee'

オンラインでお試しください!


:ソースコードにが含まれているため、2番目のソリューションは無効です。
kamoroso94 2018年

@ kamoroso94がロールバックされました。
tsh


2

T-SQL、143155145バイト

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)

改行は読みやすくするためのものです。Meerkatの変数ベースのSQLソリューションとは異なる方法。

入力は、既存のテーブルを経由して取得され、私のvarcharフィールドでV私たちのIO規格ごと。その入力テーブルは、カットオフ値(秒単位)と目的のラベルを使用して、メモリ内テーブルtに相互結合されます。

魔法はWHERE節で発生しDATEDIFFます。真夜中と入力(0:前部に追加が追加されている)の間の秒単位の差を計算し、(を介してTOP 1)最も一致するラベルを返します。

無効な入力は、予測できない値を返すか、エラーをスローします。
Conversion failed when converting date and/or time from character string.

質問は少しあいまいでしたが、必要に応じて次のLIKEパターンをWHERE句に追加し、合計バイト数を238 211 201にすることで、これらのエラーを回避(そして何も返さない)できます。

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

編集:私24:00がそれを扱っていたので、私の最初のより短い提出は入力より失敗していましたhh:mm'0'+CHAR(58)+プレフィックスを追加する必要があり、12バイトが追加されました。

編集2LIKE私の代替バージョンで27バイトを削った

編集3ORDER BYテストでは不要であることが判明したため、両方のバージョンから削除されました。(SQLは、明示的ななしでソート順が維持されることを保証ORDER BYしませんが、この特定のケースでは私にとってはうまく機能するように見えました。)


2

05AB1E43 42 バイト

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

オンラインそれを試してみてくださいまたはいくつかのより多くのテストケースを検証します

説明:

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

この05AB1Eのヒント(「ディクショナリの使用方法」および「ディクショナリの一部ではない文字列を圧縮する方法」のセクション)を参照して、„©Ãº™"warm bread".•liSÕô6>Āµ·•ある理由を理解してください"bruleetoastyburnt"

þ30тx330)ćまたは30тx)DOªsþ、同じバイト数を使用することもできます。オンラインで試してください。


1

JavaScript(ES6 +)、180バイト

Node.js(180バイト)

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

ブラウザ(188バイト):

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

お奨めは、これらのユニコードエスケープシーケンスを使用します。また、ワンライナーなので、セミコロンに飢えたjsはありません


私は正規表現を使用して、59:59および否定なしのルールを実施しました:-)
Michael

私が追加したのを忘れたOH WAIT:
Michael

実際に行われました:-)
Michael

1
59:59を適用するために正規表現は必要なく、否定もありませんBrulee。エラーになるか、何もないか、何でもないという結果になる可能性があります。
Redwolfプログラム

1

Retina 0.8.2、97バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。外植:

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

分と秒を単項に変換します。

+`1#
#60$*

分に60を掛けて秒に追加します。

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

秒をトースティネスにデコードします。

#1{31,}
Warm #

#(0:00の場合)がにデコードされることに注意して、暖かいパンをデコードしBreadます。

#1*
Bread

まだトーストがなければ、パンはまだ冷たいです。




1

スナップ!4.2257の 251バイト

テキスト版をもう少し小さくしました。

Scratchに似たビジュアルプログラミング言語であるSnap!には答えが見つからなかったので、Snap!のふりをして、scratchblocks2構文を使用します。排他ブロックは、scratchblocks2で有効です。

オンラインでお試しください!(2つの矢印のボタンをクリックしてコードを表示します)

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

R127 122バイト

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)

オンラインでお試しください!

factor適切なレベルのを返します。

JayCeのおかげで-5バイト。


これはうまくいくでしょうか?tio.run/...
JayCe

@JayCe IDK、入力は「受け入れ可能な任意の形式」ですが、すべてが文字列を取ります...コメントで尋ねます。
ジュゼッペ

@JayCeどういう意味かわかりません。私が見る限り、許容可能な入力である関数への入力として時間がかかりますIMO
Redwolfプログラム

そして、あなたも行うことができます30*c(0,1,2,4,7,Inf)
JayCe 2018年

@RedwolfPrograms入力は時間ではなく、配列で:あり、シーケンス演算子です。
ジュゼッペ

1

Japt、48バイト

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

オンラインでお試しください!

実際にヒントを読んで5バイト節約しました...

説明:

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

余分なバイトはすべて小文字で出力して保存することができます。




@LuisfelipeDejesusMunozには両方ともコロンが含まれていますが、これはチャレンジでは許可されていません。バイトを節約しますが、小文字をすべて許可するかどうかは考えていませんでした。
カミルドラカリ

1

ゼリー43 41 40バイト

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

オンラインでお試しください!

説明(旧)

“¡Ḳḋ\ḞvṾƤSİƓƥeF½ÞØ+®°»圧縮オプティマイザWarm Bread\nToasty\nBurnt\nBrulee\nBreadによって検出された圧縮文字列です。

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.

カミル・ドラカリの答えに触発されました。

-Dennis ~~Ḍからのスニペットを使用して-2バイト。


1

ルーンエンチャント、118バイト

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

オンラインでお試しください!

最初の行で、印刷されていないASCII文字(STX、EOT、SOH、STX、VT、SOH、STX、DC2、SOH、STXの順)を利用します。スタックで必要になります。3つの除算('t'/2等しい:)と反射書き込み操作が実行されます。これは、入力を時間しきい値と非破壊的に比較するために、:現在.(NOP)に3つの(重複した)コマンドを配置します。4番目:は、入力を読み取る前にスタックに残されます。

時間は文字列として読み込まれ、次に分割さ:れ、文字列に連結されます。上記の値に59:59は出力に関する指定がないため、などの値1:00:00には未定義の(しかし確定的な)出力があります。この文字列は数値に変換され、30、100、200、および330(バイト値Ŋ)と比較されます。"Bread"(行3、RTLの実行)は結果BreadWarm Bread結果の両方で2回使用され、少なくとも5バイトを節約します。

代わりに最後の行にizzleを;使用して、従来のターミネーターコマンド()を使用しないことで、1バイトをF節約します。これにより、パーサーは、プログラムがすぐに終了しない(さらに重要なことに、スタックに触れない)ことなくプログラムが終了することが保証されていると確信できます。有効な入力はスタックを空のままにするため、ループしてループに触れるとw、IPは不正なアクションを実行するために終了します。


この言語の名前を読んだ後、何らかの理由で、ASCIIコードポイントを唱えるウィザードのイメージが頭に残っています。
Redwolfプログラム

@RedwolfPrograms * GRIN * cdn.discordapp.com
attachments

0

JavaScript、115 101バイト

-6 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バイト

(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 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おっと、バイトを節約しようとしているときにいくつかの可能性を逃しました。修正に取り組んでいます。
Mego 2018年

0

F#、177バイト

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"

オンラインでお試しください!

挑戦の私の、うーん、不必要に文字通りの解釈を正してくれたJo Kingに感謝します...

F#は、セミコロンやコロンのない関数にはかなり問題ありません。唯一の本当の問題はi.Split、型注釈なしでは直接実行できないことでした-F#はiメソッド呼び出しに基づいての型を推定できなかったでしょう。これはlet t (i:string)=、ルールに反するように、関数内でタイプを直接定義する必要があったでしょう。

しかし、私はでそれを簡単に回避でき、それによってi.ToString()それを呼び出すことができましSplitた。次にchar 58、コロン文字であり、その後は簡単です。


しかし、それが要件仕様で述べられていることです!:P
Ciaran_McCarthy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.