Mengatakan waktu dalam bahasa Prancis

21

Bonjour, PPCG! Quelle heure est-il? Ini artinya jam berapa di Perancis, karena itulah tantangan ini.

Memberitahu waktu dalam bahasa Prancis (setidaknya secara formal) agak sedikit berbeda dengan menceritakan waktu dalam bahasa Inggris. Memberitahu waktu dimulai dengan Il est ( Yaitu ). Kemudian, Anda menempatkan jam diikuti oleh heures (jam). (Jika Anda tidak tahu nomor Prancis, berikut daftarnya: http://blogs.transparent.com/french/french-numbers-learn-how-to-count-from-1-to-1000/ ). Jika jam 1, lakukan heure une untuk ini. Untuk siang hari, gunakan midi (tanpa heures), dan untuk tengah malam gunakan minuit .

Kecuali jika menit adalah 00, Anda kemudian mengikutinya dengan jumlah menit. Namun ada beberapa pengecualian. Selama 15 menit, Anda ingin mengucapkan et quart , dan selama 30 menit Anda ingin mengatakan et demi . Untuk apa pun setelah 30 menit, Anda menambah jumlah jam per satu, lalu tambahkan kata moins dan 60 - menit. Jadi 18:40 adalah Estest heures moins vingt (vingt = 20). 45 menit akan menjadi bulan kuart .

Akhirnya, Anda mengakhirinya dengan waktu sehari. Untuk pagi hari (01: 00-12: 00), Anda mengatakan du matin . Untuk sore hari (subyektif, tetapi saya akan mendefinisikannya sebagai 1 siang sampai 5 sore), Anda mengatakan de l'apres-midi (secara teknis harus ada aksen di atas e, tapi eh). Dan untuk malam hari (jam 17.00 - 12.00) Anda mengatakan du soir . Perhatikan bahwa untuk tengah malam dan siang hari ( minuit dan midi ) Anda tidak memasukkan semua ini sesudahnya - waktu hari tersirat berdasarkan mana yang Anda gunakan.

Karena Anda mungkin sudah memastikan, tantangan di sini adalah untuk mencetak waktu setempat saat ini dalam bahasa Prancis menggunakan aturan-aturan ini. Inilah contoh output yang seharusnya terlihat pada berbagai waktu. (Waktu dalam tanda kurung tidak harus dicetak jelas, itu hanya ada sehingga Anda tahu jam berapa):

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)

Ini kode-golf, jadi kode terpendek menang. Semoga berhasil!

EDIT: Periode diperlukan.

sebuah spaghetto
sumber
2
Terkait: Eja nomor dalam bahasa Prancis
NinjaBearMonkey
Apa yang harus menjadi output untuk 08:41, misalnya? Il est huit heures quarante et une du matin(benar) atau Il est neuf heures moins dix-neuf du matin(terdengar aneh)?
Blackhole
Haruskah kita mengeluarkan hasilnya, atau bisakah kita mengembalikannya? Apakah fungsi internal yang mengubah angka menjadi angka diperbolehkan?
Blackhole
Haruskah kita aksen après-midi? Bisakah kita?
Blackhole
Jika kamu mau. Itu tidak perlu.
spaghetto

Jawaban:

4

PHP - 521 473 byte

Saya telah menambahkan beberapa baris baru untuk keterbacaan:

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

Metode yang digunakan untuk mengonversi angka menjadi angka dalam bahasa Prancis diilhami oleh jawaban ini pada tantangan lain oleh edc65 .

Ini adalah versi yang tidak disunat:

/** 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 '.';
Lubang hitam
sumber
4

Python 3, 586 547 556 506 505 502 498 497 493 Bytes

Upaya pertamaku dalam bermain golf. Saya benar-benar tidak yakin dengan cara saya memilih, terutama ndaftar. Tetapi saya ingin mencobanya.

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

Tidak Disatukan:

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 + '.')
409_Konflik
sumber
2
Anda dapat menyimpan sekitar 50 byte dengan 'minuit#une#deux#...#vingt-neuf#et demi'.split('#'). Mungkin lebih pendek untuk hanya memadatkan string.
Martin Ender
@ Martin ya, baru saja melihatnya di jawaban Blackhole juga. Tapi saya ingin mencoba mempersingkat menggunakan pengulangan yang terlibat dengan "vingt-xxx". Tetapi setelah beberapa tidur sejak Il est deux heures moins trois du matin.
409_Konflik
@MathiasEttinger koreksi pasangan, Anda memiliki 'voingt' bukan vingt, dan 21 adalah 'vingt et un', bukan 'vingt-et-une'
Brian Tuck
1
Terima kasih sudah vingt . Untuk 21 harus vingt-et-une karena menit adalah feminin, cara yang sama bahwa 01:01 adalah lebih baik daripada heure une du matin.
409_Konflik
@BrianTuck Juga 21 adalah vingt-et-un atau vingt-et-une sejak 1990 bukannya vingt et un atau vingt et une : fr.wiktionary.org/wiki/vingt_et_une
409_Conflict
3

Javascript (ES6), 506 495 byte

Sunting: Terkompresi auntuk menyimpan beberapa 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)]:""}.`)

Penjelasan:

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
)
DankMemes
sumber
2

C, 860 835 794 byte

Benar-benar menghebohkan, tetapi mungkin bisa dibuat lebih pendek. Banyak baris baru ditambahkan untuk tujuan pemformatan di situs ini. Kode sumber aktual memiliki baris baru setelah #include dan #defines, tetapi semuanya mulai dari char * ke w terakhir (". \ N");} semuanya dalam satu baris. Saya memperpendeknya dengan menghapus nilai dari 22, ..., 29 dalam array string, alih-alih menggunakan kembali string untuk 2, ..., 9 dan menambahkan sebuah "vingt-" saat yang tepat. (Saya benar-benar berharap saya tidak memperkenalkan bug!)

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

Seperti ini:

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

Versi tidak dikolomisasi, tanpa "optimasi ruang" (juga sangat jelek):

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

(Item # jika 0 hanya untuk menguji nilai waktu yang berbeda melalui baris perintah).

Tob Ernack
sumber
1
Alat peraga untuk mencoba jawaban C :) Lihat sisi baiknya - mungkin lebih pendek daripada di Jawa!
spaghetto