French Republican calendar: Difference between revisions
Content added Content deleted
(added FreeBASIC) |
|||
Line 196: | Line 196: | ||
> 19 September 2016 |
> 19 September 2016 |
||
Fete du travail 224</pre> |
Fete du travail 224</pre> |
||
=={{header|FreeBASIC}}== |
|||
<lang freebasic>' version 18 Pluviose 227 |
|||
' compile with: fbc -s console |
|||
' retained the original comments for then BBC BASIC entry |
|||
#Macro rep_leap (_year) |
|||
' see comment at the beginning of rep_to_day |
|||
((_year +1) Mod 4 = 0 And ((_year +1) Mod 100 <> 0 Or (_year +1) Mod 400 = 0)) |
|||
#EndMacro |
|||
#Macro gre_leap (_year) |
|||
(_year Mod 4 = 0 And (_year Mod 100 <> 0 Or _year Mod 400 = 0)) |
|||
#EndMacro |
|||
Dim Shared As UInteger gregorian(11) => {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} |
|||
Dim Shared As String gregorian_s(11), republican(11), sanscolottides(5) |
|||
' 7-bit ASCII encoding, so no accents on French words |
|||
Data "January", "February", "March", "April", "May", "June" |
|||
Data "July", "August", "September", "October", "November", "December" |
|||
Data "Vendemiaire", "Brumaire", "Frimaire","Nivose", "Pluviose", "Ventose" |
|||
Data "Germinal", "Floreal", "Prairial", "Messidor", "Thermidor", "Fructidor" |
|||
Data "Fete de la Vertu", "Fete du Genie", "Fete du Travail", "Fete de l'Opinion" |
|||
Data "Fete des Recompenses","Fete de la Revolution" |
|||
Restore |
|||
For i As UInteger = 0 To 11 |
|||
Read gregorian_s(i) |
|||
Next |
|||
For i As UInteger = 0 To 11 |
|||
Read republican(i) |
|||
Next |
|||
For i As UInteger = 0 To 5 |
|||
Read sanscolottides(i) |
|||
Next |
|||
Sub split(s As String, ByRef d As UInteger, ByRef m As UInteger, ByRef y As UInteger) |
|||
Dim As String month_and_year, Month |
|||
Dim As UInteger i |
|||
s = LCase(Trim(s)) : d = 0 : m = 0 : y = 0 |
|||
If Left(s,4) = "fete" Then |
|||
m = 13 |
|||
For i = 0 To 5 |
|||
If Left(s, Len(sanscolottides(i))) = LCase(sanscolottides(i)) Then |
|||
d = i +1 |
|||
y = Val(Right(s, Len(s) - Len(sanscolottides(i)) -1)) |
|||
End If |
|||
Next |
|||
Else |
|||
d = Val(Left(s, InStr(s, " ") -1)) |
|||
month_and_year = Mid(s, InStr(s, " ") +1) |
|||
Month = Left(month_and_year, InStr(month_and_year, " ") -1) |
|||
y = Val(Mid(month_and_year, InStr(month_and_year, " ") +1)) |
|||
If y < 1792 Then |
|||
For i = 0 To 11 |
|||
If LCase(republican(i)) = Month Then m = i +1 |
|||
Next |
|||
Else |
|||
For i = 0 To 11 |
|||
If LCase(gregorian_s(i)) = Month Then m = i +1 |
|||
Next |
|||
End If |
|||
End If |
|||
End Sub |
|||
Sub day_to_gre(Day As UInteger, ByRef d As UInteger, ByRef m As UInteger, ByRef y As UInteger) |
|||
y = Fix(Day / 365.25) |
|||
d = Day - Fix(365.25 * y) + 21 |
|||
y += 1792 |
|||
d += y \ 100 - y \ 400 - 13 |
|||
m = 8 |
|||
While d > gregorian(m) |
|||
d -= gregorian(m) |
|||
m += 1 |
|||
If m = 12 Then |
|||
m = 0 |
|||
y += 1 |
|||
If gre_leap(y) Then gregorian(1) = 29 Else gregorian(1) = 28 |
|||
End If |
|||
Wend |
|||
gregorian(1) = 28 |
|||
m += 1 |
|||
End Sub |
|||
Function gre_to_day(d As UInteger, m As UInteger, y As UInteger) As UInteger |
|||
' modified & repurposed from code given at |
|||
' https://www.staff.science.uu.nl/~gent0113/calendar/isocalendar_text5.htm |
|||
If m < 3 Then |
|||
y -= 1 |
|||
m += 12 |
|||
End If |
|||
Return Fix(365.25 * y) - y \ 100 + y \ 400 + Fix(30.6 * (m +1)) + d - 654842 |
|||
End Function |
|||
Function rep_to_day(d As UInteger, m As UInteger, y As UInteger) As UInteger |
|||
' assume that a year is a leap year iff the _following_ year is |
|||
' divisible by 4, but not by 100 unless also by 400 |
|||
' |
|||
' other methods for computing republican leap years exist |
|||
If m = 13 Then |
|||
m -= 1 |
|||
d += 30 |
|||
End If |
|||
If rep_leap(y) Then d -= 1 |
|||
Return 365 * y + (y +1) \ 4 - (y +1) \ 100 + (y +1) \ 400 + 30 * m + d - 395 |
|||
End Function |
|||
Sub day_to_rep(Day As UInteger, ByRef d As UInteger, ByRef m As UInteger, ByRef y As UInteger) |
|||
Dim As UInteger sansculottides = 5 |
|||
y = Fix(Day / 365.25) |
|||
If rep_leap(y) Then y -= 1 |
|||
d = Day - Fix(365.25 * y) + (y +1) \ 100 - (y +1) \ 400 |
|||
y += 1 |
|||
m = 1 |
|||
If rep_leap(y) Then sansculottides = 6 |
|||
While d > 30 |
|||
d -= 30 |
|||
m += 1 |
|||
If m = 13 Then |
|||
If d > sansculottides Then |
|||
d -= sansculottides |
|||
m = 1 |
|||
y += 1 |
|||
If rep_leap(y) Then sansculottides = 6 Else sansculottides = 5 |
|||
End If |
|||
End If |
|||
Wend |
|||
End Sub |
|||
' ------=< main >=------ |
|||
Dim As UInteger Day, Month, Year |
|||
Dim As String src |
|||
Print "*** French Republican ***" |
|||
Print "*** calendar converter ***" |
|||
Print "Enter a date to convert, in the format 'day month year'" |
|||
Print "e.g.: 1 Prairial 3," |
|||
Print " 20 May 1795." |
|||
Print "For Sansculottides, use 'day year'" |
|||
Print "e.g.: Fete de l'opinion 9." |
|||
Print "Or just press 'RETURN' to exit the program." |
|||
Print |
|||
Do |
|||
Line Input "> ", src |
|||
If src <> "" Then |
|||
split(src, Day, Month, Year) |
|||
If Day = 0 Or Month = 0 Or Year <= 0 Then |
|||
Print "Error in input" |
|||
Continue Do |
|||
End If |
|||
' for simplicity, we assume that years up to 1791 are republican |
|||
' and years from 1792 onwards are gregorian |
|||
If Year < 1792 Then |
|||
' convert republican date to number of days elapsed |
|||
' since 21 september 1792, then convert that number |
|||
' to the gregorian date |
|||
day_to_gre(rep_to_day(Day, Month, Year),Day, Month, Year) |
|||
Print; Day; " "; gregorian_s(Month -1); " "; Year |
|||
Else |
|||
' convert gregorian date to republican, via |
|||
' number of days elapsed since 21 september 1792 |
|||
day_to_rep(gre_to_day(Day, Month, Year), Day, Month, Year) |
|||
If Month = 13 Then |
|||
Print sanscolottides(Day -1); " "; Year |
|||
Else |
|||
Print ; Day; " "; republican(Month -1); " "; Year |
|||
End If |
|||
End If |
|||
End If |
|||
Loop Until src = "" |
|||
End</lang> |
|||
{{out}} |
|||
<pre>> 1 Vendemiaire 1 > 22 September 1792 > 1 Vendemiaire 1 > 23 September 1806 > 1 Vendemiaire 15 |
|||
22 September 1792 1 Vendemiaire 1 22 September 1792 1 Vendemiaire 15 23 September 1806 |
|||
> 22 September 1792 > 22 September 1793 > 1 Vendemiaire 2 > 24 September 1807 > 1 Vendemiaire 16 |
|||
1 Vendemiaire 1 1 Vendemiaire 2 22 September 1793 1 Vendemiaire 16 24 September 1807 |
|||
> 1 Prairial 3 > 22 September 1794 > 1 Vendemiaire 3 > 23 September 1808 > 1 Vendemiaire 17 |
|||
20 May 1795 1 Vendemiaire 3 22 September 1794 1 Vendemiaire 17 23 September 1808 |
|||
> 20 May 1795 > 23 September 1795 > 1 Vendemiaire 4 > 23 September 1809 > 1 Vendemiaire 18 |
|||
1 Prairial 3 1 Vendemiaire 4 23 September 1795 1 Vendemiaire 18 23 September 1809 |
|||
> 27 Messidor 7 > 22 September 1796 > 1 Vendemiaire 5 > 23 September 1810 > 1 Vendemiaire 19 |
|||
15 July 1799 1 Vendemiaire 5 22 September 1796 1 Vendemiaire 19 23 September 1810 |
|||
> 15 July 1799 > 22 September 1797 > 1 Vendemiaire 6 > 24 September 1811 > 1 Vendemiaire 20 |
|||
27 Messidor 7 1 Vendemiaire 6 22 September 1797 1 Vendemiaire 20 24 September 1811 |
|||
> Fete de la Revolution 11 > 22 September 1798 > 1 Vendemiaire 7 > 23 September 2015 > 1 Vendemiaire 224 |
|||
23 September 1803 1 Vendemiaire 7 22 September 1798 1 Vendemiaire 224 23 September 2015 |
|||
> 23 September 1803 > 23 September 1799 > 1 Vendemiaire 8 > 22 September 2016 > 1 Vendemiaire 225 |
|||
Fete de la Revolution 11 1 Vendemiaire 8 23 September 1799 1 Vendemiaire 225 22 September 2016 |
|||
> 10 Nivose 14 > 23 September 1800 > 1 Vendemiaire 9 > 22 September 2017 > 1 Vendemiaire 226 |
|||
31 December 1805 1 Vendemiaire 9 23 September 1800 1 Vendemiaire 226 22 September 2017 |
|||
> 31 December 1805 > 23 September 1801 > 1 Vendemiaire 10 > 22 September 2018 > 1 Vendemiaire 227 |
|||
10 Nivose 14 1 Vendemiaire 10 23 September 1801 1 Vendemiaire 227 22 September 2018 |
|||
> 23 September 1802 > 1 Vendemiaire 11 > 23 September 2019 > 1 Vendemiaire 228 |
|||
1 Vendemiaire 11 23 September 1802 1 Vendemiaire 228 23 September 2019 |
|||
> 24 September 1803 > 1 Vendemiaire 12 > 22 September 2020 > 1 Vendemiaire 229 |
|||
1 Vendemiaire 12 24 September 1803 1 Vendemiaire 229 22 September 2020 |
|||
> 23 September 1804 > 1 Vendemiaire 13 |
|||
1 Vendemiaire 13 23 September 1804 |
|||
> 23 September 1805 > 1 Vendemiaire 14 |
|||
1 Vendemiaire 14 23 September 1805</pre> |
|||
=={{header|Go}}== |
=={{header|Go}}== |