French Republican calendar: Difference between revisions

Content deleted Content added
PureFox (talk | contribs)
It's time this became a 'full' task.
PSNOW123 (talk | contribs)
New post.
 
(10 intermediate revisions by 7 users not shown)
Line 21:
=={{header|BBC BASIC}}==
Computes leap years using the "continuous" method: a year in the Republican calendar is a leap year if and only if the number of the <i>following</i> year is divisible by 4 but not by 100 unless also by 400. No attempt is made to deal with ill-formed or invalid input dates.
<langsyntaxhighlight lang="bbcbasic">REM >frrepcal
:
DIM gregorian$(11)
Line 157:
:
DEF FN_gre_leap(year%)
= (year% MOD 4 = 0 AND (year% MOD 100 <> 0 OR year% MOD 400 = 0))</langsyntaxhighlight>
<b>Output for the test dates:</b>
<pre>*** French Republican ***
Line 195:
> 19 September 2016
Fete du travail 224</pre>
 
=={{header|C++}}==
<syntaxhighlight lang="c++">
#include <algorithm>
#include <chrono>
#include <cstdint>
#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>
#include <vector>
 
const std::vector<std::string> MONTHS = {
"Vendemiaire", "Brumaire", "Frimaire", "Nivose", "Pluviose", "Ventose", "Germinal",
"Floreal", "Prairial", "Messidor", "Thermidor", "Fructidor", "Sansculottide" };
 
const std::vector<std::string> SANSCULOTTIDES = {
"Fete de la vertu", "Fete du genie", "Fete du travail",
"Fete de l'opinion", "Fete des recompenses", "Fete de la Revolution" };
 
const std::vector<std::string> GREGORIAN_MONTHS = {
"January", "February", "March", "April", "May", "June", "July", "August",
"September", "October", "November", "December" };
 
const std::chrono::year_month_day INTRODUCTION_DATE =
{ std::chrono::year{1792}, std::chrono::month{9}, std::chrono::day{22} };
 
const std::chrono::year_month_day TERMINATION_DATE =
{ std::chrono::year{1805}, std::chrono::month{12}, std::chrono::day{31} };
 
struct French_RC_Date {
uint32_t year, month, day;
};
 
std::vector<std::string> split_string(const std::string& text, const char& delimiter) {
std::vector<std::string> words;
std::istringstream stream(text);
std::string word;
while ( std::getline(stream, word, delimiter) ) {
words.emplace_back(word);
}
return words;
}
 
uint32_t index_of(const std::vector<std::string>& vec, const std::string& element) {
auto iter = std::find(vec.begin(), vec.end(), element);
return std::distance(vec.begin(), iter);
}
 
uint32_t additional_days_for_year(const uint32_t& year) {
return ( year > 11 ) ? 3 : ( year > 7 ) ? 2 : ( year > 3 ) ? 1 : 0;
}
 
std::string to_french_rc_date_string(French_RC_Date french_rc_date) {
if ( french_rc_date.month < 13 ) {
return std::to_string(french_rc_date.day) + " " + MONTHS[french_rc_date.month - 1]
+ " " + std::to_string(french_rc_date.year);
}
return SANSCULOTTIDES[french_rc_date.day - 1] + " " + std::to_string(french_rc_date.year);
}
 
std::string to_gregorian_date_string(std::chrono::year_month_day gregorian_date) {
const uint32_t year = static_cast<int>(gregorian_date.year());
const uint32_t month = static_cast<unsigned int>(gregorian_date.month());
const uint32_t day = static_cast<unsigned int>(gregorian_date.day());
const std::string month_string = GREGORIAN_MONTHS[month - 1];
return std::to_string(day) + " " + month_string + " " + std::to_string(year);
}
 
std::chrono::year_month_day parse_gregorian_date(const std::string& gregorian_string) {
std::vector<std::string> splits = split_string(gregorian_string, ' ');
const uint32_t month = index_of(GREGORIAN_MONTHS, splits[1]) + 1;
return std::chrono::year_month_day{std::chrono::year{std::stoi(splits[2])},
std::chrono::month{month}, std::chrono::day{static_cast<unsigned int>(std::stoi(splits[0]))}};
}
 
French_RC_Date parse_french_rc_date(const std::string& french_rc_date) {
std::vector<std::string> splits = split_string(french_rc_date, ' ');
if ( splits.size() == 3 ) {
const uint32_t year = std::stoi(splits[2]);
const uint32_t month = index_of(MONTHS, splits[1]) + 1;
const uint32_t day = std::stoi(splits[0]);
return French_RC_Date(year, month, day);
}
 
std::string year_string = splits[splits.size() - 1];
const uint32_t year = std::stoi(year_string);
std::string sansculottides_day = french_rc_date.substr(0, french_rc_date.size() - year_string.size() - 1);
const uint32_t day = index_of(SANSCULOTTIDES, sansculottides_day) + 1;
return French_RC_Date(year, 13, day);
}
 
French_RC_Date to_french_rc_date(const std::chrono::year_month_day& gregorian_date) {
const int32_t days_before =
( std::chrono::sys_days(TERMINATION_DATE) - std::chrono::sys_days(gregorian_date) ).count();
const int32_t days_after =
( std::chrono::sys_days(gregorian_date) - std::chrono::sys_days(INTRODUCTION_DATE) ).count();
if ( days_after < 0 || days_before < 0 ) {
throw std::invalid_argument("French Republican Calendar date out of range.");
}
 
uint32_t year = ( days_after + 366 ) / 365;
uint32_t days = ( days_after + 366 ) % 365 - additional_days_for_year(year);
if ( days == 0 ) {
year -= 1;
days += 366;
}
 
if ( days < 361 ) {
return French_RC_Date(year, days / 30 + 1, days % 30);
}
return French_RC_Date(year, 13, days - 360);
}
 
std::chrono::year_month_day to_gregorian_date(French_RC_Date french_rc_date) {
const uint32_t days = ( french_rc_date.year - 1 ) * 365 + additional_days_for_year(french_rc_date.year)
+ ( french_rc_date.month - 1 ) * 30 + french_rc_date.day - 1;
return std::chrono::sys_days(INTRODUCTION_DATE) + std::chrono::days(days);
}
 
int main() {
std::vector<std::string> gregorian_strings = {
"22 September 1792", "20 May 1795", "15 July 1799", "23 September 1803", "31 December 1805" };
 
std::vector<std::string> french_rc_strings = { };
for ( const std::string& gregorian_string : gregorian_strings ) {
std::chrono::year_month_day gregorian_date = parse_gregorian_date(gregorian_string);
French_RC_Date french_rc_date = to_french_rc_date(gregorian_date);
const std::string french_rc_date_string = to_french_rc_date_string(french_rc_date);
french_rc_strings.emplace_back(french_rc_date_string);
std::cout << gregorian_string << " => " << french_rc_date_string << "\n";
}
std::cout << "\n";
 
for ( const std::string& french_rc_string : french_rc_strings ) {
French_RC_Date french_rc_date = parse_french_rc_date(french_rc_string);
std::chrono::year_month_day gregorian_date = to_gregorian_date(french_rc_date);
const std::string gregorian_date_string = to_gregorian_date_string(gregorian_date);
std::cout << french_rc_string << " => " << gregorian_date_string << "\n";
}
}
</syntaxhighlight>
{{ out }}
<pre>
22 September 1792 => 1 Vendemiaire 1
20 May 1795 => 1 Prairial 3
15 July 1799 => 27 Messidor 7
23 September 1803 => Fete de la Revolution 11
31 December 1805 => 10 Nivose 14
 
1 Vendemiaire 1 => 22 September 1792
1 Prairial 3 => 20 May 1795
27 Messidor 7 => 15 July 1799
Fete de la Revolution 11 => 23 September 1803
10 Nivose 14 => 31 December 1805
</pre>
 
=={{header|FreeBASIC}}==
{{trans|BBC BASIC}}
Computes leap years using the "continuous" method: a year in the Republican calendar is a leap year if and only if the number of the <i>following</i> year is divisible by 4 but not by 100 unless also by 400. No attempt is made to deal with ill-formed or invalid input dates.
<langsyntaxhighlight lang="freebasic">' version 18 Pluviose 227
' compile with: fbc -s console
' retained the original comments for then BBC BASIC entry
Line 385 ⟶ 541:
Loop Until src = ""
 
End</langsyntaxhighlight>
{{out}}
<pre>> 1 Vendemiaire 1 > 22 September 1792 > 1 Vendemiaire 1 > 23 September 1806 > 1 Vendemiaire 15
Line 416 ⟶ 572:
1 Vendemiaire 14 23 September 1805</pre>
 
=={{header|F_Sharp|F#}}==
<syntaxhighlight lang="fsharp">
// French Republican Calander: Nigel Galloway. April 16th., 2021
let firstDay=System.DateTime.Parse("22/9/1792")
type monthsFRC= Vendemiaire = 0
|Brumaire = 30
|Frimaire = 60
|Nivose = 90
|Pluviose = 120
|Ventose = 150
|Germinal = 180
|Floral = 210
|Prairial = 240
|Messidor = 270
|Thermidor = 300
|Fructidor = 330
|Virtue = 360
|Talent = 361
|Labour = 362
|Opinion = 363
|Honours = 364
|Revolution = 365
type months= January = 1
|February = 2
|March = 3
|April = 4
|May = 5
|June = 6
|July = 7
|August = 8
|September = 9
|October = 10
|November = 11
|December = 12
let frc2Greg n (g:monthsFRC) l=firstDay+System.TimeSpan.FromDays(float((l-1)*365+l/4+(int g)+n-1))
let rec fG n g=let i=match g with 3 |7 |11->366 |_->365 in if n<i then (n,g) else fG(n-i)(g+1)
let Greg2FRC n=let n,g=fG((n-firstDay).Days) 1
match n/30,n%30 with (12,n)->(1,enum<monthsFRC>(360+n),g) |(n,l)->(l+1,enum<monthsFRC>(n*30),g)
let n=(frc2Greg 1 monthsFRC.Vendemiaire 1) in printfn "%d %s %d -> %d %A %d" 1 "Vendemiaire" 1 n.Day (enum<months> n.Month) n.Year
let n=(frc2Greg 27 monthsFRC.Messidor 7) in printfn "%d %s %d -> %d %A %d" 27 "Messidor" 7 n.Day (enum<months> n.Month) n.Year
let n=(frc2Greg 1 monthsFRC.Revolution 11) in printfn "%d %s %d -> %d %A %d" 1 "Revolution" 11 n.Day (enum<months> n.Month) n.Year
let n=(frc2Greg 10 monthsFRC.Nivose 14) in printfn "%d %s %d -> %d %A %d" 10 "Nivose" 14 n.Day (enum<months> n.Month) n.Year
let n,g,l=Greg2FRC(System.DateTime(1792,9,22)) in printfn "%d %s %d -> %d %A %d" 22 "September" 1792 n g l
let n,g,l=Greg2FRC(System.DateTime(1799,7,15)) in printfn "%d %s %d -> %d %A %d" 15 "July" 1799 n g l
let n,g,l=Greg2FRC(System.DateTime(1803,9,23)) in printfn "%d %s %d -> %d %A %d" 23 "September" 1803 n g l
let n,g,l=Greg2FRC(System.DateTime(1805,12,31)) in printfn "%d %s %d -> %d %A %d" 31 "December" 1805 n g l
</syntaxhighlight>
{{out}}
<pre>
1 Vendemiaire 1 -> 22 September 1792
27 Messidor 7 -> 15 July 1799
1 Revolution 11 -> 23 September 1803
10 Nivose 14 -> 31 December 1805
22 September 1792 -> 1 Vendemiaire 1
15 July 1799 -> 27 Messidor 7
23 September 1803 -> 1 Revolution 11
31 December 1805 -> 10 Nivose 14
</pre>
=={{header|Go}}==
{{trans|BBC Basic}}
A rather literal port, just for reference. Far from idiomatic Go.
<langsyntaxhighlight lang="go">package main
 
import (
Line 581 ⟶ 795:
func greLeap(year int) bool {
return year%4 == 0 && (year%100 != 0 || year%400 == 0)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 620 ⟶ 834:
 
A start anyway. Computations extracted to a package, a type defined for French Republican Dates, time package from standard library used. Ignores invalid input rather than panicking.
<langsyntaxhighlight lang="go">package frc
 
import (
Line 777 ⟶ 991:
func greLeap(year int) bool {
return year%4 == 0 && (year%100 != 0 || year%400 == 0)
}</langsyntaxhighlight>
<langsyntaxhighlight lang="go">package main
 
import (
Line 816 ⟶ 1,030:
}
}
}</langsyntaxhighlight>
 
=={{header|Java}}==
<syntaxhighlight lang="java">
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
 
public final class FrenchRepublicanCalendar {
 
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d MMMM yyyy");
List<String> gregorianStrings = List.of(
"22 September 1792", "20 May 1795", "15 July 1799", "23 September 1803", "31 December 1805" );
List<String> frenchRCStrings = new ArrayList<String>();
for ( String gregorianString : gregorianStrings ) {
LocalDate gregorianDate = LocalDate.parse(gregorianString, formatter);
FrenchRCDate frenchRCDate = FrenchRCDate.toFrenchRCDate(gregorianDate);
frenchRCStrings.addLast(frenchRCDate.toString());
System.out.println(gregorianString + " => " + frenchRCDate);
}
System.out.println();
for ( String frenchRCString : frenchRCStrings ) {
FrenchRCDate frenchRCDate = FrenchRCDate.parse(frenchRCString);
String gregorianDate = formatter.format(frenchRCDate.toGregorianDate());
System.out.println(frenchRCString + " => " + gregorianDate);
}
}
}
 
final class FrenchRCDate {
public FrenchRCDate(int aYear, int aMonth, int aDay) {
year = aYear; month = aMonth; day = aDay;
}
 
public LocalDate toGregorianDate() {
final int days = ( year - 1 ) * 365 + additionalDaysForYear(year) + ( month - 1 ) * 30 + day - 1;
return INTRODUCTION_DATE.plusDays(days);
}
public String toString() {
if ( month < 13 ) {
return day + " " + MONTHS.get(month - 1) + " " + year;
}
return SANSCULOTTIDES.get(day - 1) + " " + year;
}
public static FrenchRCDate toFrenchRCDate(LocalDate gregorianDate) {
final int daysBefore = (int) ChronoUnit.DAYS.between(gregorianDate, TERMINATION_DATE);
final int daysAfter = (int) ChronoUnit.DAYS.between(INTRODUCTION_DATE, gregorianDate);
if ( daysAfter < 0 || daysBefore < 0 ) {
throw new IllegalArgumentException("French Republican Calendar date out of range.");
}
int year = ( daysAfter + 366 ) / 365;
int days = ( daysAfter + 366 ) % 365 - additionalDaysForYear(year);
if ( days < 1 ) {
year -= 1;
days += 366;
}
if ( days < 361 ) {
return new FrenchRCDate(year, days / 30 + 1, days % 30);
}
return new FrenchRCDate(year, 13, days - 360);
}
public static FrenchRCDate parse(String frenchRCDate) {
String[] splits = frenchRCDate.split(" ");
if ( splits.length == 3 ) {
final int year = Integer.valueOf(splits[2]);
final int month = MONTHS.indexOf(splits[1]) + 1;
final int day = Integer.valueOf(splits[0]);
return new FrenchRCDate(year, month, day);
}
String yearString = splits[splits.length - 1];
final int year = Integer.valueOf(yearString);
String sansculottidesDay = frenchRCDate.substring(0, frenchRCDate.lastIndexOf(" "));
final int day = SANSCULOTTIDES.indexOf(sansculottidesDay) + 1;
return new FrenchRCDate(year, 13, day);
}
 
public static int additionalDaysForYear(int year) {
return ( year > 11 ) ? 3 : ( year > 7 ) ? 2 : ( year > 3 ) ? 1 : 0;
}
public static final LocalDate INTRODUCTION_DATE = LocalDate.of(1792, 9, 22);
public static final LocalDate TERMINATION_DATE = LocalDate.of(1805, 12, 31);
private int year, month, day;
 
private static final List<String> MONTHS = List.of(
"Vendémiaire", "Brumaire", "Frimaire", "Nivôse", "Pluviôse", "Ventôse", "Germinal",
"Floréal", "Prairial", "Messidor", "Thermidor", "Fructidor", "Sansculottide"
);
private static final List<String> SANSCULOTTIDES = List.of(
"Fête de la vertu", "Fête du génie", "Fête du travail",
"Fête de l'opinion", "Fête des récompenses", "Fête de la Révolution"
);
}
</syntaxhighlight>
{{ out }}
<pre>
22 September 1792 => 1 Vendémiaire 1
20 May 1795 => 1 Prairial 3
15 July 1799 => 27 Messidor 7
23 September 1803 => Fête de la Révolution 11
31 December 1805 => 10 Nivôse 14
 
1 Vendémiaire 1 => 22 September 1792
1 Prairial 3 => 20 May 1795
27 Messidor 7 => 15 July 1799
Fête de la Révolution 11 => 23 September 1803
10 Nivôse 14 => 31 December 1805
</pre>
 
=={{header|jq}}==
'''Adapted from [[#Wren|Wren]]'''
 
'''Works with jq, the C implementation of jq'''
 
'''Works with gojq, the Go implementation of jq'''
 
This entry uses the [[:Category:Jq/Date.jq | "Date" module]].
 
Note that `assertEq/2` as defined below is used to check that the Gregorian dates survive the round-trip via
conversion to French Republican Calendar dates.
<syntaxhighlight lang="jq">
include "Date" {search: "."};
 
### Generic functions
 
def assertEq($p;$q):
if $p == $q
then .
else debug("assertion violation: \($p) != \($q)") as $debug | .
end;
 
def lpad($len): tostring | ($len - length) as $l | (" " * $l) + .;
 
def trim: sub("^ *";"") | sub(" *$";"");
 
# Input: string such as "12 Mar 2012"
# Output: Date
def parseDayMonthYear:
def months:
{Jan:1, Feb:2, Mar:3, Apr: 4, May: 5, Jun: 6,
Jul:7, Aug:8, Sep:9, Oct:10, Nov:11, Dec:12};
capture("(?<day>[0-9]+) *(?<month>[A-Za-z]+) *(?<year>[0-9]+)")
| .month |= months[ .[:3] ]
| map_values(tonumber)
| {year, month, day};
 
### French Republican Calendar (FRC)
 
def introductionDate: Date(1792; 9; 22);
 
# Use the 'continuous method' for years after 1805
def isLeapYearFRC:
(. + 1)
| (. % 4 == 0) and ((. % 100 != 0) or (. % 400 == 0));
 
# If the numbers $year, $month, and $day specify a valid date
# in the French Republican Calendar, then emit {$year, $month, $day};
# otherwise generate an informative error message.
def FrenchRCDate($year; $month; $day):
def err(msg): "Invalid date (\(msg)): FrenchRCDate(\($year); \($month); \($day))" | error;
if ($year <= 0 or $month < 1 or $month > 13) then err(if $year <= 0 then "year" else "month" end) end
| if $month < 13
then if $day < 1 or $day > 30 then err("day") end
else ($year | isLeapYearFRC) as $leap
| if $leap and ($day < 1 or $day > 6) then err("invalid day in leap year") end
| if ($leap|not) and ($day < 1 or $day > 5) then err("invalid day in non-leap year") end
end
| {$year, $month, $day};
 
# for convenience we treat 'Sansculottide' as an extra month with 5 or 6 days
def months:
["Vendémiaire", "Brumaire", "Frimaire", "Nivôse", "Pluviôse", "Ventôse", "Germinal",
"Floréal", "Prairial", "Messidor", "Thermidor", "Fructidor", "Sansculottide"] ;
 
def intercal:
["Fête de la vertu", "Fête du génie", "Fête du travail",
"Fête de l'opinion", "Fête des récompenses", "Fête de la Révolution"];
 
# Input: a string specifying a FRC date
def parse:
. as $frcDate
| (trim|split(" ")) as $splits
| if $splits|length == 3
then (months | index($splits[1]) + 1) as $month
| if $month < 1 or $month > 13 then "Invalid month." | error end
| ($splits[2]|tonumber) as $year
| if $year < 1 then "Invalid year." | error end
| (if ($month < 13) then 30 elif $year|isLeapYearFRC then 6 else 5 end) as $monthLength
| ($splits[0] | tonumber) as $day
| if $day < 1 or $day > $monthLength then "Invalid day." | error end
| FrenchRCDate($year; $month; $day)
elif ($splits|length | IN(4,5))
then $splits[-1] as $yearStr
| ($yearStr|tonumber) as $year
| if $year < 1 then "Invalid year." | error end
| ($frcDate | trim[0: -($yearStr|length + 1)] ) as $scDay
| (intercal | index($scDay) + 1) as $day
| (if $year | isLeapYearFRC then 6 else 5 end) as $maxDay
| if $day < 1 or $day > $maxDay then "Invalid day." | error end
| FrenchRCDate($year; 13; $day)
else "Invalid French Republican date." | error
end
;
 
# Input: Date (Gregorian)
# Output:
def fromLocalDate:
# $start and $finish should be two Date objects
def daysFrom($start; $finish):
($finish|daysBeforeDate) - ($start|daysBeforeDate);
 
(daysFrom(introductionDate; .) + 1) as $daysDiff
| if ($daysDiff <= 0) then "Date can't be before 22 September 1792." | error end
| {year: 1, startDay: 1}
| until(.done;
(.startDay + (if .year|isLeapYearFRC then 365 else 364 end)) as $endDay
| if ($daysDiff >= .startDay and $daysDiff <= $endDay) then .done = true
else .year += 1
| .startDay = $endDay + 1
end )
| ($daysDiff - .startDay) as $remDays
| (($remDays / 30)|floor) as $month
| ($remDays - $month * 30) as $day
| FrenchRCDate(.year; $month + 1; $day + 1)
;
 
# Input: an FRC Date
def toString:
if .month < 13 then "\(.day) \(months[.month - 1]) \(.year)"
else "\(intercal[.day - 1]) \(.year)"
end;
 
# Input: an FRC Date
def toLocalDate:
(reduce range(1; .year) as $i (0; . + (if $i|isLeapYearFRC then 366 else 365 end))) as $sumDays
| ((.month - 1) * 30 + .day - 1) as $dayInYear
| introductionDate | addDays($sumDays + $dayInYear) ;
 
 
### Examples
 
def dates: [
"22 September 1792", "20 May 1795", "15 July 1799", "23 September 1803",
"31 December 1805", "18 March 1871", "25 August 1944", "19 September 2016",
"22 September 2017", "28 September 2017"
];
 
def task:
def format:
"\(.day) \(monthNames[.month]) \(.year)";
 
dates as $dates
| reduce range(0; $dates|length) as $i ({};
.date = $dates[$i]
| .thisDate = (.date|parseDayMonthYear)
| .frcd = (.thisDate|fromLocalDate)
| .frcDates[$i] = (.frcd|toString)
| .emit += "\(.date|lpad(26)) => \(.frcDates[$i])\n")
| .emit,
# now process the other way around
range(0; $dates|length) as $i
| .frcDates[$i] as $frcDate
| ($frcDate|parse|toLocalDate|format) as $lds
| assertEq($dates[$i]; $lds)
| "\($frcDate|lpad(26)) => \($lds)"
;
 
task
</syntaxhighlight>
{{output}}
<pre>
22 September 1792 => 1 Vendémiaire 1
20 May 1795 => 1 Prairial 3
15 July 1799 => 27 Messidor 7
23 September 1803 => Fête de la Révolution 11
31 December 1805 => 10 Nivôse 14
18 March 1871 => 27 Ventôse 79
25 August 1944 => 7 Fructidor 152
19 September 2016 => Fête du travail 224
22 September 2017 => 1 Vendémiaire 226
28 September 2017 => 7 Vendémiaire 226
 
1 Vendémiaire 1 => 22 September 1792
1 Prairial 3 => 20 May 1795
27 Messidor 7 => 15 July 1799
Fête de la Révolution 11 => 23 September 1803
10 Nivôse 14 => 31 December 1805
27 Ventôse 79 => 18 March 1871
7 Fructidor 152 => 25 August 1944
Fête du travail 224 => 19 September 2016
1 Vendémiaire 226 => 22 September 2017
7 Vendémiaire 226 => 28 September 2017
</pre>
 
 
=={{header|Julia}}==
To stay within historical dates, will throw a domain error if the French Republican date is outside the interval the calendar was actually used.
<langsyntaxhighlight lang="julia">using Dates
 
const GC_FORMAT = DateFormat("d U y")
Line 904 ⟶ 1,430:
 
testrepublicancalendar()
</langsyntaxhighlight>{{out}}
<pre>
French Republican to Gregorian
Line 921 ⟶ 1,447:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.4-3
 
import java.time.format.DateTimeFormatter
Line 1,034 ⟶ 1,560:
println("${frcDate.padEnd(25)} => $lds")
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,060 ⟶ 1,586:
7 Vendémiaire 226 => 28 September 2017
</pre>
 
=={{header|Nim}}==
As was done in Julia version, we have limited the date range to historical dates only.
<syntaxhighlight lang="nim">
import strformat, strscans, strutils, times
 
const
 
RcMonths = ["Vendémiaire", "Brumaire", "Frimaire", "Nivôse", "Pluviôse", "Ventôse",
"Germinal", "Floréal", "Prairial", "Messidor", "Thermidor", "Fructidor"]
 
SansCulottides = ["Fête de la vertu", "Fête du génie", "Fête du travail",
"Fête de l’opinion", "Fête des récompenses", "Fête de la Révolution"]
 
let
# First and last dates of republican calendar expressed in gregorian calendar.
FirstRcDate = initDateTime(22, mSep, 1792, 0, 0, 0)
LastRcDate = initDateTime(31, mDec, 1805, 0, 0, 0)
 
type
# French republican date representation.
RcDayRange = 1..30
RcMonthRange = 1..13
RcYearRange = 1..14
RepublicanDate = tuple[year: RcYearRange, month: RcMonthRange, day: RcDayRange]
 
# Last dates of republican calendar expressed in republican calendar.
const RcLastDate: RepublicanDate = (RcYearRange(14), RcMonthRange(4), RcDayRange(10))
 
 
proc notnum(input: string; str: var string; start: int): int =
# Parsing procedure to extract non numerical part of a date.
var i = start
while i <= input.high:
if input[i] in '0'..'9': break
str.add input[i]
inc i
if str.len == 0 or str[^1] != ' ': return -1 # Not terminated by a space.
str.setLen(str.len - 1) # Back before the space.
result = str.len
 
 
proc parseRepublicanDate(rdate: string): RepublicanDate =
## Parse a French republican date and return its representation.
 
let date = rdate.strip()
var day, month, year: int
var monthString, dayString: string
 
if date.scanf("$i $+ $i", day, monthString, year):
# Normal day.
if day notin 1..30:
raise newException(ValueError, "wrong day number: $1.".format(day))
month = RcMonths.find(monthString) + 1
if month == 0:
raise newException(ValueError, "unknown French republican month: $1." % monthString)
 
elif date.scanf("${notnum} $i", dayString, year):
# Sans-culottide day (also known as “jour complémentaire”).
month = 13 # Value used for sans-culottide days.
day = SansCulottides.find(dayString) + 1
if day == 0:
raise newException(ValueError, "wrong “sans-culottide” day: « $1 »." % dayString)
if day == 6 and year mod 4 != 3:
raise newException(ValueError, "republican year $1 is not a leap year".format(year))
 
else:
raise newException(ValueError, "invalid French republican date: « $1 »." % date)
 
result = (RcYearRange(year), RcMonthRange(month), RcDayRange(day))
if result > RcLastDate:
raise newException(ValueError, "republican date out of range: « $1 »." % date)
 
 
proc `$`(date: RepublicanDate): string =
## Return the string representation of a French republican date.
 
if date.month != 13:
# Normal day.
result = "$1 $2 $3".format(date.day, RcMonths[date.month - 1], date.year)
else:
# Supplementary day.
result = "$1 $2".format(SansCulottides[date.day - 1], date.year)
 
 
proc toGregorian(rdate: RepublicanDate): DateTime =
## Convert a republican date tuple to a gregorian date (DateTime object).
let day = (rdate.day - 1) + (rdate.month - 1) * 30 + (rdate.year - 1) * 365 + rdate.year div 4
result = FirstRcDate + initTimeInterval(days = day)
 
 
proc toGregorian(rdate: string): string =
## Convert a republican date string to a gregorian date string.
let date = rdate.parseRepublicanDate()
result = date.toGregorian().format("dd MMMM yyyy")
 
 
proc toRepublican(gdate: DateTime): RepublicanDate =
## Convert a gregorian date (DateTime object) to a republican date tuple.
 
if gdate notin FirstRcDate..LastRcDate:
raise newException(ValueError, "impossible conversion to republican date.")
let d = gdate - FirstRcDate
 
# Add a dummy year before year 1 in order to use a four years period.
let dayNumber = d.inDays + 365
let periodNum = dayNumber div 1461
let dayInPeriod = dayNumber mod 1461
 
# Compute year and day in year.
let yearInPeriod = min(dayInPeriod div 365, 3)
result.year = periodNum * 4 + yearInPeriod
let dayInYear = dayInPeriod - yearInPeriod * 365
 
# Compute month and day.
result.month = dayInYear div 30 + 1
result.day = dayInYear mod 30 + 1
 
 
proc toRepublican(gdate: string): string =
## Convert a gregorian date string to a republican date string.
let date = gdate.parse("d MMMM yyyy")
result = $(date.toRepublican())
 
 
when isMainModule:
 
const
RepublicanDates = ["1 Vendémiaire 1", "1 Prairial 3", "27 Messidor 7",
"Fête de la Révolution 11", "10 Nivôse 14"]
GregorianDates = ["22 September 1792", "20 May 1795", "15 July 1799",
"23 September 1803", "31 December 1805"]
 
echo "From French republican dates to gregorian dates:"
for rdate in RepublicanDates:
echo &"{rdate:>24} → {rdate.toGregorian()}"
echo()
 
echo "From gregorian dates to French republican dates:"
for gdate in GregorianDates:
echo &"{gdate:>24} → {gdate.toRepublican()}"</syntaxhighlight>
 
{{out}}
<pre>From French republican dates to gregorian dates:
1 Vendémiaire 1 → 22 September 1792
1 Prairial 3 → 20 May 1795
27 Messidor 7 → 15 July 1799
Fête de la Révolution 11 → 23 September 1803
10 Nivôse 14 → 31 December 1805
 
From gregorian dates to French republican dates:
22 September 1792 → 1 Vendémiaire 1
20 May 1795 → 1 Prairial 3
15 July 1799 → 27 Messidor 7
23 September 1803 → Fête de la Révolution 11
31 December 1805 → 10 Nivôse 14</pre>
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">use feature 'state';
use DateTime;
my @month_names = qw{
Line 1,186 ⟶ 1,868:
2016-09-22 1 Vendémiaire 225
2017-09-22 1 Vendémiaire 226
</syntaxhighlight>
</lang>
{{Out}}
<pre>All tests successful.</pre>
 
=={{header|Phix}}==
<lang Phix>constant gregorians = {"January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"},
gregorian = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
republicans = {"Vendémiaire", "Brumaire", "Frimaire", "Nivôse", "Pluviôse",
"Ventôse", "Germinal", "Floréal", "Prairial", "Messidor",
"Thermidor", "Fructidor"},
sansculottides = {"Fête de la vertu", "Fête du génie", "Fête du travail",
"Fête de l'opinion", "Fête des récompenses",
"Fête de la Révolution"}
function rep_leap(integer year)
return mod(year+1,4)==0 and (mod(year+1,100)!=0 or mod(year+1,400)==0)
end function
 
function rep_to_day(sequence dmy)
integer {d, m, y} = dmy
if m == 13 then
m -= 1
d += 30
end if
if rep_leap(y) then
d -= 1
end if
integer res = 365*(y-1) + floor((y+1)/4) - floor((y+1)/100) + floor((y+1)/400) + 30*(m-1) + d
return res
end function
 
function gre_leap(integer year)
return mod(year,4)==0 and (mod(year,100)!=0 or mod(year,400)==0)
end function
 
function gre_to_day(sequence dmy)
integer {d, m, y} = dmy
if m < 3 then
y -= 1
m += 12
end if
integer res = floor(y*365.25) - floor(y/100) + floor(y/400)
+ floor(30.6*(m+1)) + d - 654842
return res
end function
 
function day_to_rep(integer day)
integer y = floor((day-1)/365.25)
if not rep_leap(y) then
y += 1
end if
integer d = day - floor(y*365.25) + 365 + floor(y/100) - floor(y/400),
m = 1,
sansculottide = 5+rep_leap(y)
while d>30 do
d -= 30
m += 1
if m == 13 then
if d > sansculottide then
d -= sansculottide
m = 1
y += 1
sansculottide = 5 + rep_leap(y)
end if
end if
end while
return {d,m,y}
end function
 
function day_to_gre(integer day)
integer y = floor(day/365.25),
d = day - floor(y*365.25) + 21,
m = 9
y += 1792
d += floor(y/100) - floor(y/400) - 13
sequence gregoriam = gregorian -- (modifiable copy)
while d>gregoriam[m] do
d -= gregoriam[m]
m += 1
if m == 13 then
m = 1
y += 1
gregoriam[2] = 28 + gre_leap(y)
end if
end while
return {d,m,y}
end function
 
function greg_to_frep(string greg)
{{integer day, string months, integer year}} = scanf(greg,"%d %s %d")
integer month = find(months,gregorians)
{day,month,year} = day_to_rep(gre_to_day({day,month,year}))
string frep = iff(month=13?sprintf("%s %d",{sansculottides[day], year})
:sprintf("%d %s %d",{day, republicans[month], year}))
return frep
end function
 
function frep_to_greg(string frep)
integer day, month, year
if frep[1]<='9' then
{{day, string months, year}} = scanf(frep,"%d %s %d")
month = find(months,republicans)
else
{{string days, year}} = scanf(frep,"%s %d")
day = find(days,sansculottides)
month = 13
end if
{day,month,year} = day_to_gre(rep_to_day({day, month, year}))
string greg = sprintf("%02d %s %d",{day, gregorians[month], year})
return greg
end function
 
constant test_data = {
{ "22 September 1792", "1 Vendémiaire 1" },
{ "20 May 1795", "1 Prairial 3" },
{ "15 July 1799", "27 Messidor 7" },
{ "23 September 1803", "Fête de la Révolution 11" },
{ "31 December 1805", "10 Nivôse 14" },
{ "18 March 1871", "27 Ventôse 79" },
{ "25 August 1944", "7 Fructidor 152" },
{ "19 September 2016", "Fête du travail 224" },
 
{ "06 May 1871", "16 Floréal 79" }, -- Paris Commune begins
{ "23 May 1871", "3 Prairial 79" }, -- Paris Commune ends
{ "09 November 1799", "18 Brumaire 8" }, -- Revolution ends by Napoléon coup
{ "02 December 1804", "11 Frimaire 13" }, -- Republic ends by Napoléon coronation
{ "30 October 1794", "9 Brumaire 3" }, -- École Normale Supérieure established
{ "27 July 1794", "9 Thermidor 2" }, -- Robespierre falls
{ "27 May 1799", "8 Prairial 7" }, -- Fromental Halévy born
{ "22 September 1792", "1 Vendémiaire 1" },
{ "22 September 1793", "1 Vendémiaire 2" },
{ "22 September 1794", "1 Vendémiaire 3" },
{ "23 September 1795", "1 Vendémiaire 4" },
{ "22 September 1796", "1 Vendémiaire 5" },
{ "22 September 1797", "1 Vendémiaire 6" },
{ "22 September 1798", "1 Vendémiaire 7" },
{ "23 September 1799", "1 Vendémiaire 8" },
{ "23 September 1800", "1 Vendémiaire 9" },
{ "23 September 1801", "1 Vendémiaire 10" },
{ "23 September 1802", "1 Vendémiaire 11" },
{ "24 September 1803", "1 Vendémiaire 12" },
{ "23 September 1804", "1 Vendémiaire 13" },
{ "23 September 1805", "1 Vendémiaire 14" },
{ "23 September 1806", "1 Vendémiaire 15" },
{ "24 September 1807", "1 Vendémiaire 16" },
{ "23 September 1808", "1 Vendémiaire 17" },
{ "23 September 1809", "1 Vendémiaire 18" },
{ "23 September 1810", "1 Vendémiaire 19" },
{ "24 September 1811", "1 Vendémiaire 20" },
{ "23 September 2015", "1 Vendémiaire 224" },
{ "21 September 2016", "Fête des récompenses 224" },
{ "22 September 2016", "1 Vendémiaire 225" },
{ "23 September 2016", "2 Vendémiaire 225" },
{ "22 September 2017", "1 Vendémiaire 226" },
{ "28 September 2017", "7 Vendémiaire 226" } }
 
for i=1 to length(test_data) do
string {greg, frep} = test_data[i],
frep2 = greg_to_frep(greg),
greg2 = frep_to_greg(frep),
ok = iff(frep=frep2 and greg=greg2?"ok":"**** ERROR ****")
if platform()=WINDOWS then
-- the windows console does not handle
-- non-basic-latin-ascii characters well...
frep = substitute_all(frep,"éêéô","eeeo")
end if
printf(1,"%18s <==> %-25s %s\n",{greg,frep,ok})
end for
 
<!--<syntaxhighlight lang="phix">(phixonline)-->
--sanity test:
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
for i=1 to 150000 do -- (years 1792..~2203)
<span style="color: #008080;">constant</span> <span style="color: #000000;">gregorians</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"January"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"February"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"March"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"April"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"May"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"June"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"July"</span><span style="color: #0000FF;">,</span>
if rep_to_day(day_to_rep(i))!=i then ?9/0 end if
<span style="color: #008000;">"August"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"September"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"October"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"November"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"December"</span><span style="color: #0000FF;">},</span>
if gre_to_day(day_to_gre(i))!=i then ?9/0 end if
<span style="color: #000000;">gregorian</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">31</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">28</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">31</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">30</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">31</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">30</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">31</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">31</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">30</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">31</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">30</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">31</span><span style="color: #0000FF;">},</span>
end for</lang>
<span style="color: #000000;">republicans</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Vendémiaire"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Brumaire"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Frimaire"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Nivôse"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Pluviôse"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Ventôse"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Germinal"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Floréal"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Prairial"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Messidor"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Thermidor"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Fructidor"</span><span style="color: #0000FF;">},</span>
<span style="color: #000000;">sansculottides</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Fête de la vertu"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Fête du génie"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Fête du travail"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Fête de l'opinion"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Fête des récompenses"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"Fête de la Révolution"</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">rep_leap</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">year</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">year</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)==</span><span style="color: #000000;">0</span> <span style="color: #008080;">and</span> <span style="color: #0000FF;">(</span><span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">year</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">100</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">year</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">400</span><span style="color: #0000FF;">)==</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">rep_to_day</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">dmy</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dmy</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">m</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">13</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">m</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">d</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">30</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">rep_leap</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">d</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">365</span><span style="color: #0000FF;">*(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">y</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">-</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">y</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">100</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">y</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">400</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">30</span><span style="color: #0000FF;">*(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">d</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">gre_leap</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">year</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">year</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)==</span><span style="color: #000000;">0</span> <span style="color: #008080;">and</span> <span style="color: #0000FF;">(</span><span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">year</span><span style="color: #0000FF;">,</span><span style="color: #000000;">100</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">year</span><span style="color: #0000FF;">,</span><span style="color: #000000;">400</span><span style="color: #0000FF;">)==</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">gre_to_day</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">dmy</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dmy</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">m</span> <span style="color: #0000FF;"><</span> <span style="color: #000000;">3</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">y</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">m</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">12</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">*</span><span style="color: #000000;">365.25</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">-</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">/</span><span style="color: #000000;">100</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">/</span><span style="color: #000000;">400</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">+</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">30.6</span><span style="color: #0000FF;">*(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">))</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">654842</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">day_to_rep</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">day</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">day</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">365.25</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">rep_leap</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">y</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">day</span> <span style="color: #0000FF;">-</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">*</span><span style="color: #000000;">365.25</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">365</span> <span style="color: #0000FF;">+</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">/</span><span style="color: #000000;">100</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">-</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">/</span><span style="color: #000000;">400</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">m</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">sansculottide</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">+</span><span style="color: #000000;">rep_leap</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">while</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">></span><span style="color: #000000;">30</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">d</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">30</span>
<span style="color: #000000;">m</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">m</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">13</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">></span> <span style="color: #000000;">sansculottide</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">d</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">sansculottide</span>
<span style="color: #000000;">m</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">y</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">sansculottide</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">5</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">rep_leap</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">day_to_gre</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">day</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">day</span><span style="color: #0000FF;">/</span><span style="color: #000000;">365.25</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">day</span> <span style="color: #0000FF;">-</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">*</span><span style="color: #000000;">365.25</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">21</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">m</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">9</span>
<span style="color: #000000;">y</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1792</span>
<span style="color: #000000;">d</span> <span style="color: #0000FF;">+=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">/</span><span style="color: #000000;">100</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">-</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">/</span><span style="color: #000000;">400</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">13</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">gregoriam</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">gregorian</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (modifiable copy)</span>
<span style="color: #008080;">while</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">></span><span style="color: #000000;">gregoriam</span><span style="color: #0000FF;">[</span><span style="color: #000000;">m</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">d</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">gregoriam</span><span style="color: #0000FF;">[</span><span style="color: #000000;">m</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">m</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">m</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">13</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">m</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">y</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">gregoriam</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">28</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">gre_leap</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">greg_to_frep</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">greg</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">{</span><span style="color: #004080;">integer</span> <span style="color: #000000;">day</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">string</span> <span style="color: #000000;">months</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">year</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">greg</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d %s %d"</span><span style="color: #0000FF;">)[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">month</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">months</span><span style="color: #0000FF;">,</span><span style="color: #000000;">gregorians</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">day</span><span style="color: #0000FF;">,</span><span style="color: #000000;">month</span><span style="color: #0000FF;">,</span><span style="color: #000000;">year</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">day_to_rep</span><span style="color: #0000FF;">(</span><span style="color: #000000;">gre_to_day</span><span style="color: #0000FF;">({</span><span style="color: #000000;">day</span><span style="color: #0000FF;">,</span><span style="color: #000000;">month</span><span style="color: #0000FF;">,</span><span style="color: #000000;">year</span><span style="color: #0000FF;">}))</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">frep</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">month</span><span style="color: #0000FF;">=</span><span style="color: #000000;">13</span><span style="color: #0000FF;">?</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%s %d"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">sansculottides</span><span style="color: #0000FF;">[</span><span style="color: #000000;">day</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">year</span><span style="color: #0000FF;">})</span>
<span style="color: #0000FF;">:</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%d %s %d"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">day</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">republicans</span><span style="color: #0000FF;">[</span><span style="color: #000000;">month</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">year</span><span style="color: #0000FF;">}))</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">frep</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">frep_to_greg</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">frep</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">day</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">month</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">year</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">months</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">days</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">frep</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]<=</span><span style="color: #008000;">'9'</span> <span style="color: #008080;">then</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">day</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">months</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">year</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">frep</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d %s %d"</span><span style="color: #0000FF;">)[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">month</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">months</span><span style="color: #0000FF;">,</span><span style="color: #000000;">republicans</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">else</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">days</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">year</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">frep</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s %d"</span><span style="color: #0000FF;">)[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">day</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">days</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sansculottides</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">month</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">13</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">day</span><span style="color: #0000FF;">,</span><span style="color: #000000;">month</span><span style="color: #0000FF;">,</span><span style="color: #000000;">year</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">day_to_gre</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rep_to_day</span><span style="color: #0000FF;">({</span><span style="color: #000000;">day</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">month</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">year</span><span style="color: #0000FF;">}))</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">greg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%02d %s %d"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">day</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">gregorians</span><span style="color: #0000FF;">[</span><span style="color: #000000;">month</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">year</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">greg</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">test_data</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"22 September 1792"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 1"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"20 May 1795"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Prairial 3"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"15 July 1799"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"27 Messidor 7"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1803"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Fête de la Révolution 11"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"31 December 1805"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"10 Nivôse 14"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"18 March 1871"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"27 Ventôse 79"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"25 August 1944"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"7 Fructidor 152"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"19 September 2016"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Fête du travail 224"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"06 May 1871"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"16 Floréal 79"</span> <span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- Paris Commune begins</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 May 1871"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"3 Prairial 79"</span> <span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- Paris Commune ends</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"09 November 1799"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"18 Brumaire 8"</span> <span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- Revolution ends by Napoléon coup</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"02 December 1804"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"11 Frimaire 13"</span> <span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- Republic ends by Napoléon coronation</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"30 October 1794"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"9 Brumaire 3"</span> <span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- École Normale Supérieure established</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"27 July 1794"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"9 Thermidor 2"</span> <span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- Robespierre falls</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"27 May 1799"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"8 Prairial 7"</span> <span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- Fromental Halévy born</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"22 September 1792"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 1"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"22 September 1793"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 2"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"22 September 1794"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 3"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1795"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 4"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"22 September 1796"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 5"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"22 September 1797"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 6"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"22 September 1798"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 7"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1799"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 8"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1800"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 9"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1801"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 10"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1802"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 11"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"24 September 1803"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 12"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1804"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 13"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1805"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 14"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1806"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 15"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"24 September 1807"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 16"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1808"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 17"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1809"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 18"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 1810"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 19"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"24 September 1811"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 20"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 2015"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 224"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"21 September 2016"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Fête des récompenses 224"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"22 September 2016"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 225"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"23 September 2016"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"2 Vendémiaire 225"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"22 September 2017"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"1 Vendémiaire 226"</span> <span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span> <span style="color: #008000;">"28 September 2017"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"7 Vendémiaire 226"</span> <span style="color: #0000FF;">}</span> <span style="color: #0000FF;">}</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">test_data</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">string</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">greg</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">frep</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">test_data</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span>
<span style="color: #000000;">frep2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">greg_to_frep</span><span style="color: #0000FF;">(</span><span style="color: #000000;">greg</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">greg2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">frep_to_greg</span><span style="color: #0000FF;">(</span><span style="color: #000000;">frep</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">ok</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">frep</span><span style="color: #0000FF;">=</span><span style="color: #000000;">frep2</span> <span style="color: #008080;">and</span> <span style="color: #000000;">greg</span><span style="color: #0000FF;">=</span><span style="color: #000000;">greg2</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"ok"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"**** ERROR ****"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()=</span><span style="color: #004600;">WINDOWS</span> <span style="color: #008080;">then</span>
<span style="color: #000080;font-style:italic;">-- the windows console does not handle
-- non-basic-latin-ascii characters well...</span>
<span style="color: #000000;">frep</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">substitute_all</span><span style="color: #0000FF;">(</span><span style="color: #000000;">frep</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"éêéô"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"eeeo"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%18s &lt;==&gt; %-25s %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">greg</span><span style="color: #0000FF;">,</span><span style="color: #000000;">frep</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ok</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #000080;font-style:italic;">--sanity test:</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">150000</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- (years 1792..~2203)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">rep_to_day</span><span style="color: #0000FF;">(</span><span style="color: #000000;">day_to_rep</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">))!=</span><span style="color: #000000;">i</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">gre_to_day</span><span style="color: #0000FF;">(</span><span style="color: #000000;">day_to_gre</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">))!=</span><span style="color: #000000;">i</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 1,410 ⟶ 2,097:
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" perl6line>use v6;
constant @month_names = <
Vendémiaire Brumaire Frimaire Nivôse Pluviôse Ventôse
Line 1,524 ⟶ 2,211:
or Republican_to_Gregorian(Gregorian_to_Republican($g)) != $g;
}
say 'All tests successful.';</langsyntaxhighlight>
{{Out}}
<pre>All tests successful.</pre>
Line 1,530 ⟶ 2,217:
=={{header|Sidef}}==
{{trans|Perl}}
<langsyntaxhighlight lang="ruby">require('DateTime')
 
var month_names = %w(
Line 1,677 ⟶ 2,364:
2015-09-23 1 Vendémiaire 224
2016-09-22 1 Vendémiaire 225
2017-09-22 1 Vendémiaire 226</langsyntaxhighlight>
{{out}}
<pre>
Line 1,688 ⟶ 2,375:
{{libheader|Wren-seq}}
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">import "./date" for Date
import "./seq" for Lst
import "./fmt" for Fmt
 
class FrenchRCDate {
Line 1,802 ⟶ 2,489:
var lds = thisDate.toLocalDate.format(fmt)
Fmt.print("$-25s => $s", frcDate, lds)
}</langsyntaxhighlight>
 
{{out}}