05AB1E , 130 128 133 131 124 123 बाइट्स
žežfžg)V0[Y`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()ćsO7%2@+Y`т‰0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVYI'.¡Q#
मैं अपने दिमाग से बाहर हूँ..
गोल्फिंग भाषा 05AB1E के लिए यह बिल्कुल भी मायने नहीं रखता कि इनपुट साथ है .
या नहीं -
। हालाँकि, 05AB1E में दिनांक ऑब्जेक्ट्स या परिकलन के लिए कोई भी बिल्ड नहीं है। आज की तारीखों के बारे में एकमात्र बिल्टिन वर्ष / माह / दिन / घंटे / मिनट / सेकंड / माइक्रोसेकंड है।
तो इस वजह से, आपके द्वारा देखे जाने वाले लगभग सभी कोड अगले दिन जाने के लिए मैन्युअल गणना हैं, और सप्ताह के दिन की गणना करते हैं।
+5 बाइट्स एक भाग के कारण मैं ज़ेलर के फार्मूले में भूल गया (वर्ष -1 जनवरी और फरवरी महीने के लिए) ।।
इसे ऑनलाइन आज़माएँ या 'आज' की एक स्व-निर्दिष्ट तिथि के साथ इसे ऑनलाइन आज़माएँ ।
स्पष्टीकरण:
पाठ की दीवार आने वाली।
सामान्य तौर पर, कोड निम्नलिखित छद्म कोड का अनुसरण करता है:
1 Date currentDate = today;
2 Integer counter = 0;
3 Start an infinite loop:
4* If(currentDate is NOT a Saturday and currentDate is NOT a Sunday):
5 Counter += 1;
6* currentDate += 1; // Set currentDate to the next day in line
7 If(currentDate == parsed input-string):
8 Stop the infinite loop, and output the counter
1) Date currentDate = today;
05AB1E कार्यक्रम का यह हिस्सा है:
že # Push today's day
žf # Push today's month
žg # Push today's year
) # Wrap them into a single list
V # Pop and store this list in variable `Y`
2) Integer counter = 0;
और 3) Start an infinite loop:
05AB1E कार्यक्रम में सीधे आगे हैं:
0 # Push 0 to the stack
[ # Start an infinite loop
4) If(currentDate is NOT a Saturday and currentDate is NOT a Sunday):
मैनुअल गणना के साथ पहला कठिन हिस्सा है। चूंकि 05AB1E में कोई दिनांक निर्मित नहीं है, इसलिए हमें मैन्युअल रूप से सप्ताह के दिन की गणना करनी होगी ।
ऐसा करने का सामान्य सूत्र है:
h=(q+⌊13(m+1)5⌋+K+⌊K4⌋+⌊J4⌋−2J)mod7,
जहां दिसंबर के माध्यम से मार्च के लिए महीने:
- क्ष है घa y महीने के (
[1, 31]
)
- म 1-अनुक्रमित हैएम ओ एन टी एच (
[3, 12]
) है
- क शताब्दी का वर्ष है (yई एक आर मॉड 100 )
- जे 0-अनुक्रमित सदी है (⌊yई एक r100⌋)
और जनवरी और फरवरी के महीनों के लिए:
- क्ष है घa y महीने के (
[1, 31]
)
- म 1-अनुक्रमितm o n t h + 12 (
[13, 14]
) है
- क पिछले वर्ष के लिए सदी का वर्ष है (( ye r a - 1 ) mod 100 )
- जे पिछले वर्ष के लिए 0-अनुक्रमित सदी है (⌊ यई एक r - 1100⌋ )
सप्ताह ज के दिन में परिणाम , जहां 0 = शनिवार, 1 = रविवार, ..., 6 = शुक्रवार।
स्रोत: ज़ेलर का अभिनंदन
हम इसे 05AB1E कार्यक्रम के इस भाग में देख सकते हैं:
Y # Push variable `Y`
` # Push the day, month, and year to the stack
U # Pop and save the year in variable `X`
Ð # Triplicate the month
3‹ # Check if the month is below 3 (Jan. / Feb.),
# resulting in 1 or 0 for truthy/falsey respectively
12* # Multiply this by 12 (either 0 or 12)
+ # And add it to the month
# This first part was to make Jan. / Feb. 13 and 14
> # Month + 1
13* # Multiplied by 13
5÷ # Integer-divided by 5
s3‹ # Check if the month is below 3 again (resulting in 1 / 0)
Xα # Take the absolute difference with the year
© # Store this potentially modified year in the register
т% # mYear modulo-100
D4÷ # mYear modulo-100, integer-divided by 4
®т÷©4÷ # mYear integer-divided by 100, and then integer-divided by 4
®·( # mYear integer-divided by 100, doubled, and then made negative
) # Wrap the entire stack into a list
ć # Extract the head (the counter variable that was also on the stack)
s # Swap so the calculated values above are as list at the top
O # Take the sum of this entire list
7% # And then take modulo-7 to complete the formula,
# resulting in 0 for Saturday, 1 for Sunday, and [2, 6] for [Monday, Friday]
2@ # Check if the day is greater than or equal to 2 (so a working day)
5) Counter += 1;
फिर से सीधे आगे है:
# The >=2 check with `2@` results in either 1 for truthy and 0 for falsey
+ # So just adding it to the counter variable is enough
6) currentDate += 1; // Set currentDate to the next day in line
फिर से अधिक जटिल है, क्योंकि हमें इसे मैन्युअल रूप से करना होगा। तो यह निम्नलिखित छद्म कोड के लिए विस्तारित किया जाएगा:
a Integer isLeapYear = ...;
b Integer daysInCurrentMonth = currentDate.month == 2 ?
c 28 + isLeapYear
d :
e 31 - (currentDate.month - 1) % 7 % 2;
f If(currentDate.day < daysInCurrentMonth):
g nextDate.day += 1;
h Else:
i nextDate.day = 1;
j If(currentDate.month < 12):
k nextDate.month += 1;
l Else:
m nextDate.month = 1;
n nextDate.year += 1;
सूत्रों का कहना है:
यह निर्धारित करने के लिए एल्गोरिथ्म कि एक वर्ष एक लीप वर्ष है। (संपादित करें: अब प्रासंगिक नहीं है, क्योंकि मैं एक वैकल्पिक विधि काउपयोगकरके लीप वर्षों की जांच करता हूंजिससे 7 बाइट बचती हैं।)
एक महीने में दिनों की संख्या निर्धारित करने के लिए एल्गोरिथम।
6a) Integer isLeapYear = ...;
05AB1E कार्यक्रम में इस तरह किया जाता है:
Y # Push variable `Y`
` # Push the days, month and year to the stack
т‰ # Divmod the year by 100
0K # Remove all items "00" (or 0 when the year is below 100)
θ # Pop the list, and leave the last item
4Ö # Check if this number is visible by 4
U # Pop and save the result in variable `X`
मेरे इस 05AB1E उत्तर में भी उपयोग किया जाता है , इसलिए चरणों को चित्रित करने के लिए कुछ उदाहरण वर्ष जोड़े जाते हैं।
6b) currentDate.month == 2 ?
और सी) 28 + isLeapYear
इस तरह से किए जाते हैं:
D # Duplicate the month that is now the top of the stack
2Q # Check if it's equal to 2
i # And if it is:
\ # Remove the duplicated month from the top of the stack
28X+ # Add 28 and variable `X` (the isLeapYear) together
6d) :
और 6e) 31 - (currentDate.month - 1) % 7 % 2;
इस तरह से किए जाते हैं:
ë # Else:
< # Month - 1
7% # Modulo-7
É # Is odd (shortcut for %2)
31 # Push 31
α # Absolute difference between both
} # Close the if-else
6f) If(currentDate.day < daysInCurrentMonth):
इस तरह किया जाता है:
‹ # Check if the day that is still on the stack is smaller than the value calculated
i # And if it is:
6 ग्राम) nextDate.day += 1;
इस तरह किया जाता है:
Y # Push variable `Y`
¬ # Push its head, the days (without popping the list `Y`)
> # Day + 1
0 # Push index 0
# (This part is done after the if-else clauses to save bytes)
}} # Close the if-else clauses
ǝ # Insert the day + 1 at index 0 in the list `Y`
V # Pop and store the updated list in variable `Y` again
6) Else:
और 6i) nextDate.day = 1;
तब इस तरह किए जाते हैं:
ë # Else:
Y # Push variable `Y`
1 # Push a 1
¾ # Push index 0
ǝ # Insert 1 at index 0 (days part) in the list `Y`
6j) If(currentDate.month < 12):
:
D # Duplicate the list `Y`
Ås # Pop and push its middle (the month)
D12‹ # Check if the month is below 12
i # And if it is:
6k) nextDate.month += 1;
:
> # Month + 1
1 # Push index 1
# (This part is done after the if-else clauses to save bytes)
}} # Close the if-else clauses
ǝ # Insert the month + 1 at index 1 in the list `Y`
V # Pop and store the updated list in variable `Y` again
Else:
6 एल) , 6 मी) nextDate.month = 1;
और 6 एन)nextDate.year += 1;
तो इस तरह से किए जाते हैं:
ë # Else:
\ # Delete the top item on the stack (the duplicated month)
1 # Push 1
D # Push index 1 (with a Duplicate)
ǝ # Insert 1 at index 1 (month part) in the list `Y`
¤ # Push its tail, the year (without popping the list `Y`)
> # Year + 1
2 # Index 2
# (This part is done after the if-else clauses to save bytes)
}} # Close the if-else clauses
ǝ # Insert the year + 1 at index 2 in the list `Y`
V # Pop and store the updated list in variable `Y` again
और अंत में 8) If(currentDate == parsed input-string):
और 9) Stop the infinite loop, and output the counter
:
Y # Push variable `Y`
I # Push the input
'.¡ '# Split it on dots
Q # Check if the two lists are equal
# # And if they are equal: stop the infinite loop
# (And output the top of the stack (the counter) implicitly)