Kể thời gian bằng tiếng Pháp


21

Bonjour, PPCG! Quelle heure est-il? Điều này có nghĩa là thời gian bằng tiếng Pháp, vì đó chính xác là những gì thách thức này là về.

Thời gian nói bằng tiếng Pháp (ít nhất là chính thức) hơi khác so với thời gian nói bằng tiếng Anh. Kể thời gian bắt đầu với Il est (Đó là). Sau đó, bạn đặt giờ theo sau là heures (giờ). (Trong trường hợp bạn không biết số người Pháp, đây là một danh sách: http://blogs.transparent.com/french/french-numbers-learn-how-to-count-from-1-to-1000/ ). Nếu đó là 1:00, làm heure une cho việc này. Đối với buổi trưa, sử dụng midi (không có heures) và nửa đêm sử dụng minuit .

Trừ khi số phút là 00, sau đó bạn theo dõi nó với số phút. Tuy nhiên, có một vài ngoại lệ cho việc này. Trong 15 phút, bạn muốn nói et quart , và trong 30 phút bạn muốn nói et demi . Đối với bất cứ điều gì sau 30 phút, bạn tăng số giờ người một, sau đó thêm từ Moins và 60 - biên bản. Vì vậy, 6:40 PM là Il est sept heures moins vingt (vingt = 20). 45 phút sẽ là mo le le quart .

Cuối cùng, bạn kết thúc nó với thời gian trong ngày. Đối với buổi sáng (1 giờ sáng đến 12 giờ tối), bạn nói du matin . Đối với buổi chiều (chủ quan, nhưng tôi sẽ xác định nó là 1 giờ chiều đến 5 giờ chiều), bạn nói de l'apres-midi (về mặt kỹ thuật nên có một điểm nhấn phía trên e, nhưng eh). Và cho đêm (5 giờ chiều đến 12 giờ sáng) bạn nói du soir . Lưu ý rằng vào nửa đêm và trưa ( minuitmidi ) bạn không đặt bất kỳ thứ nào trong số này sau đó - thời gian trong ngày được ngụ ý dựa trên cái bạn sử dụng.

Như bạn có thể đã xác định, thách thức ở đây là in ra giờ địa phương hiện tại bằng tiếng Pháp bằng các quy tắc này. Đây là những gì đầu ra mẫu sẽ trông giống như tại các thời điểm. (Thời gian trong ngoặc đơn không nhất thiết phải được in, nó chỉ ở đó để bạn biết thời gian là gì):

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)

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng. Chúc may mắn!

EDIT: Thời gian được yêu cầu.



Điều gì sẽ là đầu ra cho 08:41 AM, ví dụ? Il est huit heures quarante et une du matin(đúng) hay Il est neuf heures moins dix-neuf du matin(nghe lạ)?
Hố đen

Chúng ta có nhất thiết phải đưa ra kết quả, hoặc chúng ta có thể trả lại nó không? Các chức năng nội bộ có thể chuyển đổi số thành số cho phép không?
Hố đen

Chúng ta có nên đặt một dấu trong après-midi? Chúng ta có thể không
Hố đen

Nếu bạn muốn. Nó không cần thiết.
một spaghetto

Câu trả lời:


4

PHP - 521 473 byte

Tôi đã thêm một số dòng mới để dễ đọc:

$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'):'').'.';

Phương pháp được sử dụng để chuyển đổi một số thành số của nó bằng tiếng Pháp được lấy cảm hứng từ câu trả lời này trong một thách thức khác của edc65 .

Đây là phiên bản chưa được chỉnh sửa:

/** 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 byte

Nỗ lực đầu tiên của tôi tại golf bất cứ điều gì. Tôi thực sự không chắc chắn về cách tôi chọn, đặc biệt là ndanh sách. Nhưng tôi muốn thử.

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+'.')

Ung dung:

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
Bạn có thể lưu khoảng 50 byte với 'minuit#une#deux#...#vingt-neuf#et demi'.split('#'). Có thể thậm chí ngắn hơn để chỉ nén chuỗi bằng cách nào đó.
Martin Ender

@Martin yeah, chỉ cần nhìn thấy câu trả lời của Blackhole. Nhưng tôi muốn thử rút ngắn nó bằng cách sử dụng các lần lặp lại liên quan đến "vingt-xxx". Nhưng sau một số giấc ngủ kể từ khi Il est deux heures moins trois du matin.
409_Conflict

@MathiasEttinger một vài chỉnh sửa, bạn có 'voingt' thay vì vingt và 21 là 'vingt et un', không phải 'vingt-et-une'
Brian Tuck

1
Cảm ơn vì vingt . Đối với 21, nó phải là vingt-et-une vì phút là nữ tính, giống như cách 1:01 AM là il est une heure une du matin.
409_Conflict

@BrianTuck Ngoài ra 21 là vingt-et-un hoặc vingt-et-une kể từ năm 1990 thay vì vingt et un hoặc vingt et une : fr.wiktionary.org/wiki/vingt_et_une
409_Conflict

3

Javascript (ES6), 506 495 byte

Chỉnh sửa: Được nén ađể lưu một vài byte.

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)]:""}.`)

Giải trình:

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 byte

Hoàn toàn khủng khiếp, nhưng có lẽ có thể được thực hiện thậm chí ngắn hơn. Nhiều dòng mới đã được thêm vào cho mục đích định dạng trên trang web này. Mã nguồn thực tế có các dòng mới sau #includes và #defines, nhưng mọi thứ bắt đầu từ char * đến w cuối cùng (". \ N");} đều nằm trong một dòng. Tôi đã rút ngắn nó bằng cách xóa các giá trị từ 22, ..., 29 trong mảng chuỗi, thay vào đó sử dụng lại các chuỗi cho 2, ..., 9 và thêm vào một "vingt-" khi thích hợp. (Tôi thực sự hy vọng tôi đã không giới thiệu một lỗi!)

#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");}

Như thế này:

#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");}

Phiên bản Ungolfed, không có "tối ưu hóa không gian" (cũng khá xấu xí):

#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;
}

(Công cụ #if 0 chỉ để kiểm tra các giá trị thời gian khác nhau thông qua dòng lệnh).


1
Đạo cụ để thử câu trả lời C :) Hãy nhìn vào mặt sáng - có lẽ nó ngắn hơn so với Java!
một spaghetto
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.