Saatnya Spanyol!

24

Saya punya tugas sederhana yang seharusnya relatif mudah diimplementasikan dengan menggunakan kode. Tujuan Anda adalah untuk menulis program yang akan menampilkan waktu yang ditulis dalam bahasa Spanyol, mengingat waktu dalam format HH: MM. Banyak orang mungkin tidak tahu bagaimana melakukan ini, jadi saya akan menguraikan.

Waktu dalam bahasa Spanyol cukup logis. Biasanya mengikuti pola "Es la / Son las (jam) y (menit)." Jam dalam format 12 jam, dan "Es la" hanya digunakan jika jamnya 1 (yaitu jam satu). Berita acara adalah cerita yang berbeda. Jika menitnya kurang dari 30, maka itu ditunjukkan seperti yang ditunjukkan di atas. Namun, jika menit lebih dari 30, maka jam dibulatkan dan menit dikurangi. Misalnya, 7:35 diterjemahkan ke dalam yang setara dengan "8 jam minus 25 menit." Beberapa contoh lagi akan diberikan di bawah ini. Daftar nomor Spanyol yang diperlukan dapat ditemukan di sini . Ada aksen pada beberapa angka, tetapi ini tidak perlu.

Catatan: Sumber mengatakan "uno," tetapi secara tata bahasa harus benar "una." Ini seharusnya tidak mempengaruhi jawaban apa pun sejauh ini.

Catatan 2: Juga, "cero" tidak perlu. Jika program Anda menampilkan "Es la una" atau "Son las tres," tidak masalah bagi saya. Maaf atas perubahan aturan ini.

Aturan

  • Masukan akan diberikan melalui STDIN atau yang setara dalam bahasa Anda.
  • Tidak ada bacaan dari perpustakaan luar.
  • Kode Anda dapat melakukan apa saja dengan input yang tidak valid.

Bonus

  • -10 jika kode Anda menambahkan frasa tambahan ini - "y cuarto" untuk: 15, "y media" untuk: 30, dan "menos cuarto" untuk: 45 (dibulatkan).
  • -15 jika kode Anda dapat menangani AM dan PM, merespons dengan "de la mañana" dan "de la tarde," sesuai.
  • -15 jika kode Anda dapat menerjemahkan waktu saat ini jika tidak ada input yang diberikan.

Mencetak gol

  • Ini adalah tantangan kode-golf, dan itu akan dinilai dengan byte, bukan karakter.

Contohnya

Input: 8:10 Keluaran:Son las ocho y diez.

Input: 6:45 Keluaran:Son las siete menos quince (or cuarto).

Input: 1:29 Keluaran:Es la una y veintinueve.

Input: 12:55 Keluaran:Es la una menos cinco.

Beri tahu saya jika ada yang perlu ditentukan di sini. Ini adalah pertanyaan pertama saya, jadi pasti tidak sempurna.

mdc32
sumber
Untuk informasi Anda, Anda bisa mendapatkan umpan balik sebelum memposting di kotak pasir .
Stretch Maniac
1
@Parr saya meragukannya. Mungkin ada cukup banyak angka yang harus dikodekan agar hal ini terjadi - setidaknya senilai 45 karakter, bahkan terhitung untuk pola.
mdc32
1
@ Dennis Hmm ... Saya kira keduanya akan baik-baik saja. Es la una y cerocukup berulang, jadi saya mengerti maksud Anda. Saya tidak menentukan ini, jadi saya kira salah satu akan baik-baik saja. Terima kasih untuk umpan baliknya.
mdc32
1
Anda harus menambahkan 01:21sebagai test case, karena setidaknya satu penjawab bingung dengan apa yang Anda katakan tentang una vs uno .
Peter Taylor
3
Bonus kedua adalah (hampir?) Tidak pernah sepadan karena frasa "de la", "manana" dan "tarde" saja sudah terhitung hingga 16 byte.
britishtea

Jawaban:

9

JavaScript (ES6) 308 316

Edit2 perbaikan bug Edit lupa mengklaim bonus
Sebagai program dengan I / O via popup

s='media0uno0dos0tres0cuatro0cinco0seis0siete0ocho0nueve0diez0once0doce0trece0catorce0cuarto0dieci0veint'.split(0),
N=n=>n<16?s[n]:n<20?s[16]+s[n-10]:n>29?s[0]:s[17]+(n>20?'i'+s[n-20]:'e'),
[h,m]=prompt().split(':'),
alert(((h=(10-~h+(m>30))%12)?'Son las '+N(1+h):'Es la una')+(m>30?' menos '+N(60-m):-m?' y '+N(~~m):''))

Sebagai fungsi yang dapat diuji

F=t=>(
  s='media0uno0dos0tres0cuatro0cinco0seis0siete0ocho0nueve0diez0once0doce0trece0catorce0cuarto0dieci0veint'.split(0),
  N=n=>n<16?s[n]:n<20?s[16]+s[n-10]:n>29?s[0]:s[17]+(n>20?'i'+s[n-20]:'e'),
  [h,m]=t.split(':'),
  ((h=(10-~h+(m>30))%12)?'Son las '+N(1+h):'Es la una')+(m>30?' menos '+N(60-m):-m?' y '+N(~~m):'')
)

Uji di konsol FireFox / FireBug

for(i=0;i<13;i++)
{
   console.log(F(i+':'+i)+'. '+F(i+':'+(i+15))+'. '+F(i+':'+(i+30))+'. '+F(i+':'+(i+45)))
}

Keluaran

Son las doce. Son las doce y cuarto. Son las doce y media. Es la una menos cuarto
Es la una y uno. Es la una y dieciseis. Son las dos menos veintinueve. Son las dos menos catorce
Son las dos y dos. Son las dos y diecisiete. Son las tres menos veintiocho. Son las tres menos trece
Son las tres y tres. Son las tres y dieciocho. Son las cuatro menos veintisiete. Son las cuatro menos doce
Son las cuatro y cuatro. Son las cuatro y diecinueve. Son las cinco menos veintiseis. Son las cinco menos once
Son las cinco y cinco. Son las cinco y veinte. Son las seis menos veinticinco. Son las seis menos diez
Son las seis y seis. Son las seis y veintiuno. Son las siete menos veinticuatro. Son las siete menos nueve
Son las siete y siete. Son las siete y veintidos. Son las ocho menos veintitres. Son las ocho menos ocho
Son las ocho y ocho. Son las ocho y veintitres. Son las nueve menos veintidos. Son las nueve menos siete
Son las nueve y nueve. Son las nueve y veinticuatro. Son las diez menos veintiuno. Son las diez menos seis
Son las diez y diez. Son las diez y veinticinco. Son las once menos veinte. Son las once menos cinco
Son las once y once. Son las once y veintiseis. Son las doce menos diecinueve. Son las doce menos cuatro
Son las doce y doce. Son las doce y veintisiete. Es la una menos dieciocho. Es la una menos tres
edc65
sumber
8

Ya, bahasa yang paling tidak diharapkan untuk muncul di kontes golf, yang diberi kode oleh pegolf terburuk di dunia, kembali!

Java - 676 ​​byte (716-10-15-15)

Golf:

class A{void main(String[]a){java.util.Calendar c=java.util.Calendar.getInstance();int h,m;String s="";h=c.get(c.HOUR);m=c.get(c.MINUTE);String[]e={"doce","una","dos","tres","quatro","cinco","ses","siete","ocho","nueve","diez","once","doce","trece","catorce","quarto","çseís","çsiete","çocho","çnueve","xe","xiuno","xidós","xitrés","xiquatro","xicinco","xiséis","xisiete","xiocho","xinueve","media"};for(int i=0;++i<30;e[i]=e[i].replace("ç","dieci"),e[i]=e[i].replace("x","vient"));s+=(h==1&m<30|h==12&m>30)?"Es la ":"Son las ";s+=(m<=30)?e[h]:(h==12&m>30)?e[1]:e[h+1];s+=(m==0)?" certas":(m<=30)?" y "+e[m]:" menos "+e[60-m];s+=(c.get(c.AM_PM)==0)?" de la mañana.":" de la tarde.";System.out.println(s);}}

Tidak Disatukan:

public class A {

    public static void main(String[] a) {
        java.util.Calendar c = java.util.Calendar.getInstance();
        int h, m;
        String s = "";
        h = c.get(c.HOUR);
        m = c.get(c.MINUTE);
        String[] e = {"doce", "una", "dos", "tres", "quatro", "cinco", "ses", "siete", "ocho", "nueve", "diez", "once", "doce", "trece", "catorce", "quarto", "çseís", "çsiete", "çocho", "çnueve", "xe", "xiuno", "xidós", "xitrés", "xiquatro", "xicinco", "xiséis", "xisiete", "xiocho", "xinueve", "media"};
        for (int i = 0; ++i < 30; e[i] = e[i].replace("ç", "dieci"), e[i] = e[i].replace("x", "vient"));
        s += (h == 1 & m < 30 | h == 12 & m > 30) ? "Es la " : "Son las ";
        s += (m <= 30) ? e[h] : (h == 12 & m > 30) ? e[1] : e[h + 1];
        s += (m == 0) ? " certas" : (m <= 30) ? " y " + e[m] : " menos " + e[60 - m];
        s += (c.get(c.AM_PM) == 0) ? " de la mañana." : " de la tarde.";
        System.out.println(s);
    }
}

Berurusan dengan quartodan media, dengan AM / PM dan tidak memiliki input. Jadi saya bisa mengklaim semua bonus, meskipun itu, jika saya tidak mengimplementasikan fitur-fitur itu, saya akan mendapat skor yang lebih rendah lagi, lol. facepalms

Rodolfo Dias
sumber
6

Python 3: 294 karakter - 10 = 284

h,m=map(int,input().split(':'))
t="y"
d="yunoydosytresycuatroycincoyseisysieteyochoynueveydiezyonceydoceytreceycatorceycuarto".split(t)*2
if m>30:h=h%12+1;m=60-m;t="menos"
print(["Es la una","Son las "+d[h]][h>1],t,[d[m]or"cero",["dieci","veint"+'ei'[m>20],"media"][m//10-1]+d[m%10]][m>15]+".")

Ini mendapatkan bonus sepuluh poin untuk menggunakan "cuarto" dan "media"

Kami membaca jam dan menit sebagai ints. Jika menit di atas 30, kita beralih ke jam berikutnya, mengukur menit dari 60, dan mengubah kata sambung menjadi "menos".

Daftar dmemiliki terjemahan dari angka Spanyol hingga 15. Kami membuat d[0]menjadi ''untuk mencegah hal-hal seperti "diecicero". Ini dilakukan dengan panggilan yang canggung split(' ')dengan ruang awal; yang biasa splithanya akan mengabaikannya. Kasing nol menit ditangani kemudian.

Untuk mendapatkan angka di atas 15, kami menggabungkan string puluhan digit dengan string satu digit yang sesuai. 15dan 30ditulis sebagai "media" dan "cuarto" tanpa biaya.

Python 3 menyimpan satu jaring arang di atas Python 2: -4 untuk inputalih - alih raw_input, +2 untuk parens di cetak, +1 untuk //.

Tidak
sumber
Saya sedih mengatakan bahwa ini lebih rumit dari itu. 01:21 haruslah la una y veintiuno karena jam adalah feminin tetapi menit adalah maskulin.
Peter Taylor
@ PeterTaylor saya mengerti. Apakah uno / una satu-satunya nomor yang terpengaruh?
xnor
Ya, meskipun jika jumlahnya mencapai ratusan akan ada yang lain.
Peter Taylor
@PeterTaylor Tetap, untuk 5 karakter.
xnor
@ edc65 Ups, saya lupa menempelkan perubahan sebenarnya unake uno, harus berfungsi sekarang.
xnor
5

PHP, 351 349 360 - 15 = 345 Bytes

<?$a=split(~ß,~œšßŠ‘ß›Œß‹šŒßœŠž‹ßœ–‘œßŒš–ŒßŒ–š‹šßœ—ß‘Šš‰šß›–š…ß‘œšß›œšß‹šœšßœž‹œšßŽŠ–‘œšß›–šœ–߉š–‘‹–ß‹š–‘‹ž)?><?=preg_filter(~Ð×ÑÔÖÅ×ÑÔÖК,'(($h=($1-($k=$2<31))%12+1)>1?~¬‘ß“žŒß:~ºŒß“žß).$a[$h].($k?~߆ß:~ß’š‘Œß).(($m=$k?$2+0:60-$2)<16?$a[$m]:($m<20?$a[16].$a[$m%10]:($m<21?viente:($m<30?$a[17].$a[$m%10]:$a[18])))).~Ñ',$_GET[0]?:date(~·Å–));

Program ini bukan baris perintah: dibutuhkan input melalui $ _GET [0]. Anda mungkin harus menonaktifkan pemberitahuan di php.ini Anda. Sekarang hadir dengan waktu otomatis tanpa input, terima kasih kepada Niet the Dark Absol.

Trik yang digunakan:

~(...) menghemat satu byte dengan bitwise membalikkan sebuah string, karena Anda tidak perlu tanda kutip karena PHP biasanya mengasumsikan semua ASCII dari 0x80 ke 0xFF adalah sebuah string.

<?=preg_filter(...,...): <?= adalah jalan pintas untuk menulis <? echo. preg_filter()biasanya menerapkan penggantian pada string menggunakan regex, tetapi kita dapat menggunakan modifier disusutkan / e untuk mengevaluasi string yang dihasilkan sebagai kode PHP. Oleh karena itu, alih-alih harus membagi string input menjadi dua variabel terpisah, kita dapat menggunakan referensi-kembali ($ 1 dan $ 2) pada string input yang cocok, menghemat sejumlah besar byte.

Tryth
sumber
2
Anda bisa mengklaim bonus -15 jika Anda gunakan $_GET[0]?:date(~·Å–)untuk mengurangi 3 dari skor Anda.
Niet the Dark Absol
Terima kasih. Saya telah membuat itu dan satu perbaikan kecil lainnya.
Tryth
5

C ++: 474 ... 422 411 byte

Versi ini menebus bonus media / media (-10).

#include<cstdlib>
#include<cstdio>
int main(int u,char**v){char*b[]={"cero","una","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez","once","doce","trece","catorce","cuarto","dieci","veinti","media",0,"veinte"};int h=atoi(v[1]),m=atoi(v[1]+2+(v[1][2]>57)),n=m>30,o;h=n?h%12+1:h;m=o=n?60-m:m;if(u=m>15&m!=20)o=m%10;printf("%s %s %s %s%s",h>1?"Son las":"Es la",b[h],n?"menos":"y",u?b[m/10+15]:"",b[o?o:m]);}

Upaya pertama saya di golf kode! Akan mencoba memperbaikinya akhir pekan ini.

Tidak Disatukan:

#include<cstdlib>
#include<cstdio>
int main(int u,char**v)
{
char*b[]={"cero","una","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez","once","doce","trece","catorce","cuarto","dieci","veinti","media",0,"veinte"};
int h=atoi(v[1]),m=atoi(v[1]+2+(v[1][2]>57)),n=m>30,o;
h=n?h%12+1:h;
m=o=n?60-m:m;
if(u=m>15&m!=20)o=m%10;
printf("%s %s %s %s%s",h>1?"Son las":"Es la",b[h],n?"menos":"y",u?b[m/10+15]:"",b[o?o:m]);
}
BMac
sumber
1
Tidak bisakah Andam%=10
Timtech
Poin bagus! Sayangnya dalam revisi baru saya, saya harus menetapkan nilai itu ke variabel yang berbeda, jadi saya tidak bisa.
BMac
Oke, hanya ingin tahu :)
Timtech
4

Lua, 450 - 10 (cuarto / media) - 15 (manana / tarde) = 425

n={'uno','dos','tres','cuatro','cinco','seis','siete','ocho','nueve','diez','once','doce','trece','catorce','cuarto',[20]='veinte',[30]='media'}for i=1,9 do n[i+10]=n[i+10]or'dieci'..n[i]n[i+20]='veinti'..n[i]end H,M=io.read():match('(%d+):(%d+)')H,M=H+0,M+0 X,Y='tarde',' y 'if H<12 then X='manana'end if M>30 then H,M,Y=H+1,60-M,' menos 'end H=(H-1)%12+1 S=H==1 and'es la una'or'son las '..n[H]if M>0 then S=S..Y..n[M]end S=S..' de la '..X print(S)
  • Turun 12 byte dengan menulis ulang generator untuk 21-29.
  • Turun 1 lebih banyak dengan mengganti H>=12dengan H<12dan mengalihkan ekspresi dependen.
  • Turun 4 lebih dengan mencemari namespace global dari suatu fungsi (jahat, tetapi untuk kepentingan golf :).
  • Memperbaiki regex, saya lupa titik dua. Namun, tidak mengubah jumlah byte.
  • Memperbaiki kasus nol menit, ditukar table.concat untuk operasi string, dan menambahkan saran @ edc65, akhirnya menambahkan 22 byte.
  • Saya malu. Menarik functiontubuh keluar ke bongkahan utama mengurangi panjangnya dengan 15 byte kekalahan .
criptych berdiri bersama Monica
sumber
Harus menggunakan 'una' selama berjam-jam, 'uno' selama beberapa menit. Jadi '01: 01 'harus memberiEs la una y uno
edc65
3

D - 484 byte

import std.stdio,std.conv,std.string;void main(){auto n="cero una dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce quince dieciséis diecisiete dieciocho diecinueve e iuno idos itres icuatro icinco iseis isiete iocho inueve treinta".split;auto p=stdin.readln()[0..$-1];int b=to!int(p[0..$-3]),a=to!int(p[$-2..$]);auto c=a;b=a>30?b+1:b;b%=12;a=a>30?60-a:a;writefln("%s %s %s %s", b==1||b==12?"Es la":"Son las",n[b],c>30?"menos":"y",(a/10==2?"vient":"")~n[a]);}
Hackerpilot
sumber
Harus menggunakan 'una' selama berjam-jam, 'uno' selama beberapa menit. Jadi '01: 01 'harus memberiEs la una y uno
edc65
3

Python 3, 409 byte

d='cero uno dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce quince dieciseis diecisiete dieciocho diecinueve veinte xuno xdos xtres xcuatro xcinco xseis xsiete xocho xnueve treinta';d=str(d.replace('x','veinti')).split();t=input().split(':');i=int(t[1]);j=int(t[0]);print(["Son las","Es la"][1<(2*j+i/30)%24<=3],[d[[j%12+1,j][i<31]],'una'][j==1],'y'if i<31 else'menos',d[min(i,60-i)])
Hosch250
sumber
Daftar panjang string dapat dipersingkat seperti'string1 string2 string3'.split()
xnor
@ xnor Baiklah, terima kasih!
Hosch250
@ hosch250 Juga, pastikan Anda mengikuti komentar di posting asli lagi. Saya mungkin akan membuat banyak perubahan peraturan kecil, dan ini mungkin akan membantu Anda bermain golf.
mdc32
@ mdc32 Menyesuaikan sekarang. Saya punya beberapa kesalahan.
Hosch250
2
Anda dapat mempersingkat d[j]if i<31 else d[(j+1)%12]menjadi d[(j+(i>30))%12]. Secara umum, jika dua alternatif Anda memiliki struktur yang sama, Anda sering dapat membuat ekspresi sederhana yang sama dengan masing-masing tergantung pada Boolean.
xnor
3

Ruby, 313 (338 - 15 - 10)

Solusi ini menerjemahkan waktu saat ini ketika tidak ada input yang diberikan dan menambahkan tiga frasa "y cuarto", "y media" dan "menos cuarto".

require'time'
t,x,s=Time,$*[0],%w[cero una dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce cuarto]
1.upto(9){|i|i>5?s[10+i]="dieci"+s[i]:0;s[20+i]="veinti"+s[i]}
s[20]="veinte"
s<<"media"
c=x ?t.parse(x):t.new
h,m=c.hour%12,c.min
m<31?(a=" y "):(h,m,a=h+1,60-m," menos ")
$><<(h<2?"Es la ":"Son las ")+s[h]+a+s[m]
britishtea
sumber
Apakah itu bekerja? Dicoba di ideone, masukan '01: 01 ', waktu sekarang 20:09, keluaran:Son las ocho y diecioch
edc65
Semua test case diterima untuk saya secara lokal. Saya melihat ada yang salah dengan menyalin nomor, jadi saya akan memperbaikinya.
britishtea
1
"seite" harus "siete" dan "neuve" harus "nueve"
jmm
2

Bash 423

(433 - 10 = 423, menghilangkan diakritik dan cuarto kita bisa turun ke 381)

IFS=: read h m
s=y
m=${m#0}
[ $m -gt 30 ]&&h=$(($h+1))&&s=menos
[ -z ${m%0} ]&&s=en&&m=punto
n[0]=0
o[0]=0
S=" séis siete ocho nueve"
n=(punto una dos trés cuatro cinco $S diez {on,do,tre,cator,quin}ce ${S// / dieci} veinte)
n=($(eval echo "${n[@]}" veinti\$\{n[{1..9}]\}))
n[3]=tres;n[6]=seis
n=(${n[@]} media\  $(tac -s' '<<<${n[@]}))
o=("${n[@]/q*/cuarto}")
a=Son\ las
[ $h = 1 ]&&a=Es\ la
echo $a ${n[$h]/p*/cero} $s ${o[$m]/%a/o}
Malaikat
sumber
Sudah menggunakan 'una' selama berjam-jam dan 'uno' selama beberapa menit. Lihat lebih hati-hati :)
Ángel
Maaf, sekilas tidak jelas dan bash sulit untuk diuji di windows. +1 lalu.
edc65
@ edc66, ordinasinya dalam format femenine, lalu $ {o [$ m] /% a / o} menggantikan trailing a dengan menit untuk menit.
Ángel
2

Perl - 297 - 10 + 1 = 288 (menghitung pbenderanya)

Sunting: terima kasih kepada @guifa, sekarang saya dapat mengklaim bonus :)

#!/usr/bin/perl -p
sub n{($_=shift)%10?(once,doce,trece,catorce,cuarto)[$_>9?$_-11:5]||('',dieci,veinti)[$_/10].(0,un.pop,dos,tres,cuatro,cinco,seis,siete,ocho,nueve)[$_%10]:(cero,diez,veinte,media)[$_/10]}/:/;$a=$`%12;$b=$';$c=$b>30?(++$a,$b=60-$b,menos):'y';$_=($a-1?'Son las ':'Es la ').n($a,a)." $c ".n($b,o).'.'

Berikut adalah kode yang sama dalam beberapa baris untuk keterbacaan:

sub n {
        ($_ = shift) % 10
            ? (once, doce, trece, catorce, cuarto)[$_ > 9 ? $_ -11 : 5]
                || ('', dieci, veinti)[$_ / 10]
                . (0, un.pop, dos, tres, cuatro, cinco, seis, siete, ocho, nueve)[$_ % 10]
            : (cero, diez, veinte, media)[$_ / 10]
}
/:/;
$a = $` % 12;
$b = $';
$c = $b > 30 ? (++$a, $b = 60 - $b, menos) : 'y';
$_ = ($a - 1 ? 'Son las ' : 'Es la ') . n($a, a) . " $c " . n($b, o) . '.'
core1024
sumber
Harus menggunakan 'una' selama berjam-jam, 'uno' selama beberapa menit. Jadi '01: 01 '- harus memberikanEs la una y uno
edc65
Jika Anda hanya mengubah "quince" menjadi "cuarto" dan "treinta" menjadi "media", Anda akan mendapatkan bonus -10.
user0721090601
@ edc65 Saya harap tidak apa-apa sekarang ...
core1024
0

Scala 652 byte - 25

import java.util.Scanner
object S extends App{val s=new Scanner(System.in).useDelimiter("[:\n]")
var h=s.nextInt
var m=s.nextInt
if(m>30)m-=60 else h-=1
val n=m.abs
h%=24
val p=h%12
val l=List("una","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez","once","doce","trece","catorce","cuarto")
val k=List("úno","dós","trés",l(3),l(4),"séis",l(6),"ócho",l(8))
println(s"""${if(p==0)"Es la"else"Son las"} ${l(p)} ${if(m>0)"y "else if(m<0)"menos "}${if(n==1)"uno"else if(n==0)""else if(n<=15)l(n-1) else if(n==30)"media"else if(n<20)"dieci"+k(n-11)else if(n==20)"veinte"else"veinti"+k(n-21)} de la ${if(h<12)"mañana"else"tarde"}.""")}
bb94
sumber
0

Pyth : 277 a bunch lebih 234 - 10 (cuarto / bonus media) = 224 byte

Sekarang dikurangi lebih dari 50 byte dari aslinya!

=H" y "ANkmsdcz\:Kc"cero uno dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce cuarto veinte"dI>k30=k-60k=H" menos "=N?1qN12+N1)++?+"Son las "@KN>N1"Es la una"H??eKqk20?@Kk<k16+?"dieci"<k21+PeK\i@K%kT<k30"media"

Sangat menginginkan Pyth, tapi itu karena ada beberapa data mentah. Mungkin bisa bermain golf lebih jauh. Menggunakan teknik pemisahan tugas yang jelas menjadi beberapa jam, y / meno, puluhan digit menit, dan satu digit menit dan kemudian menerjemahkan angka menggunakan array terjemahan dan yang lainnya menggunakan omong kosong terner.

=H" y "                 Set H to " y "
A                       Double Assignment
 Nk                     The variables N and k (hours and mins)
 m  cz\:                Map input split by ":"
  sd                    Make both int
Kc"..."d                Set K to string split by spaces
I>k30                   If k>30
     =k-60k             Set k to 60-k
     =H" menos "        Set k to menos instead of y
     =N                 Set N
      ?   qN12          If N=12
       1                Go back to one
       +N1              Increment N
)                       Close entire if block 
+                       Concat of hours and minutes
 +                      Concat hours and y/menos
  ?           >N1       If hour greater than one
   +                    Concat of son las and hour
    "Son las "          "Son las "
    @KN                 Index translation array for hour
   "Es la una"          Else es la una
  H                     " y " or " menos "
 ?               <k30   If minutes less than 30
  ?  qk20               If minutes is 20
   ek                   Last element of array (veinte)
   ?   <k16             Else check if minutes<16
    @Kk                 Get minutes directly from array
    +                   Else tens and ones sum
     ?       <k21       If minutes<21
      "dieci"           "dieci"
      +PeK\i            Else get veinti from veinte
     @K%kT              Ones digit of minutes
  "media"               Else get "media"

Sejarah Golf

  • 10 byte - bonus, quince dan trienta hanya dapat diganti dalam array terjemahan sehingga tidak ada perubahan yang diperlukan kecuali esai terjemahan dan ukurannya yang sama.
  • 6 byte - terner terorganisir - sayangnya ini menghapus 4 operator ternary berturut-turut :(
  • 6 byte - berbagai golf lainnya
  • 6 byte - ditugaskan pada jam / menit awal golf
  • +3 bytes - diperbaiki uno / una
  • 3 byte - veinti dibangun dari veinte, bukan hardcoded
  • 18 byte - dieci diekstraksi dari remaja <16
  • 2 byte - menghapus beberapa spasi di sana tanpa alasan
  • 2 byte - digunakan \ untuk satu string char
Maltysen
sumber
Untuk string 1 karakter, seperti ":"dan "i", gunakan \:dan \isebagai gantinya.
isaacg
@isaacg oh keren saya tidak tahu Anda bisa melakukan itu, memperbarui
Maltysen