บอกเวลาเป็นภาษาฝรั่งเศส


21

Bonjour, PPCG! Quelle รักษา est-il หรือไม่ นี่หมายความว่าเวลาเท่าไหร่ในภาษาฝรั่งเศสเพราะนั่นคือสิ่งที่ท้าทายนี้

การบอกเวลาเป็นภาษาฝรั่งเศส (อย่างน้อยเป็นทางการ) นั้นแตกต่างจากการบอกเวลาเป็นภาษาอังกฤษ การบอกเวลาเริ่มต้นด้วยIl est (เป็น) จากนั้นคุณใส่ชั่วโมงตามด้วยHeures (นาฬิกา) (ในกรณีที่คุณไม่ทราบตัวเลขภาษาฝรั่งเศสนี่คือรายการ: http://blogs.transparent.com/french/french-numbers-learn-how-to-count-from-1-to-1000/ ) ถ้ามันเป็น 01:00 ทำheure กระจัดกระจายสำหรับเรื่องนี้ สำหรับเที่ยงใช้midi (ไม่มี Heures) และสำหรับการใช้งานเที่ยงคืนMinuit

นอกจากนาทีคือ 00 คุณจะตามด้วยจำนวนนาที อย่างไรก็ตามมีข้อยกเว้นเล็กน้อยสำหรับเรื่องนี้ เป็นเวลา 15 นาทีคุณต้องการพูดและควอร์ตและเป็นเวลา 30 นาทีที่คุณต้องการจะพูดและดู สำหรับทุกสิ่งหลังจาก 30 นาทีคุณจะเพิ่มจำนวนชั่วโมงทีละหนึ่งจากนั้นเพิ่มคำmoinsและ 60 - นาที ดังนั้น 6:40 น. จึงสามารถรักษาmoins vingt (vingt = 20) ได้ 45 นาทีจะเป็นควอร์

ในที่สุดคุณก็จบลงด้วยเวลาของวัน สำหรับวัน (01:00-12:00) คุณพูดdu matin สำหรับตอนบ่าย (ส่วนตัว แต่ฉันจะนิยามว่าเป็น 13.00 น. ถึง 17.00 น.) คุณพูดว่าde l'apres-midi (ในทางเทคนิคควรมีสำเนียงเหนือ e แต่ eh) และสำหรับคืน (17:00-12:00) คุณพูดdu Soir โปรดทราบว่าสำหรับเที่ยงคืนและเที่ยง ( minuitและmidi ) คุณไม่ได้ใส่สิ่งเหล่านี้ในภายหลัง - เวลาของวันนั้นจะบอกเป็นนัยตามที่คุณใช้

ในขณะที่คุณอาจจะแน่ใจแล้วความท้าทายที่นี่คือการพิมพ์เวลาท้องถิ่นปัจจุบันในภาษาฝรั่งเศสโดยใช้กฎเหล่านี้ นี่คือตัวอย่างผลลัพธ์ที่ควรมีลักษณะตามเวลาที่แตกต่างกัน (เวลาในวงเล็บไม่จำเป็นต้องพิมพ์อย่างชัดเจนมันแค่อยู่ที่นั่นเพื่อให้คุณรู้ว่าเวลาเท่าไร):

Il est sept heures du matin. (7:00 A.M)
Il est deux heures de l'apres-midi. (2:00 P.M)
Il est une heure du matin. (1:00 A.M)
Il est huit heures du soir. (8:00 P.M)
Il est midi. (12:00 P.M, Noon)
Il est minuit. (12:00 A.M, Midnight)
Il est cinq heures vingt du soir. (5:20 P.M)
Il est six heures et quart du matin. (6:15 A.M)
Il est neuf heures et demi du matin. (9:30 A.M)
Il est quatre heures moins dix de l'apres-midi. (3:50 P.M, not 4:50!)
Il est midi moins le quart. (11:45 A.M)

นี่คือรหัส - กอล์ฟดังนั้นรหัสที่สั้นที่สุดจึงชนะ โชคดี!

แก้ไข: ต้องระบุช่วงเวลา



สิ่งที่ควรเป็นผลลัพธ์สำหรับ 08:41 น. เช่น Il est huit heures quarante et une du matin(ถูกต้อง) หรือIl est neuf heures moins dix-neuf du matin(ฟังดูแปลก)?
Blackhole

เราควรเอาท์พุทผลลัพธ์ออกมาหรือเราจะคืนมันได้ไหม? ฟังก์ชั่นภายในที่แปลงตัวเลขเป็นตัวเลขได้หรือไม่
Blackhole

เราควรใส่สำเนียงaprès-midiหรือไม่? เราทำได้ไหม
Blackhole

ถ้าคุณต้องการ. มันไม่จำเป็น.
สปาเก็ตตี้

คำตอบ:


4

PHP - 521 473 ไบต์

ฉันได้เพิ่มบรรทัดใหม่สำหรับการอ่าน:

$w=split(A,'AuneAdeuxAtroisAquatreAcinqAsixAseptAhuitAneufAdixAonzeAdouzeAtreizeA
quatorzeAAseizeAdix-septAdix-huitAdix-neufAvingtAvingt et une');$h=idate('H');if(
$r=($m=idate('i'))>30){$h=++$h%24;$m=60-$m;}echo'Il est '.($h?$h==12?midi:$w[$h%12]
.' heure'.($h%12<2?'':s):minuit).($r?' moins':'').($m==15?($r?' le ':' et ').quart
:($m==30?' et demi':($m?' '.($m<22?$w[$m]:"$w[20]-".$w[$m%10]):''))).($h%12?($h-=$r
)<12?' du matin':($h<17?" de l'après-midi":' du soir'):'').'.';

วิธีการที่ใช้ในการแปลงตัวเลขให้เป็นตัวเลขในภาษาฝรั่งเศสแรงบันดาลใจจากคำตอบเกี่ยวกับเรื่องนี้เป็นความท้าทายอื่น ๆโดยedc65

นี่คือรุ่นที่ไม่ได้แต่งแต้ม:

/** Define numerals **/
$numerals = [
    '', 'une', 'deux', 'trois', 'quatre',
    'cinq', 'six', 'sept', 'huit', 'neuf',
    'dix', 'onze', 'douze', 'treize', 'quatorze',
    '', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf',
    'vingt', 'vingt et une'
];

/** Get current time **/
$hours = idate('H');
$minutes = idate('i');

/** Check if we need to count in reverse **/
$reverse = $minutes > 30;
if ($reverse) {
    $hours = ($hours + 1) % 24;
    $minutes = 60 - $minutes;
}

echo 'Il est ';

/** Print hours **/
if ($hours === 12) {
    echo 'midi';
}
else if ($hours === 0) {
    echo 'minuit';
}
else
{
    echo $numerals[$hours % 12] .' heure';
    if ($hours % 12 !== 1) {
        echo 's';
    }
}

/** Print minutes **/
if ($reverse) {
    echo ' moins';
}

if ($minutes === 15)
{
    if ($reverse) {
        echo ' le ';
    }
    else {
        echo ' et ';
    }

    echo 'quart';
}
else if ($minutes === 30) {
    echo ' et demi';
}
else if ($minutes !== 0)
{
    echo ' ';

    if ($minutes < 22) {
        echo $numerals[$minutes];
    }
    else {
        echo $numerals[20] .'-'. $numerals[$minutes % 10];
    }
}

/** Print daytime **/
if ($hours % 12 !== 0)
{
    if ($reverse) {
        --$hours;
    }

    if ($hours < 12) {
        echo ' du matin';
    }
    else if ($hours < 17) {
        echo " de l'après-midi";
    }
    else {
        echo ' du soir';
    }
}

echo '.';

4

Python 3, 586 547 556 506 505 502 498 497 493 ไบต์

ความพยายามครั้งแรกของฉันในการเล่นกอล์ฟคืออะไร ฉันไม่แน่ใจจริงๆเกี่ยวกับวิธีที่ฉันเลือกโดยเฉพาะnรายการ แต่ฉันอยากลองดู

from datetime import*;t=datetime.now()
n='/une/deux/trois/quatre/cinq/six/sept/huit/neuf/dix/onze/douze/treize/quatorze/et quart/seize/dix-sept/dix-huit/dix-neuf/vingt//et demi'.split('/')
n[21:22]=['vingt-'+i for i in['et-une']+n[2:10]]
h,m=t.hour,t.minute;s=h//12;h%=12
e=' d'+('u matin',("e l'après-midi","u soir")[h>4])[s]
try:m=' '[:m]+n[m]
except:m=' moins '+(n[60-m],'le quart')[m==45];h+=1
e,h=('',e,('minuit','midi')[h//12^s],n[h]+' heures'[:h+5])[h%12>0::2]
print('Il est',h+m+e+'.')

Ungolfed:

from datetime import datetime

time = datetime.now()
numbers = [
    '', 'une', 'deux', 'trois', 'quatre',
    'cinq', 'six', 'sept', 'huit', 'neuf',
    'dix', 'onze', 'douze', 'treize', 'quatorze',
    'et quart', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf',
    'vingt', 'vingt-et-une', 'vingt-deux', 'vingt-trois', 'vingt-quatre',
    'vingt-cinq', 'vingt-six', 'vingt-sept', 'vingt-huit', 'vingt-neuf',
    'et demi']

status, hour = divmod(time.hour, 12)
if status:
    ending = " du soir" if h>4 else " de l’après-midi"
else:
    ending = " du matin"

try:
    if not time.minute:
        minutes = ""
    else:
        minutes = " " + numbers[time.minute]
except IndexError:
    hour += 1
    if time.minute == 45:
        minutes = " moins le quart"
    else:
        minutes = " moins " + numbers[60 - time.minute]

if hour%12:    # 'whole' hours
    hours = numbers[hour] + " heures"
    if hour == 1:
        # removing extra 's'
        hours = hours[:-1]
else:          # midnight or noon
    ending = ""
    if (hour == 12 and status) or (hour == 0 and status == 0):
        hours = "minuit"
    else:
        hours = "midi"

print('Il est', hours + minutes + ending + '.')

2
คุณสามารถบันทึก 50 'minuit#une#deux#...#vingt-neuf#et demi'.split('#')ไบต์ด้วย อาจจะสั้นกว่านี้เพียงแค่บีบอัดสตริงอย่างใด
Martin Ender

@ มาร์ตินใช่แค่เห็นมันในคำตอบของ Blackhole ด้วย แต่ฉันต้องการลองย่อให้สั้นลงโดยใช้การทำซ้ำที่เกี่ยวข้องกับ "vingt-xxx" แต่หลังจากนอนหลับไปสักพักแล้วตั้งแต่ Il est deux ก็ยังคงรักษา mois trois du matin ไว้
409_Conflict

@MathiasEttinger แก้ไขสองสามครั้งคุณมี 'voingt' แทน vingt และ 21 คือ 'vingt et un' ไม่ใช่ 'vingt-et-une'
Brian Tuck

1
ขอบคุณสำหรับVingt สำหรับ 21 มันควรจะเป็นvingt-et-uneตั้งแต่นาทีเป็นผู้หญิงแบบเดียวกับที่ 1:01 AM เป็นคืนที่ดีที่จะรักษาune du matin
409_Conflict

@BrianTuck ยังเป็น 21 vingt-et-unหรือvingt-et-uneตั้งแต่ปี 1990 แทนที่จะเป็นvingt et unหรือvingt et une : fr.wiktionary.org/wiki/vingt_et_une
409_Conflict

3

Javascript (ES6), 506 495 ไบต์

แก้ไข: บีบอัดaเพื่อบันทึกไม่กี่ไบต์

a=`
un
j
k
yre
h
six
w
v
p}
onldoultreilyorl
seize}-w}-v}-p~~ et un{j{k{yre{h{six{w{v{p
et demi`,[...`hjklpvwy{}~`].map((x,w)=>a=a.split(x).join(`cinq|deux|trois|ze
|neuf|huit|sept|quat|~-|
dix|
vingt`.split`|`[w])),a=a.split`
`,alert(`Il est ${(e=(d=((b=(z=new Date).getHours())+(y=(c=z.getMinutes())>30))%24)%12)?a[e]+` heure${e-1?"s":""}`:d?'midi':'minuit'} ${y?"moins ":""}${y?c-45?a[60-c]:'le quart':c-15?a[c]:'et quart'}${e?[' du matin'," de l'apres-midi",' du soir'][(b>12)+(b>16)]:""}.`)

คำอธิบาย:

a = 'compressed string of french numbers with 'et demi' for 30 and 15 removed';
a = // code that decompresses a

// a,b,c,d,e,y,z are all inlined into the first expression that uses them
z = new Date();
b = z.getHours();
c = z.getMinutes();
y = c > 30; // true if 60 - minutes, false otherwise
d = (b + y) % 24; // the next hour if y
e = d % 12; // is it not noon and not midnight?

alert(
    "Il est " +
    // add the hour
    // if d is not 0 or 12, add d + 'heure(s)'
    (e ? a[e] + ` heure${e-1?"s":""}` : d ? 'midi' : 'minuit') +
    " " +
    (y ? "moins " : "") + // add 'moins' if necessary

    ( // add the minute
      y? // necessary to subtract from 60?
        c-45?
          a[60-c] // add normal number word
          :'le quart' // handle special case for 45
        :c-15?
          a[c] // add normal word
          :'et quart' // handle special case for 15
    ) +
    ( // select appropriate ending
      e? // is it not noon and not midnight?
        // create array of endings
        [" du matin"," de l'apres-midi"," du soir"]
          // selects item 0 if b in [0, 12], item 1 if b in [13, 16] and item 2 if b > 16
          [(b > 12) + (b > 16)]
        :"" // if it's noon or midnight, no ending is necessary
    ) +
    "." // add period
)

2

C, 860 835 794 ไบต์

น่ากลัวอย่างแน่นอน แต่อาจทำให้สั้นลงได้ มีการเพิ่มบรรทัดใหม่จำนวนมากเพื่อวัตถุประสงค์ในการจัดรูปแบบในเว็บไซต์นี้ ซอร์สโค้ดที่แท้จริงมีการขึ้นบรรทัดใหม่หลังจาก #includes และ #defines แต่ทุกอย่างเริ่มต้นจาก char * ไปยัง w สุดท้าย (". \ n");} ล้วนอยู่ในหนึ่งบรรทัด ฉันสั้นลงโดยการลบค่าจาก 22, ... , 29 ในอาร์เรย์สตริงแทนการใช้ซ้ำสตริงสำหรับ 2, ... , 9 และการเติม "vingt-" เมื่อเหมาะสม (ฉันหวังว่าฉันจะไม่ได้แนะนำบั๊ก!)

#include <sys/time.h>
#define w printf
#define q tm_min
#define r tm_hour
char*a[]={"minuit","une","deux","trois","quatre","cinq","six","sept","huit","neuf","dix",
"onze","douze","treize","quatorze","quart","seize","dix-sept","dix-huit","dix-
neuf","vingt","vingt-et-une",0,0,0,0,0,0,0,0,"demi"};
h=1,s=1,m,e,l,t,p,o,v;struct tm j;
main(){struct timeval i;gettimeofday(&i,0);localtime_r(&i.tv_sec,&j);
j.q>30?m=1,++j.r,j.q=60-j.q:j.q==15||j.q==30?e=1:0;j.q>21&&j.q<30?v=1:0;
j.r%12?j.r<12?t=1:j.r-m<17?p=1:(o=1):0;
j.q==15&&m?l=1:0;j.r%12?j.r%12==1?s=0:0:(h=0,s=0);
w("Il est ");j.r==12?w("midi"):w("%s",a[j.r%12]);h?w(" heure"):0;s?w("s"):0;
m?w(" moins"):0;e?w(" et"):0;l?w(" le"):0;
j.q?v?w(" vingt-"):w(" "),w("%s",a[j.q-20*v]):0;
t?w(" du matin"):p?w(" de l'apres-midi"):o?w(" du soir"):0;w(".\n");}

อย่างนี้:

#include <sys/time.h>
#define w printf
#define q tm_min
#define r tm_hour
char*a[]={"minuit","une","deux","trois","quatre","cinq","six","sept","huit","neuf","dix","onze","douze","treize","quatorze","quart","seize","dix-sept","dix-huit","dix-neuf","vingt","vingt-et-une",0,0,0,0,0,0,0,0,"demi"};h=1,s=1,m,e,l,t,p,o,v;struct tm j;main(){struct timeval i;gettimeofday(&i,0);localtime_r(&i.tv_sec,&j);j.q>30?m=1,++j.r,j.q=60-j.q:j.q==15||j.q==30?e=1:0;j.q>21&&j.q<30?v=1:0;j.r%12?j.r<12?t=1:j.r-m<17?p=1:(o=1):0;j.q==15&&m?l=1:0;j.r%12?j.r%12==1?s=0:0:(h=0,s=0);w("Il est ");j.r==12?w("midi"):w("%s",a[j.r%12]);h?w(" heure"):0;s?w("s"):0;m?w(" moins"):0;e?w(" et"):0;l?w(" le"):0;j.q?v?w(" vingt-"):w(" "),w("%s",a[j.q-20*v]):0;t?w(" du matin"):p?w(" de l'apres-midi"):o?w(" du soir"):0;w(".\n");}

เวอร์ชันที่ไม่ได้รับการอัปเดตโดยไม่มี "การเพิ่มประสิทธิภาพพื้นที่" (น่าเกลียดด้วย):

#include <stdio.h>
#include <string.h>
#include <time.h>

#include <sys/time.h>

int main(int argc, char *argv[])
{
        struct timeval tv;
        struct tm local_time;
        char *nums[] = {"minuit", "une", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quart", "seize", "dix-sept", "dix-huit", "dix-neuf", "vingt", "vingt-et-une", "vingt-deux", "vingt-trois", "vingt-quatre", "vingt-cinq", "vingt-six", "vingt-sept", "vingt-huit", "vingt-neuf", "demi"};
        int heure = 1;
        int s = 1;
        int moins = 0;
        int et = 0;
        int le = 0;
        int matin = 0, aprem = 0, soir = 0;

        memset(&local_time, 0, sizeof local_time);
        gettimeofday(&tv, NULL);
        localtime_r(&tv.tv_sec, &local_time);

#if 0
        local_time.tm_min = atoi(argv[1]);
        local_time.tm_hour = atoi(argv[2]);
#endif
        if (local_time.tm_min > 30) {
                moins = 1;
                local_time.tm_hour += 1;
                local_time.tm_min = 60 - local_time.tm_min;
        } else if (local_time.tm_min == 15 || local_time.tm_min == 30) {
                et = 1;
        }

        if (local_time.tm_hour % 12) {
                if (local_time.tm_hour < 12)
                        matin = 1;
                else if (local_time.tm_hour < 17)
                        aprem = 1;
                else if (local_time.tm_hour == 17 && moins)
                        aprem = 1;
                else
                        soir = 1;
        }

        if (local_time.tm_min == 15 && moins)
                le = 1;

        if (local_time.tm_hour % 12 == 0) {
                heure = 0;
                s = 0;
        } else if (local_time.tm_hour % 12 == 1) {
                s = 0;
        }

        printf("Il est ");

        if (local_time.tm_hour == 12)
                printf("midi");
        else
                printf("%s", nums[local_time.tm_hour % 12]);

        if (heure)
                printf(" heure");

        if (s)
                printf("s");

        if (moins)
                printf(" moins");

        if (et)
                printf(" et");

        if (le)
                printf(" le");

        if (local_time.tm_min)
                printf(" %s", nums[local_time.tm_min]);

        if (matin)
                printf(" du matin");
        else if (aprem)
                printf(" de l'apres-midi");
        else if (soir)
                printf(" du soir");

        printf(".\n");
        return 0;
}

(สิ่ง #if 0 เป็นเพียงการทดสอบค่าเวลาที่แตกต่างผ่านบรรทัดคำสั่ง)


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