Masukkan nomor dan kembali hari dalam seminggu

8

Tidak terbatas pada satu bahasa pemrograman saja.

Apa yang saya katakan adalah Anda menyetujui 1 dan mengembalikannya pada hari Senin, 7 sesuai dengan minggu dan seterusnya.

Saya sudah mengelola pernyataan 146 byte di Jawa untuk melakukan hal yang sama.

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

Program Anda harus:

  • tampilkan kata-kata lengkap (STDOUT)
  • tidak macet jika inputnya kurang dari 1 atau lebih besar dari 7
CrazyMod
sumber
6
Saya tidak tahu apa yang orang lain pilih, tapi saya berharap orang tidak menyukai penggunaan "kontes popularitas" pada pertanyaan yang murni pertanyaan golf. Umumnya kontes popularitas digunakan untuk pertanyaan yang tidak memiliki cara obyektif untuk menentukan pemenang.
trichoplax
9
Pertanyaan ini tidak dapat menyetujui dengan sendirinya tentang apa yang ingin ditulis orang. Pernyataan yang menemukan input dalam variabel dan mengembalikannya atau program yang menulis ke stdout? (Ini juga merupakan penggunaan yang aneh dari kontes popularitas yang, jika menarik, mungkin melakukan banyak hal untuk membantu mereka yang ingin membunuh tag sepenuhnya).
Peter Taylor
2
Anda akan belajar apa yang berhasil dan apa yang membuat pertanyaan bagus dengan mengajukan pertanyaan seperti Anda, dan mendapatkan umpan balik. Saya pribadi berpikir pertanyaan ini terlalu sederhana untuk membuat tantangan yang menarik, tetapi Anda sudah memiliki 3 jawaban hanya dalam waktu setengah jam, yang menunjukkan bahwa sulit untuk menebak apa yang membuat tantangan yang baik sampai Anda bertanya. Dengan reputasi baru yang Anda peroleh dari pertanyaan ini, Anda akan segera dapat menggunakan kotak pasir untuk mendapatkan umpan balik tentang gagasan sebelum mempostingnya.
trichoplax
2
Perhatikan bahwa pertanyaan adalah bahasa agnostik secara default - Anda tidak perlu menentukan bahwa itu tidak terbatas pada satu bahasa pemrograman.
trichoplax
2
Pertanyaannya mengatakan Anda harus output ke stdout, tetapi jawaban yang diterima tidak melakukannya dan bahkan mengasumsikan keberadaan variabel. Juga, apakah kita harus mengeluarkan invalidjika input tidak valid? Pertanyaannya tidak menyatakan itu tetapi contohnya menyarankan.
nyuszika7h

Jawaban:

8

Ruby, 69 atau 38 byte

Berikut adalah cara sederhana untuk meningkatkan kode Anda (ditulis dalam Ruby tetapi berfungsi serupa di Jawa):

n>0&&n<8?%w{Mon Tues Wednes Thurs Fri Satur Sun}[n-1]+"day":"Invalid"
  • Gabungkan kedua cek yang tidak valid menjadi satu.
  • Masukkan semua hari dalam array dan gunakan nsebagai indeks.
  • Faktor di luar kesamaan day.

Anda dapat membuatnya lebih pendek jika Anda mengimpor nama-nama hari dalam seminggu dari perpustakaan, seperti Ruby:

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

Perhatikan bahwa sekarang saya tidak pengurangan nmelainkan mengambil modulo 7 untuk memetakan 7ke 0. Ini karena DAYNAMESdimulai dengan hari Minggu.

Martin Ender
sumber
Gah, aku baru saja akan meletakkan versi Lua dari hal yang sama ini (kecuali itu akan menjadi sekitar 100 karakter lagi) ...
Kyle Kanos
sial, aku sama sekali tidak memikirkan barisan array. Saya telah begitu terperangkap di terner, sehingga saya tidak menyadari bahwa saya dapat menggabungkan keduanya. luar biasa!
CrazyMod
Bisakah Anda melakukan n> 0 & n <8 (menghapus & kedua) di Ruby? Saya tahu itu berfungsi di Jawa.
tanda
@mark Sepertinya Anda tidak dapat melakukannya karena diutamakan, setidaknya sebelum Ruby 2.0 (Saya tidak punya penerjemah Ruby 2.x di sini sekarang).
Martin Ender
1
21 di Rebmu ... :-)
HostileFork bilang jangan percaya
9

Bash: 47 byte

Masih tidak ada entri bash? Saya kecewa ...

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

Ia menggunakan hari-hari dalam minggu ini dan hanya mengganti digit terakhir (11-17 Agustus 2014 - 11 adalah hari Senin, 12 adalah hari Selasa, dll.).

Yasen
sumber
Wow, solusi yang cerdas! Hard coding tanggal untuk ini sangat brilian !. Apakah format tanggal tidak menerima '8' sebagai bulan? Dan kemudian Anda dapat menemukan pasangan bulan / tahun di mana yang pertama adalah Senin.
Cruncher
Terima kasih! date -d $1sept +%Aberfungsi juga (meskipun hanya tahun ini; mengurangi byte menjadi 6 * 9). GNU datesangat fleksibel dalam hal ini sehingga harus ada kemungkinan tambahan.
yasen
Jika Anda memposting ini sebagai jawaban datedaripada Bash, itu akan menjadi hanya 14-08-1$1- 9 byte!
Ingo Bürk
Ini 46 byte, jangan hitung baris tambahan;
nyuszika7h
Nah, lebih dari 2 kali versi lebih pendek :): codegolf.stackexchange.com/a/36424/11887 .
avall
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

Kode keluar bukan nol jika input tidak valid

Pemakaian:

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

Javascript, 95 88 byte

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

7 dalam biner adalah 0111, artinya Anda dapat mengurangi beberapa karakter dengan operasi bitwise x>0&&x<8.

Sunting: Menghapus sarray dengan bantuan edc65 .

Sean Latham
sumber
itu metode yang rapi!
CrazyMod
1
Metode yang rapi memang. 1) Saya menghitung 95 byte, bukan 97. 2) Anda tidak perlu variabel iklan dan dapat melakukan 88:x=prompt();alert("Invalid 0Mon0Tue0Wednes0Thurs0Fri0Satur0Sun".split(0)[x&~7?0:x]+"day")
edc65
Ah, itu pintar! Saya akan memperbarui posting saya sekarang.
Sean Latham
5

C # - 26 Bytes

Berharap hari itu disimpan di dalam n.
Tidak crash, seperti yang diharapkan.
Didukung oleh LINQPad ™

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

Terima kasih khusus kepada bmarks dan Stephan Schinkel untuk masing-masing penghematan byte dan pembengkokan aturan

William Barbosa
sumber
Bisakah Anda menghapus yang kedua & dalam kondisi? Saya tidak berpikir evaluasi hubung pendek di sini diperlukan.
tanda
@ bookmark Anda benar, terima kasih
William Barbosa
1
Pertanyaan tidak menyebutkan untuk mengembalikan "Tidak Valid" itu hanya menyatakan program tidak boleh crash. Jadi Anda dapat menulis return ((DayOfWeek) (i% 7)). ToString (); (37 chars)
Stephan Schinkel
@StephanSchinkel Ya, saya kira Anda benar
William Barbosa
2

C #, 95 byte

Di C # Anda dapat melakukan sesuatu seperti ini:

return(i>7||i<0)?"invalid":new[]{"mon","tues","wednes","thurs","fri","satur","sun"}[i-1]+"day";
sm.abdullah
sumber
Ada kesalahan dalam batas memeriksa, Anda harus memeriksa itu i<1, dan Anda dapat menyimpan 2 byte dengan menggunakan |daripada ||(bukan hubungan arus pendek) dan menghapus tanda kurung di sekitar kondisi. Ini juga lebih pendek untuk membuat dan memisahkan string " mon tues wednes thurs fri satur sun".Split()[i]daripada membuat array string dengan ukuran ini (perhatikan ruang di awal string, yang menghemat mengurangi 1 dari i)
VisualMelon
2

Extended BrainFuck : 104

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

Tidak Disatukan (Idiomatik)

{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
Sylwester
sumber
2

T-SQL 36

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

Asumsikan variabel disimpan dalam @. Jika itu adalah input yang tidak valid (@> 7 atau @ <1), maka itu tidak memilih apa pun.

Sunting: Rupanya kencan bisa berupa angka. Dihapus 5 karakter dengan itu.

Sunting 2: Berdasarkan sunting pertama. Karena ini int, saya tidak harus menggunakan DATEADD (); Saya bisa menggunakan tambahan normal sebagai gantinya.

tanda
sumber
2

Javascript 93 :(

q=prompt();alert(q<8&&q>0?'0mon0tues0wednes0thurs0fri0satur0sun'.split(0)[q]+'day':'invalid')
Kevin L.
sumber
mengapa Anda menggunakan q && q <8?
CrazyMod
q && qq <8 memeriksa apakah q antara 1 dan 7
Kevin L
1
Bagaimana jika qitu -5?
Gagang Pintu
:( tapi itu tambahan 2 byte untuk> 0. Tetap menggunakan sedikit trik ipi, juga menghemat 2 byte
Kevin L
Apakah ini bekerja dengan q == 0?
edc65
2

Lua - 57 byte

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

Lua memiliki os.date () di perpustakaan standarnya, dan ia memformat. Jadi Anda dapat menghabiskan waktu (dalam hal ini "9e4 * (n + 3)") dan meminta untuk mengembalikan format "% A", yang merupakan nama-nama hari dalam seminggu. Juga, sangat berguna dalam Lua adalah "a dan b atau c". Jika a benar (dalam kode a adalah "n> 0 dan n <8") ia mengembalikan b, jika a salah (atau nil) ia mengembalikan c.

AndoDaan
sumber
1
Bisakah Anda memberikan penjelasan?
Cruncher
1
OP secara khusus meminta penanganan kesalahan, meskipun itu cukup samar. Lain kali, mintalah klarifikasi sebelum memposting jawaban yang tidak lengkap.
Rainbolt
1
Saya tidak berpikir ruang setelah %Adiperlukan
Kyle Kanos
@KyleKanos Benar, benar. Terima kasih!
AndoDaan
2

Mathematica 19 16 byte

DayName@{1,1,#}&

Seperti dicatat Dr. Rebmu, 1 Januari 1 AD adalah tempat yang baik untuk memulai. Itu (mungkin) jatuh pada hari Senin.

    DayName@{2014, 9, #} &[1]

Senin

DavidC
sumber
Mengapa September 2014 dan bukan 1 Januari tahun 1 M ?
HostileFork mengatakan jangan percaya
Jawabannya adalah: Saya gagal memikirkannya. Tapi saya akan memasukkan saran Anda.
DavidC
2

Bash - 21 19

Asumsikan input dalam variabel D:

date +%A -d$D"Jan1"

HTML + PHP - 26

Biarkan $dmenjadi teks input

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

Timestamp 86400 * 3 adalah hari Minggu pertama dari awal dunia UNIX.

Anda dapat mengujinya dengan menjalankan:

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

Perl, 60 byte

Sesuatu seperti ini:

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

Jika ingin mengembalikan pesan dan Anda khawatir tentang indeks negatif, Anda dapat menggunakan yang ini sebagai gantinya (8 karakter lagi):

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

Lua 134 119 115 100 100

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

Pada dasarnya pemikiran yang sama dimiliki MartinButtner , kecuali sekitar 4,5 4,1 1,7 1,4 kali lebih lama. Apakah menganggap ndisimpan sebagai variabel di tempat lain.

Kyle Kanos
sumber
Dalam keadilan, Anda tidak memerlukan semua itu I / O di sini.
Martin Ender
@ MartinBüttner: Saya pikir ini lebih lama jika saya menggunakan fungsi
Kyle Kanos
Hanya berharap nuntuk disimpan dalam variabel, seperti dalam cuplikan OP.
Martin Ender
ya, aku tidak mengharapkan I / O di sisimu.
CrazyMod
1

Python (84)

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

Saya kira ini adalah solusi yang menarik. Dibutuhkan ide dari jawaban lain yang saya baca di suatu tempat (tidak dapat menemukannya, saya tahu itu ada di situs ini, jadi jika ada yang tahu, jangan ragu untuk memberi tahu saya.) String dihasilkan dengan program J berikut:

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

Mengambil beberapa petunjuk halus dari jawaban ini :

lambda a:' mtwtfssouehrauneduitn snr u   es r   s'[a::7]+'day'if 0<a<8 else'invalid'
ɐɔıʇǝɥʇu
sumber
1

Bash 74 48+ pesan kesalahan

Pendekatan yang berbeda karena semua jawaban lain fokus pada penyimpanan string dalam beberapa bentuk.

read x;((0<x&&x<8))&&date -d2007010$x +%A||echo out of range
pengguna80551
sumber
berapa jumlah byte?
haskeller bangga
@proudhaskeller Tidak relevan karena ini belum ditandai sebagai kode-golf
user80551
Anda benar, semua solusi lain hanya memiliki hitungan byte. aneh.
haskeller bangga
Itu lebih merupakan shjawaban POSIX . Di dalam bashAnda dapat menggunakan evaluasi aritmatika. read x;((0<x&&x<8))&&date -d2007010$x +%A||echo out of rangelebih pendek.
manatwork
Pertanyaannya hanya menyatakan bahwa program tidak boleh macet jika angkanya tidak antara 1 dan 7, jadi Anda bisa menghapusnya ||echo out of range. Menimbang bahwa solusi yang diterima tidak mengikuti aturan (print to stdout) ... Tetapi jika Anda ingin mengikuti contoh OP, Anda dapat menggunakannya invalidsebagai ganti out of range.
nyuszika7h
1

Perl, 54

Dari STDIN ke STDOUT, tidak ada fungsi tanggal, tidak ada crash.

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

PHP (56 byte)

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

Clojure - 99 karakter

Polos dan sederhana, meskipun upaya (pemula) terbaik saya:

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

JS: 58

Dengan asumsi n sudah disimpan sebagai variabel.

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

Sebagai fungsi ES6 (asumsi yang sama): 67

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

Ini hanya akan mencetak "hari" untuk 0 dan loop sekitar untuk n> 7

Isiah Meadows
sumber
"Tueday"? Juga, deskripsi Anda tidak akurat, itu kembali dayuntuk 8dan mulai lagi dari Mondaypada 9.
nyuszika7h
@ nyuszika7h Terima kasih atas tangkapannya.
Isiah Meadows
1

Rebmu : 21 karakter

pcSYSTEM/locale/daysA

Untuk berlari:

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

Angka yang tidak valid akan mengembalikan "tidak ada".

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

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

Bagi mereka yang tidak terbiasa dengan Rebmu, ia menggunakan transisi kasus untuk menghilangkan kebutuhan spasi - dalam batas-batas apa yang secara hukum dapat diuraikan. Alih-alih menggunakan InitialCapsToBreak, ia menggunakan CASEtransitionsTObreak, karena itu memungkinkan makna yang berbeda untuk dianggap berasal dari modal awal yang dijalankan jika awal awal adalah huruf kecil.

Jadi itu setara dengan program Rebol pick system/locale/days a . (Rebmu dengan konvensi menamai parameter skripnya sebagai "a").

Menghemat satu karakter lebih dari system/locale/days/(a):-)

HostileFork mengatakan jangan percaya pada SE
sumber
1

Haskell - 62

Membungkus; 0adalah hari Minggu, 8hari Senin, dan seterusnya.

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

Jika mencetak ke stdout diperlukan ( 68 byte , output dalam tanda kutip ganda):

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

LiveScript - 49

Kembali undefineddayjika input tidak valid. ;)

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

Jika mencetak ke stdout diperlukan ( 60 byte ):

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

Befunge-93 (206 208 )

Yang ini menyenangkan untuk ditulis. Saya yakin itu bisa dilakukan dengan cara yang lebih baik, tapi ... itu berhasil! =) Dapat dicoba di sini .

Akan lebih pendek jika #akan melompati seluruh string daripada hanya sel individu.

&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",,,@

Ide dasar di baliknya: Dapatkan nomor dan terus mengurangi itu. Setiap kali kita mengurangi itu, kursor bergerak ke kanan, membungkus dan dikirim satu tingkat lebih rendah. Setelah kami mencapai nol, alih-alih pindah ke kiri dan tekan nama hari (bagian pertama). Sejak saat itu, kursor akan bergerak langsung ke bagian bawah di mana string dicetak dan "hari" ditambahkan.

Anda dapat melihat cara kerjanya dengan menggunakan fitur "Langkah" di tautan ke penerjemah online.

Sunting: Saya berhasil mencukur dua byte dengan melakukan >:#,_alih - alih >,,,,,,, yang merupakan pretter juga.

Ingo Bürk
sumber
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']

Haskell: 75

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

Haskell: 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'
Minar Ashiq Tishan
sumber
Anda mungkin harus memposting ini sebagai jawaban terpisah.
nyuszika7h
Dengan Python: (0<n<8)lebih pendek dari itu (n in range(8)). split()juga membagi string
AMK
1

Java 8 - 69 64 karakter

Berikut ini ekspresi di Java 8, termasuk impor. Sekarang ditingkatkan (terima kasih kepada Tomáš Dvořák ):

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

Cukup cetak MONDAYuntuk nilai palsu darii

Michael Easter
sumber
Kiat: .name () lebih pendek dari .toString () dan melakukan hal yang sama. Anda dapat menyimpan 4 karakter. Anda juga dapat menggunakan hanya satu & bukannya dua dan menyimpan char lain.
Tomáš Dvořák
1

Python - 87

Saya tidak melihat cukup cinta untuk dict's. Get () Yang ini mengharapkan amenjadi nomor

dict(enumerate("mon,tues,wednes,thurs,fri,satur,sun".split(","),1)).get(a,"bad ")+"day"
mendalam
sumber
Anda dapat menyimpan beberapa karakter dengan menghapus semua kemunculan daydalam daftar Anda dan menambahkan +"day"di akhir kode Anda.
ProgramFOX
Anda juga dapat menyimpan beberapa karakter dengan meletakkan semua hari dalam satu string dan kemudian membaginya alih-alih menempatkannya secara terpisah dalam daftar:"mon,tues,...".split(",")
ProgramFOX
Itu bekerja dengan baik, tepuk tangan :-)
deepy
0

Python, 95 byte

"%day"%["mon","tues","wednes","thurs","fri","satur","sun"][n-1] if 0<n<8 else "invalid"
Tom
sumber
2
monsday Apakah saya membacanya dengan benar?
trichoplax
Tidak yakin dari mana Anda mendapat 95 byte dari, menurut hitungan saya itu 88. Saya berhasil menyelamatkan 11 dengan memperbaiki bug "monsday", menggunakan penggabungan string daripada %memformat, membuat daftar dari string menggunakan split()dan menghapus spasi yang tidak perlu.
undergroundmonorail
2
"mon tues wednes thurs fri satur sun".split()[n-1]+"day"if 0<n<8else"invalid"
undergroundmonorail
@undergroundmonorail Anda dapat menyimpan 6 byte lainnya dengan menggunakan tanda kutip tunggal alih-alih tanda kutip ganda
trichoplax
2
@githubphagocyte Saya tidak tahu apakah Anda bercanda atau salah serius tentang berapa banyak karakter kutipan byte mengambil.
undergroundmonorail
0

Python 2, 84 83 64

Dengan asumsi n sudah disimpan sebagai variabel.

import calendar as c;print c.day_name[n-1]if 0<n<8 else'Invalid' 
fsfd1100
sumber
Dari komentar ini , sepertinya input dapat diabaikan.
Kyle Kanos
0

Cobra - 43

print if(0<n<8,(n%7)to DayOfWeek,'Invalid')
Suram
sumber