数値を入力して曜日を返す


8

1つのプログラミング言語に限定されません。

私が言っているのは、1を渡すと月曜日が返され、7は日曜日に対応するということです。

同じことを行うために、Javaで146バイトのステートメントを管理しました。

return (n<1?"invalid":(n<2?"monday":(n<3?"tuesday":(n<4?"wednesday":(n<5?"thursday":(n<6?"friday":(n<7?"saturday":(n<8?"sunday":"invalid"))))))));

あなたのプログラムは:

  • フルワードを出力(STDOUT)
  • 入力が1未満または7より大きい場合にクラッシュしない

6
他の人が何のために投票しているかはわかりませんが、純粋にゴルフの質問である「人気コンテスト」の使用を嫌う人もいるでしょう。一般的に人気コンテストは、勝者を決定する客観的な方法がない質問に使用されます。
trichoplax 2014

9
この質問は、人々が何を書いてほしいかについてそれ自体に同意することはできません。変数で入力を見つけてそれを返すステートメント、またはstdoutに書き込むプログラム?(これは、人気コンテストの奇妙な使用でもあります。キャッチした場合、タグを完全に殺したい人を助けるのに役立ちます)。
Peter Taylor

2
自分と同じように質問し、フィードバックを得ることによって、何が機能し、何が良い質問をするのかを学びます。私は個人的に、この質問は単純すぎて興味深い挑戦をすることはできないと思っていましたが、わずか30分で3つの回答がすでに得られています。この質問から得られる新しい評判により、投稿する前にサンドボックスを使用してアイデアに関するフィードバックをすぐに得ることができます。
trichoplax 2014

2
質問はデフォルトでは言語に依存しないことに注意してください。1つのプログラミング言語に限定されないように指定する必要はありません。
trichoplax 2014

2
質問ではstdoutに出力する必要があると述べていますが、受け入れられた答えはそうではなく、変数の存在を想定しています。また、当社はない持っている出力にinvalid入力が無効である場合には?質問はそれを述べていませんが、例はそう示唆しています。
nyuszika7h 2014

回答:


8

Ruby、69または38バイト

コードを改善する簡単な方法を次に示します(Rubyで記述されていますが、Javaでも同様に機能します)。

n>0&&n<8?%w{Mon Tues Wednes Thurs Fri Satur Sun}[n-1]+"day":"Invalid"
  • 2つの無効なチェックを1つに結合します。
  • すべての日を配列に入れn、インデックスとして使用します。
  • コモンを因数分解しdayます。

Rubyのように、曜日の名前をライブラリからインポートすると、さらに短くすることができます。

n>0&&n<8?Date::DAYNAMES[n%7]:"Invalid"

今は減分せずn、代わりに7を法としてにマッピング7することに注意してください0。これはDAYNAMES、日曜日から始まるためです。


ああ、私はこれと同じもののLuaバージョンを入れようとしていた(それが約100文字長くなることを除いて)...
カイル・カノス

いまいましい、私は配列の行についてはまったく考えていませんでした。私は三者に夢中になりすぎて、2つを統合できることに気づかなかった。すごい!
CrazyMod 2014

Rubyでn> 0&n <8(2番目の&を削除)できますか?私はそれがJavaで動作することを知っています。
bmarks 2014

@bmarks少なくともRuby 2.0より前では、優先順位が原因でそれを原因とすることはできないようです(現在、ここにはRuby 2.xインタープリターがありません)。
マーティンエンダー2014


9

バッシュ:47バイト

まだbashエントリはありませんか?がっかりだよ ...

case $1 in
    [1-7]) date -d "14-08-1$1" +%A
esac

現在の週の曜日を使用し、最後の数字を置き換えます(2014年8月11〜17日-11は月曜日、12は火曜日など)。


わあ、なんて賢い解決法でしょう!このための日付のハードコーディングは素晴らしいです!。日付形式で月として「8」のみを受け入れる方法はありませんか?そして、最初が月曜日である月/年のペアを見つけることができます。
ランチャー2014

ありがとう!date -d $1sept +%A(今年だけですが、バイトを6 * 9に減らします)も同様に機能します。GNU dateはその点で本当に柔軟なので、追加の可能性があるはずです。
yasen 14

これをdateBashではなくの回答として投稿すると、14-08-1$19バイトになります。
IngoBürk2014

これは46バイトです。末尾の改行は数えません。
nyuszika7h 2014

まあ、2倍以上短いバージョン:):codegolf.stackexchange.com/a/36424/11887
avall 2014

6

Marbelous 192 191 185 181

}0
=1=2=3=4=5=6=7--
&1&2&3&4&5&6&7{0
&8////////////
4D6F6E547565735765646E65735468757273467269536174757253756E646179
&1&1&1&2&2&2&2&3&3&3&3&3&3&4&4&4&4&4&5&5&5&6&6&6&6&6&7&7&7&8&8&8

入力が無効な場合のゼロ以外の終了コード

使用法:

# marbelous.py -r day-of-week.mbl 2
Tuesday

6

JavaScript、95 88バイト

x=prompt();alert("Invalid 0Mon0Tue0Wednes0Thurs0Fri0Satur0Sun".split(0)[x&~7?0:x]+"day")

2進数の7は0111です。つまり、の代わりにビット単位の演算でいくつかの文字を削ることができますx>0&&x<8

編集:edc65を使用sしてアレイを削除しました


それはきちんとした方法です!
CrazyMod 2014

1
確かにきちんとした方法。:1)私はあなたが広告の変数を必要としないと88を行うことができます95のバイトではなく、97 2)を数えるx=prompt();alert("Invalid 0Mon0Tue0Wednes0Thurs0Fri0Satur0Sun".split(0)[x&~7?0:x]+"day")
edc65

ああ、それは賢いです!今すぐ投稿を更新します。
Sean Latham

5

C#-26バイト

内部に格納される日を期待しますn
予想通り、クラッシュしません。
LINQPad™を搭載

((DayOfWeek)(n%7)).Dump();

バイト保存とルールベンディングについてそれぞれbmarksとStephan Schinkelに感謝


2番目と条件付きで削除できますか?ここでの短絡評価は必要ないと思います。
bmarks 2014

@bmarks正解です、ありがとう
William Barbosa 14

1
質問は、「無効」を返すことについて言及しておらず、プログラムがクラッシュしてはならないことを示しているだけです。したがって、return((DayOfWeek)(i%7))。ToString();と書くことができます。(37文字)
ステファンシンケル2014

@StephanSchinkelええ、私はあなたが正しいと思います
ウィリアム・バルボサ

2

C#、95バイト

C#では、次のようなことができます。

return(i>7||i<0)?"invalid":new[]{"mon","tues","wednes","thurs","fri","satur","sun"}[i-1]+"day";

境界チェックにエラーがあり、それをチェックする必要がi<1あります。条件を囲むのでは|なく||(短絡ではなく)を使用して角かっこを削除することで、2バイトを節約できます。文字列を作成して分割する方が" mon tues wednes thurs fri satur sun".Split()[i]、このサイズの文字列の配列を作成するよりも短くなります(文字列の先頭にスペースがあることに注意してください。これにより、iから1を引くのを節約できます)
VisualMelon

2

拡張BrainFuck:104

{a))<(->>}+>,49-(-(-(-(-(-((-)<->>|"sun")<(->>|"satur"&a|"fri"&a|"thurs"&a|"wednes"&a|"tues"&a|"mon")|"day"

未使用(慣用)

{main 
  :flag +
  :input

  $input &read_number -
  (-
   (-
    (-
     (-
      (-
       (        $input &reset  ; 7-9
                $flag  &reset
                |"sun" &reset )

        $flag ( &reset         ; 6 
                |"satur" &reset  ))

       $flag (  &reset         ; 5
                |"fri" &reset    ))

      $flag (   &reset         ; 4
                |"thurs" &reset  ))

     $flag (    &reset         ; 3
                |"wednes" &reset ))

    $flag (     &reset         ; 2
                |"tues" &reset   ))

   $flag (      &reset         ; 1
                |"mon" &reset    )

   |"day"
}
{reset (-)}
{read_number , 48- }

;; call main
&main

2

T-SQL 36

SELECT DATENAME(w,@+6)WHERE(6+@)/7=1

変数が@に格納されていると仮定します。無効な入力(@> 7または@ <1)の場合、何も選択されません。

編集:どうやら日付は数値である可能性があります。それで5文字を削除しました。

編集2:最初の編集に基づきます。これはintなので、DATEADD()を使用する必要はありません。代わりに通常の加算を使用できます。


2

JavaScript 93 :(

q=prompt();alert(q<8&&q>0?'0mon0tues0wednes0thurs0fri0satur0sun'.split(0)[q]+'day':'invalid')

なぜ正確にq && q <8を使用したのですか?
CrazyMod 2014

q && qq <8は、qが1と7の間にあるかどうかをチェックします
Kevin L

1
何場合はqありますか-5
ドアノブ

:(しかし、それは> 0の余分な2バイトです。ipiのビットトリックを使用して修正され、2バイトも節約されます
Kevin L

q == 0で動作しますか?
edc65 2014

2

Lua-57バイト

print(n>0 and n<8 and os.date("%A",9e4*(n+3))or"Invalid")

Luaの標準ライブラリにはos.date()があり、書式設定があります。したがって、時間(この場合は「9e4 *(n + 3)」)を渡して、曜日の名前である「%A」形式を返すように要求できます。また、Luaで非常に便利なのは「aとbまたはc」です。aがtrue(コードではaが "n> 0 and n <8")の場合はbを返し、aがfalse(またはnil)の場合はcを返します。


1
説明していただけますか?
ランチャー2014

1
OPはエラー処理を具体的に要求しましたが、かなりあいまいでした。次回は、不完全な回答を投稿する前に説明を求めてください。
Rainbolt 2014

1
後のスペース%Aは必要ないと思います
カイル・カノス'16

@KyleKanosそうですね。ありがとう!
AndoDaan 2014


2

バッシュ-21 19

入力が変数であると仮定しますD

date +%A -d$D"Jan1"

HTML + PHP-26

$d入力テキストにしよう

<?=date('l',86400*(3+$d));

タイムスタンプ86400 * 3は、UNIXワールドの開始からの最初の日曜日です。

次のコマンドを実行してテストできます。

<?php $d=3; ?>
<?=date('l',86400*(3+$d));

1

Perl、60バイト

このようなもの:

$x&&qw{Mon Tues Wednes Thurs Fri Satur Sun}[$x-1]."day"||die

代わりにメッセージを返したい場合で、負のインデックスが心配な場合は、代わりにこれを使用できます(さらに8文字):

$x>0&&qw{Mon Tues Wednes Thurs Fri Satur Sun}[$x-1]."day"||"Invalid"

1

Lua 134 119 115 100 98

q={"mon","tues","wednes","thurs","fri","satur","sun"}print(n<8 and n>0 and q[n].."day"or"invalid")

基本的には、MartinButtnerと同じ考えですが、約4.5 4.1 1.7 1.4倍長くなっています。n別の場所に変数として格納されていると仮定します。


公平に言えば、ここではそのI / Oは必要ありません。
マーティンエンダー2014

@MartinBüttner:関数を使用した方が長いと思います
Kyle Kanos 14

nOPのスニペットのように、変数に格納されることを期待してください。
マーティンエンダー2014

ええ、私はあなたの側でI / Oを期待していませんでした。
CrazyMod 2014

1

パイソン(84)

lambda a:'imtwtfssnouehrauvneduitnadsnrdudladesaraiyasdydyd yda a    ay y    y'[a if 0<a<8 else 0::8]

それは興味深い解決策だと思います。それは私がどこかで読んだ別の回答者からのアイデアです(見つけられない、私はそれがこのサイトにあったことを知っているので、誰かが私に自由に教えてくれれば知っています。)文字列は次のJプログラムで生成されました:

,|:>'invalid';'monday';'tuesday';'wednesday';'thursday';'friday';'saturday';'sunday'

この答えからいくつかの微妙なヒントをとります:

lambda a:' mtwtfssouehrauneduitn snr u   es r   s'[a::7]+'day'if 0<a<8 else'invalid'

1

Bash 74 48 +エラーメッセージ

他のすべての答えは何らかの形で文字列を格納することに焦点を当てているため、別のアプローチ。

read x;((0<x&&x<8))&&date -d2007010$x +%A||echo out of range

バイト数とは何ですか?
誇り高いハスケラー2014

@proudhaskellerこのタグはcode-golf
user80551 '15

そうです、他のすべてのソリューションにはバイト数があります。変。
誇り高いハスケラー2014

それはPOSIXのsh答えです。ではbash算術評価を使用できます。read x;((0<x&&x<8))&&date -d2007010$x +%A||echo out of range短いです。
manatwork 2014

質問は、数が1から7の間でなければプログラムがクラッシュしないことを述べただけなので、を削除することができます||echo out of range。受け入れられたソリューションがルールに従っていないことを考慮してください(標準出力に出力)...しかし、OPの例に従う場合は、のinvalid代わりに使用できますout of range
nyuszika7h 2014

1

Perl、54

STDINからSTDOUTまで、日付関数なし、クラッシュなし。

print((a,Mon,Tues,Wednes,Thurs,Fri,Satur,Sun)[<>].day)

1

PHP(56バイト)

$d=1;echo$d>0&&$d<8?date('D',255600+$d*86400):'Invalid';

1

Clojure-99文字

私の最善の(初心者)の試みにもかかわらず、単純明快:

(defn f[x](get{1"monday"2"tuesday"3"wednesday"4"thursday"5"friday"6"saturday"7"sunday"}x"invalid"))

1

JS:58

nがすでに変数として格納されていると仮定します。

"0Mon0Tues0Wednes0Thurs0Fri0Satur0Sun".split(0)[n%8]+"day"

ES6関数として(同じ前提):67

let d=n=>"0Mon0Tues0Wednes0Thurs0Fri0Satur0Sun".split(0)[n%8]+"day"

これは0の場合は「日」を出力し、n> 7の場合はループします


「火曜日」?また、あなたの説明は、それが返され、不正確であるdayために8から再び始まりMonday9
nyuszika7h 2014

@ nyuszika7hキャッチありがとうございます。
Isiah Meadows

1

レブム:21文字

pcSYSTEM/locale/daysA

走る:

>> rebmu/args {pcSYSTEM/locale/daysA} 1 
== "Monday"

無効な数値は「なし」を返します。

>> rebmu/args {pcSYSTEM/locale/daysA} 8 
== none

>> rebmu/args {pcSYSTEM/locale/daysA} 0
== none

Rebmuに慣れていない場合は、大文字と小文字の遷移を使用して、法的に解析可能な範囲内で、スペースの必要をなくします。InitialCapsToBreakを使用するのではなく、CASEtransitionsTObreakを使用します。これにより、最初の最初の実行が小文字の場合とは異なる意味を最初の大文字の実行に帰することができます。

したがって、これはRebolプログラムと同等pick system/locale/days aです。(慣例により、Rebmuはそのスクリプトパラメーターを "a"と名付けています)。

system/locale/days/(a):-)を1文字節約します


1

ハスケル-62

包みます。0日曜日、8月曜日などです。

words"Mon Tues Wednes Thurs Fri Satur Sun"!!(mod(n-1)7)++"day"

stdoutへの出力が必要な場合(68バイト、出力は二重引用符で囲まれます):

print$words"Mon Tues Wednes Thurs Fri Satur Sun"!!(mod(n-1)7)++"day"

1

LiveScript-49

undefinedday入力が無効かどうかを返します。;)

<[Mon Tues Wednes Thurs Fri Satur Sun]>[n-1]+\day

stdoutへの出力が必要な場合(60バイト):

console.log<[Mon Tues Wednes Thurs Fri Satur Sun]>[n-1]+\day

1

Befunge-93(206 208

これは書くのが面白かった。それはもっと良い方法でできると確信していますが…それはうまくいきます!=)ここで試すことができます

#個々のセルだけでなく、文字列全体をジャンプする場合はさらに短くなります。

&1-    v
vv"Mon"># :# !_
> 1-    v
vv"Tues"># :# !_
> 1-      v
vv"Wednes"># :# !_
> 1-     v
vv"Thurs"># :# !_
> 1-   v
vv"Fri"># :# !_
> 1-     v
vv"Satur"># :# !_
> 1-   v
vv"Sun"># :# !_
>>:#,_"yad",,,@

その背後にある基本的な考え方:数値を取得し、それを減らしていきます。デクリメントするたびに、カーソルは右に移動し、折り返して1レベル下に送られます。ゼロに達したら、代わりに左に移動して、曜日名(の最初の部分)を押します。それ以降、カーソルは文字列が印刷されて「日」が追加された下部にまっすぐ移動します。

オンラインインタープリターへのリンクの「ステップ」機能を使用して、それがどのように機能するかを確認できます。

編集:の>:#,_代わりにを実行することで>,,,,,,、2バイトを削ることができました。これも同様に優れています。


1

MATLAB:33

datestr(3:9,'dddd');ans(1:7==n,:)

MATLAB:71

{'mon';'tues';'wednes';'thurs';'fri';'satur';'sun'};[ans{1:7==2} 'day']

ハスケル:75

g n=((++"day").last.take(abs n).words)"mon tues wednes thurs fri satur sun"

ハスケル:97

f n=if elem n[1..7]then["mon","tues","wednes","thurs","fri","satur","sun"]!!n++"day"else"invalid"

Python 3.4.1:81

'invalid mon tues wednes thurs fri satur sun'.split(' ')[n*(n in range(8))]+'day'

おそらくこれらを個別の回答として投稿する必要があります。
nyuszika7h 2014

Pythonでは:(0<n<8)より短い(n in range(8))です。split()文字列も分割
AMK

1

Javaの8 - 69の 64文字

以下は、インポートを含むJava 8の式です。今すぐ改善(のおかげでトマーシュ・ドヴォルザーク):

import java.time.*;
return DayOfWeek.of((i>0&i<8)?i:1).name();

単にMONDAY偽の値を出力するi


ヒント:.name()は.toString()よりも短く、同じことを行います。4文字まで保存できます。また、&を2つではなく1つだけ使用して、別の文字を保存することもできます。
トマーシュ・ドヴォルザーク

1

パイソン-87

私はこの1つは期待し)(辞書のに.getのための十分な愛を見ていないよa数であるように

dict(enumerate("mon,tues,wednes,thurs,fri,satur,sun".split(","),1)).get(a,"bad ")+"day"

dayリスト内のすべての出現箇所を削除して一部の文字を保存し+"day"、コードの最後に追加できます。
ProgramFOX 2014

あなたはまた、1つの文字列内のすべての日置くことによって、いくつかの文字を保存し、リスト内のすべてのそれらを別々に置くのではなく、それらを分割することができます:"mon,tues,...".split(",")
ProgramFOX

それはうまく
いきます

0

Python、95バイト

"%day"%["mon","tues","wednes","thurs","fri","satur","sun"][n-1] if 0<n<8 else "invalid"

2
月曜日?私はそれを正しく読みましたか?
trichoplax 2014

どこから95バイトを取得したかわからない。私のカウントでは88です。「monsday」のバグを修正し、%フォーマットの代わりに文字列連結を使用してsplit()、不要な空白を使用して文字列からリストを作成し、11を保存することができました。
地下

2
"mon tues wednes thurs fri satur sun".split()[n-1]+"day"if 0<n<8else"invalid"
地下

@undergroundmonorailでは、二重引用符の代わりに一重引用符を使用することで、さらに6バイトを節約できます
trichoplax

2
@githubphagocyte引用文字が何バイトを占めるかについて冗談を言っているのか、深刻に間違えているのかわかりません。
地下


0

コブラ-43

print if(0<n<8,(n%7)to DayOfWeek,'Invalid')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.