วันนี้คือวันอะไร?


26

ท้าทาย

แปลกอย่างนี้ยังไม่เสร็จ: ส่งออกวันที่ปัจจุบัน

กฎระเบียบ

รูปแบบวันที่ที่คุณควรปฏิบัติตามมีดังนี้:

YYYY-MM-DD

โดยที่เลขศูนย์และเดือนควรมีค่าเป็นศูนย์ถ้าน้อยกว่า 10

ตัวอย่างเช่นหากโปรแกรมทำงานในวันที่ 24 พฤษภาคม 2017 ก็ควรส่งออก

2017-05-24

วันที่สามารถอยู่ใน UTC หรือวันที่ท้องถิ่น

คุณต้องจัดการกับ leaps ปี เช่นในปีอธิกสุรทินเดือนกุมภาพันธ์มี 29 วัน แต่ 28 วันในปีปกติ

การชนะ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


14
มีความสุข 10k ตัวแทน!
Rohan Jhunjhunwala

1
และขอแสดงความยินดีกับหัวข้อที่เติบโตเร็วที่สุดที่ฉันเคยเห็น : D
Titus

@Titus คุณควรเห็น Hello, World! : D
Beta Decay

... และในปีปกติกุมภาพันธ์มีหลักสูตร 31 วัน
edc65

@ edc65 ฉันควรจะรู้จริง ๆ แล้วว่า ก.พ. เป็นเวลา 29 ปีในการกระโดดปี: P
Beta Decay

คำตอบ:


12

Bash , 16 7 ไบต์

-8 ไบต์ต้องขอบคุณ Neil (และ fergusq) (ไม่ต้องใช้ไพพ์ในการส่งออก)
-1 ไบต์ขอบคุณ 12431234123412341234123 (ใช้ตัวเลือกในตัวพร้อมธง-I!)

date -I

ลองออนไลน์!


2
ทำไมecho $(...)?
Neil

มันไม่จำเป็นต้องเอาท์พุท?
Jonathan Allan

6
dateเอาท์พุทแล้วส่งออกไปยัง stdout คุณไม่จำเป็นต้องไปป์ไลน์echoซึ่งไปป์ที่ stdout ลองออนไลน์!
fergusq

แต่ถึงแม้ว่าคุณจะต้องการใช้งานechoจริงอย่างน้อยecho `date +%F`ก็ตาม
จัดการ

5
ทำไมไม่ใช้-I?
12431234123412341234123

10

PHP, 17 ไบต์

<?=date('Y-m-d');

1
ที่จริงแล้วYYYY-MM-DDThh:mm:ss+hh:mmเป็นวันที่จัดรูปแบบISO 8601และ 11 ไบต์เหล่านี้: <?=date(c);พิมพ์เนื้อหาทั้งหมด ;)
Titus

<?=strstr(date(c),T,1);เพื่อให้รูปแบบคมีโอกาสเล็กน้อย
JörgHülsermann


7

Bash ขนาด 15 ไบต์

printf '%(%F)T'

วิ่งตัวอย่าง:

bash-4.4$ printf '%(%F)T'
2017-05-24

ลองออนไลน์!


ดียิ่งขึ้นกว่าที่ฉันพบในดังนั้น, Tไม่รู้
Jonathan Allan

@JonathanAllan มันถูกเพิ่มเข้าใน Bash 4.2 เท่านั้นและจนกว่า Bash 4.3 จะต้องมีอาร์กิวเมนต์เพื่อจัดรูปแบบ
จัดการ



4

Mathematica ขนาด 20 ไบต์

DateString@"ISODate"

9
บางครั้งฉันเข้ามาในความท้าทายเหล่านี้เพื่อไม่ให้ Mathematica มีในตัว แต่เพื่อดูว่ามันคืออะไร
PunPun1000


3

Excel, 24 ไบต์

=TEXT(NOW(),"yyy-mm-dd")

Excel จะยังคงปี 4 หลักที่มีเพียง 3 yของ


2
แผ่น Google ")จะเพิ่ม Excel จะไม่ มันจะเพิ่ม)ในตอนท้าย แต่หลังจากที่แจ้งให้คุณดังนั้นมันจะต้องมีการป้อนข้อมูลของผู้ใช้เพิ่มเติมและขับคะแนนขึ้นอีกครั้ง 24 ไบต์น่าจะเป็นคำตอบที่สั้นที่สุด Excel ถ้าเราอนุญาตให้มีการตั้งค่าภูมิภาคโดยใช้รูปแบบวันที่ ISO โดยค่าเริ่มต้นและที่ขึ้นสำหรับการอภิปราย
Engineer Toast

@EngineerToast ขอบคุณ ฉันจะแก้ไขมัน
Scott Milner

2

R , 10 ไบต์

Sys.Date()

ลองออนไลน์!


1
ตั้งแต่sys.dateอยู่แล้วฟังก์ชั่นที่คุณไม่จำเป็นต้องเพิ่ม()ดังนั้นนี้เป็นเพียง 8 ไบต์ :)
JAD

@JarkoDubbeldam ไม่เป็นความจริง, () เป็นสิ่งจำเป็น
D. Nelson

@ D.Nelson codegolf.meta.stackexchange.com/questions/2419/… Sys.Dateเป็นฟังก์ชั่นดังนั้นจะพอเพียงในการแก้ปัญหา ไม่จำเป็นต้องเรียกมันอย่างชัดเจน
JAD

@JarkoDubbeldam เป็นกรณีปกติ แต่ฉันคิดว่าเนื่องจากความท้าทายคือการ 'ส่งออกวันที่ปัจจุบันในรูปแบบ ISO-8601' จริง ๆ แล้วฉันต้องการส่งออก
Giuseppe

1
ใช่แล้วและบรรทัดสุดท้ายของSys.Dateผลลัพธ์สำหรับคุณ มันคล้ายกับเมื่อคุณมีวิธีแก้ปัญหาที่เริ่มต้นด้วยfunction(x)คุณไม่ได้จบลงด้วยการโทรอย่างชัดเจน มันเป็นเพียงแค่การสร้างคะแนนในตัว
JAD


2

อลิซ 9 ไบต์

/oT\
@%;'

ลองออนไลน์!

คำอธิบาย

ฉันจะปล่อยให้โฟลว์คอนโทรลที่แน่นอนเป็นแบบฝึกหัดให้กับผู้อ่าน แต่โค้ดเชิงเส้นที่กำลังทำงานในโหมด Ordinal คือ:

%T'T%;o@

และนี่คือสิ่งที่มันทำ:

%   Split an implicit empty string around an implicit empty string. Really doesn't
    do anything at all.
T   Push the current datetime as a string like "2017-05-24T20:53:08.150+00:00"
'T  Push "T".
%   Split the datetime string around the "T", to separate the date from the time.
;   Discard the time.
o   Output the date.
@   Terminate the program.

วิธีหนึ่งที่อาจเป็น golfable คือการใช้ซ้ำ%เพื่อยุติโปรแกรมในโหมด Cardinal ด้วยการหารด้วยศูนย์ แต่เลย์เอาต์เดียวที่ฉันคิดไว้คือ:

\;T
\%o'

แต่ที่นี่โปรแกรม%ไม่เลิกจริง ๆ เพราะเรากด 111 ( 'o) ก่อนล่วงหน้าดังนั้นจึงไม่มีการหารด้วยศูนย์

โดยหลักการแล้วอาจเป็นไปได้ที่จะใช้ซ้ำ%เพื่อกำจัด;เนื่องจากการพยายามแยกวันที่ในช่วงเวลานั้นจะเป็นการยกเลิกเวลา


2

SmileBASIC 3, 29 ไบต์

SB มีสตริงวันที่สร้างขึ้นใน ... แต่มันอยู่ในรูปแบบที่ไม่ถูกต้อง! มันใช้สแลชแทนการขีดกลางไม่ดี ยิ่งไปกว่านั้นการเป็น BASIC ที่ให้ความเคารพตนเองเป็นสิ่งที่ไม่มีฟังก์ชั่นทดแทนทั่วโลก ฉันเดาว่าฉันต้องทำเอง ...

D$=DATE$D$[4]="-
D$[7]="-
?D$

2

VBA, 5 25 ไบต์

?Date ไม่แน่นอนขึ้นอยู่กับการตั้งค่าวันที่แบบสั้นของระบบ

?Format(Now,"yyyy-mm-dd")

เอาท์พุท:

2017-05-25 

6
คำตอบนี้มีความผันผวนอย่างมากและโดยคนหูหนวกจะไม่ทำงานบนคอมพิวเตอร์ส่วนใหญ่เนื่องจากขึ้นอยู่กับผู้ใช้ที่มีรูปแบบวันที่สั้น ๆ ของระบบ [ภายใต้การตั้งค่า -> วันที่ & เวลาใน Win10] ตั้งค่าเป็น 'YYYY-MM-DD . The default format for this is M / D / YYYY` และทำให้นี้สำหรับการส่งออกของฟังก์ชั่นDate 5/25/2017หากต้องการแก้ไขคำตอบของคุณจะต้องถูกFormatโทรออก
Taylor Scott

2
@TaylorScott ถึงการ?format(now,"yyyy-mm-dd")ใช้ปลายทางnowนั้นสั้นกว่าdate
Greedo

1
@ Greedo นั่นถูกต้อง นี่คือความรู้ของฉันวิธีที่สั้นที่สุดในการบรรลุเป้าหมายนี้โดยใช้ VBA
Taylor Scott

1
@TaylorScott ขอบคุณที่ชี้ให้เห็นว่าฉันไม่ทราบถึงการพึ่งพาการตั้งค่าวันที่ของระบบ รูปแบบวันที่นี้เป็นค่าเริ่มต้นในพีซีของฉันและในประเทศของฉันโดยทั่วไปดังนั้นฉันจึงมั่นใจเล็กน้อยที่นี่
Maciej Lipinski


1

QBIC , 33 ไบต์

B=_D?_sB,-4|+@-`+_sB,2|+A+_sB,4,2

คำอธิบาย:

B=_D        Assign the system's date to B$
            This is in American mm-dd-yyyy format, so we'll need to do some reformatting
?_sB,-4|    PRINT substring B, take 4 chars from the right
 +@-`         plus the string literal "-", now A$
 +_sB,2|      plus the leftmost two chars
 +A           and A$ again
 +_sB,4,2     plus the middle part.

1

CJam , 22 15 ไบต์

et3<{sY0e[}%'-*

ลองออนไลน์!

-7 ไบต์ขอบคุณ Challenger5

คำอธิบาย:

et                       Get array with [year,month,day,stuff...]
  3<                     Slice array to get [y,m,d] 
    {                    For each item do:
     s                     To string
      Y0e[                 add a 0 to the beginning of the string if it is shorter than 2 chars.
          }%             End for each
            '-*          Join the array with "-" as a separator

คุณสามารถใช้e[(pad array) 15 ไบต์:et3<{sY0e[}%'-*
Esolanging Fruit

@ Challenger5 เยี่ยมมาก ขอบคุณ
FrodCube




1

Powershell, 26 17 ไบต์

Date -f yyy-MM-dd

ขอบคุณ @ConnorLSW สำหรับ 9 ไบต์


คุณสามารถประหยัดได้มากที่นี่ date -f 'yyyy-MM-dd'
colsw

ขอบคุณชาย ฉันใหม่กับ Powershell ดังนั้นฉันจึงลองเสี่ยงโชคที่นี่
ศิวาปราศัทวาดลิขิต

@Shivaprasath V - ไม่ต้องกังวลลองอ่านกระทู้นี้ดูกระทู้ที่มีประโยชน์พร้อมกับเทคนิคการตีกอล์ฟ PS ขั้นพื้นฐานถ้าคุณต้องการ
colsw


1

MATLAB / Octave , 25 15 ไบต์

datestr(now,29)

ลองออนไลน์!


ฟังก์ชันในตัวnowส่งคืนวันที่ปัจจุบันของระบบในรูปแบบอนุกรม MATLAB ที่แปลกประหลาด

datestrจัดรูปแบบรูปแบบอนุกรมที่แปลกประหลาดเป็นสตริงของรูปแบบที่ร้องขอ - ซึ่งในกรณี'YYYY-mm-dd'นี้ แต่กลับกลายเป็นว่า MATLAB datestrมีรายชื่อของรูปแบบที่กำหนดไว้ล่วงหน้าสำหรับ ISO8601 เป็นหนึ่งในนั้นและถูกแทนด้วยหมายเลข 29 ซึ่งช่วยให้ประหยัดได้ 10 ไบต์


1

Python 2 ,  53  40 ไบต์

-10 ไบต์ขอบคุณGábor Fekete (ISO-8601 เป็นรูปแบบเริ่มต้นสำหรับวัตถุวันที่)

from datetime import*
print date.today()

ลองออนไลน์!

อย่างไร?

datetime.date.today()จะส่งคืนdatetime.dateวัตถุที่มีข้อมูลวันที่ท้องถิ่น

printจะพิมพ์การแทนค่าสตริงของวัตถุนั้นจะเรียก__str__ฟังก์ชันของวัตถุ

จากเอกสาร :

  • date.__str__(): สำหรับdate d, เทียบเท่ากับstr(d)d.isoformat()

  • date.isoformat(): กลับมาเป็นstringตัวแทนของวันที่ในการรับรองมาตรฐาน ISO 8601‘YYYY-MM-DD’รูปแบบ ตัวอย่างเช่นdate(2002, 12, 4).isoformat() == '2002-12-04'.


1
import datetime;print datetime.date.today()นี่เป็นเพียง 43 ไบต์และใช้ datetime ทำไมเวอร์ชั่นที่สั้นกว่าจึงถูกลบ?
Gábor Fekete

@GáborFeketeขอบคุณ (ฉันคิดว่าคุณควรโพสต์จริงๆมันแตกต่างกันพอสมควร) คำตอบอื่น ๆ อาจถูกลบเพราะมันไม่ได้พิมพ์สตริงที่จัดรูปแบบอย่างถูกต้อง ฉันได้เพิ่มคำอธิบายเกี่ยวกับสาเหตุที่ใช้งานได้จริง (ตราบใดที่มีprint) ที่บันทึกไว้อีกสามทำ import*(ชั่ว)
Jonathan Allan

ฉันต้องการ แต่มีวิธีแก้ไขปัญหาอื่นซึ่งสั้นกว่าของฉัน แต่ถูกลบด้วยเหตุผลบางอย่าง
Gábor Fekete

... ซึ่งขณะนี้ได้รับการแก้ไขเพื่อรวมprintขณะที่ถูกลบแล้วถูกลบทิ้ง
Jonathan Allan

1

คริสตัล , 30 ไบต์ 24 ไบต์ 21 ไบต์

-6 ขอบคุณNick Clifford

-3 จากการดูคำตอบของหอยทากใน Ruby

p Time.now.to_s("%F")

ลองออนไลน์!


2
%Fผมค่อนข้างมั่นใจว่าคุณสามารถใช้ ยังดีที่ได้เห็นคริสตัลบน PPCG!
Nick Clifford

1
@ Nick Clifford ฉันเห็นมันใน tio และคิดว่ามันมีชื่อที่เท่ห์
TitusLucretius


1

C #, 46 45 ไบต์

_=>System.DateTime.Now.ToString("yyy-MM-dd");

บันทึกเป็นไบต์ด้วย @raznagul


2
ฉันจะดาวน์โหลดSytemที่ไหน
Erik the Outgolfer

6
@EriktheOutgolfer มันเป็น wrapper ที่กำหนดเองที่ฉันสร้างขึ้นรอบ ๆSystemnamespace เพราะฉันยังคงทำตัวพิมพ์ผิดเหมือนเดิม ...
TheLethalCoder

4
คุณรู้ว่าสิ่งที่คุณสร้างในพื้นที่ไม่ได้รับอนุญาตบน PPCG เว้นแต่จะมีการเผยแพร่ก่อนที่คำถามจะถูกถาม : P
Erik the Outgolfer

1
@EriktheOutgolfer ประณามครั้งต่อไปฉันจะสร้างเสื้อคลุมสั้นเช่นกัน ...
TheLethalCoder

1
เนื่องจากไม่จำเป็นต้องมีศูนย์นำหน้าสำหรับปีสตริงรูปแบบ"yyy-MM-dd"จะใช้งานได้เช่นกัน
raznagul

1

Java 8, 26 32 ไบต์

()->java.time.LocalDate.now()+""

รูปแบบคงที่ต้องขอบคุณ Kevin Cruijssen


ว้าวชวาสั้นจริงๆ... ฉันไม่เคยคิดเลยว่าจะได้ดูวัน: D
เบต้าเสื่อมลง

@BetaDecay มันสั้น แต่ในปัจจุบันไม่ปฏิบัติตามกฎ codegolf มาตรฐาน มันควรจะเป็นฟังก์ชั่นแทนที่จะเป็นข้อมูลโค้ดและควรนับรวมการนำเข้าที่จำเป็นด้วย ดังนั้นมันควรจะเป็น()->java.time.LocalDate.now().toString()แทน จากนั้นอีกครั้งคุณสามารถกอล์ฟ.toString()ไป+""ดังนั้นมันจะกลายเป็น()->java.time.LocalDate.now()+""ทั้งหมด ( 32 ไบต์ )
Kevin Cruijssen

1

C ++ 14 143 ไบต์ 139 ไบต์

#include <cstdio>
#include <time.h>
int main (){time_t t;char D[11];time(&t);strftime(D,sizeof D,"%Y-%m-%d",localtime(&t));printf("%s",D);}

Timtech ชี้ให้ฉันเห็นว่าฉันไม่ต้องการช่องว่างทั้งหมด

ทดสอบฉัน!


คุณไม่สามารถลบช่องว่างเหล่านั้นสองสามอันได้หรือไม่
Timtech

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.