Đó là giờ Tây Ban Nha!


24

Tôi có một nhiệm vụ đơn giản nên tương đối dễ thực hiện bằng mã. Mục tiêu của bạn là viết một chương trình sẽ xuất ra thời gian viết bằng tiếng Tây Ban Nha, với thời gian ở định dạng HH: MM. Nhiều người có thể không biết làm thế nào để làm điều này, vì vậy tôi sẽ giải thích.

Thời gian trong tiếng Tây Ban Nha khá logic. Nó thường theo mô hình "Es la / Son las (giờ) y (phút)." Giờ ở định dạng 12 giờ và "Es la" chỉ được sử dụng nếu giờ là 1 (tức là một giờ). Những phút là một câu chuyện khác nhau. Nếu phút nhỏ hơn 30, thì nó được biểu diễn như hình trên. Tuy nhiên, nếu phút trên 30, thì giờ được làm tròn và phút bị trừ. Ví dụ: 7:35 được dịch thành tương đương với "8 giờ trừ 25 phút". Một số ví dụ khác sẽ được đưa ra dưới đây. Danh sách các số Tây Ban Nha cần thiết có thể được tìm thấy ở đây . Có những điểm nhấn trên một số con số, nhưng những điều này là không cần thiết.

Lưu ý: Nguồn nói "uno", nhưng để được chính xác về mặt ngữ pháp thì nó phải là "una." Điều này không ảnh hưởng đến bất kỳ câu trả lời cho đến nay.

Lưu ý 2: Ngoài ra, "cero" là không cần thiết. Nếu chương trình của bạn xuất ra "Es la una" hoặc "Son las tres", điều đó tốt với tôi. Xin lỗi vì những thay đổi quy tắc này.

Quy tắc

  • Đầu vào sẽ được cung cấp thông qua STDIN hoặc tương đương trong ngôn ngữ của bạn.
  • Không đọc từ các thư viện bên ngoài.
  • Mã của bạn có thể làm bất cứ điều gì với đầu vào không hợp lệ.

Tiền thưởng

  • -10 nếu mã của bạn thêm các cụm từ bổ sung này - "y cuarto" cho: 15, "y media" cho: 30 và "menos cuarto" cho: 45 (làm tròn lên).
  • -15 nếu mã của bạn có thể xử lý AM và PM, trả lời bằng "de la mañana" và "de la tarde", theo đó.
  • -15 nếu mã của bạn có thể dịch thời gian hiện tại nếu không có đầu vào nào được cung cấp.

Chấm điểm

  • Đây là một thử thách golf-code, và nó sẽ được ghi bằng byte, không phải ký tự.

Ví dụ

Đầu vào: 8:10 Đầu ra:Son las ocho y diez.

Đầu vào: 6:45 Đầu ra:Son las siete menos quince (or cuarto).

Đầu vào: 1:29 Đầu ra:Es la una y veintinueve.

Đầu vào: 12:55 Đầu ra:Es la una menos cinco.

Hãy cho tôi biết nếu có bất cứ điều gì để chỉ định ở đây. Đây là câu hỏi đầu tiên của tôi, vì vậy nó chắc chắn không hoàn hảo.


Để biết thông tin của bạn, bạn có thể nhận phản hồi trước khi đăng tại hộp cát .
Kéo dài Maniac

1
@Sparr Tôi nghi ngờ điều đó. Có lẽ có đủ số lượng phải được mã hóa cứng để điều này xảy ra - giá trị ít nhất 45 ký tự, thậm chí chiếm cả các mẫu.
mdc32

1
@Dennis Hmm ... Tôi đoán một trong hai sẽ ổn thôi. Es la una y cerolà khá lặp đi lặp lại, vì vậy tôi thấy quan điểm của bạn. Tôi đã không chỉ định điều này, vì vậy tôi đoán một trong hai sẽ ổn thôi. Cảm ơn vì bạn đã phản hồi.
mdc32

1
Bạn nên thêm 01:21vào như một trường hợp thử nghiệm, bởi vì ít nhất một người trả lời đã bị nhầm lẫn bởi những gì bạn nói về una vs uno .
Peter Taylor

3
Phần thưởng thứ hai là (gần như?) Không bao giờ có giá trị vì các cụm từ "de la", "manana" và "tarde" đã đếm đến 16 byte.
Anh

Câu trả lời:


9

JavaScript (ES6) 308 316

Sửa lỗi sửa lỗi2 Chỉnh sửa quên yêu cầu nhận tiền thưởng
Là chương trình có I / O qua cửa sổ bật lên

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):''))

Là một chức năng có thể kiểm tra

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):'')
)

Kiểm tra trong bảng điều khiển 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)))
}

Đầu ra

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

8

Vâng, ngôn ngữ ít được mong đợi nhất sẽ xuất hiện trong một cuộc thi golf, được mã hóa bởi tay golf tệ nhất thế giới, đã trở lại!

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

Chơi gôn

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

Ung dung:

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

Giao dịch với quartomedia, với AM / PM và không có đầu vào. Vì vậy, tôi có thể yêu cầu tất cả các phần thưởng, mặc dù điều đó, nếu tôi không thực hiện các tính năng đó, tôi sẽ có điểm thấp hơn, lol. khẩu trang


6

Python 3: 294 ký tự - 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]+".")

Điều này nhận được phần thưởng mười điểm khi sử dụng "cuarto" và "media"

Chúng tôi đọc giờ và phút như ints. Nếu số phút trên 30, chúng tôi chuyển sang giờ tiếp theo, đo số phút cách xa 60 và thay đổi kết hợp thành "menos".

Danh sách này dcó bản dịch của số Tây Ban Nha lên đến 15. Chúng tôi làm d[0]được ''để ngăn chặn những thứ như "diecicero". Điều này được thực hiện bằng cách gọi lúng túng split(' ')với một không gian ban đầu; thông thường splitsẽ bỏ qua nó. Các trường hợp không phút được xử lý sau.

Để có được các số trên 15, chúng tôi kết hợp chuỗi hàng chục chữ số với chuỗi một chữ số thích hợp. 1530được viết là "phương tiện truyền thông" và "cuarto" miễn phí.

Python 3 lưu một mạng char trên Python 2: -4 inputthay vì raw_input, +2 cho parens in, +1 cho //.


Tôi buồn khi nói rằng nó phức tạp hơn thế. 01:21 nên là la una y veintiuno vì giờ là nữ tính nhưng phút là nam tính.
Peter Taylor

@PeterTaylor Tôi thấy. Là uno / una là số duy nhất bị ảnh hưởng?
xnor

Vâng, mặc dù nếu nó tăng lên con số trong hàng trăm thì sẽ có những người khác.
Peter Taylor

@PeterTaylor Đã sửa, cho 5 ký tự.
xnor

@ edc65 Rất tiếc, tôi quên dán vào sự thay đổi thực tế của unađể uno, nên làm việc ngay bây giờ.
xnor

5

PHP, 351 349 360 - 15 = 345 byte

<?$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(~·Å–));

Chương trình này không phải là dòng lệnh: nó nhận đầu vào thông qua $ _GET [0]. Bạn có thể phải tắt thông báo trong php.ini của mình. Bây giờ đi kèm với thời gian tự động không có đầu vào, nhờ Niet the Dark Absol.

Thủ thuật được sử dụng:

~(...) lưu một byte bằng cách đảo ngược một chuỗi, vì bạn không cần dấu ngoặc kép vì PHP thường giả sử tất cả ASCII từ 0x80 đến 0xFF là một chuỗi.

<?=preg_filter(...,...): Đây <?=là một phím tắt để viết<? echo . preg_filter()thường áp dụng thay thế trên một chuỗi bằng regex, nhưng chúng ta có thể sử dụng công cụ sửa đổi khấu hao / e để đánh giá chuỗi kết quả dưới dạng mã PHP. Do đó, thay vì phải chia chuỗi đầu vào thành hai biến riêng biệt, chúng ta có thể sử dụng phản hồi ($ 1 và $ 2) trên chuỗi đầu vào phù hợp, tiết kiệm số lượng lớn byte.


2
Bạn có thể yêu cầu phần thưởng -15 nếu bạn sử dụng $_GET[0]?:date(~·Å–)để trừ 3 từ điểm số của bạn.
Niet the Dark Tuyệt đối

Cảm ơn. Tôi đã thực hiện điều đó và một cải tiến nhỏ khác.
Thử

5

C ++: 474 ... 422 411 byte

Phiên bản này đang đổi phần thưởng cuarto / 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]);}

Nỗ lực đầu tiên của tôi từng chơi golf mã! Sẽ cố gắng cải thiện nó vào cuối tuần này.

Ung dung:

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

1
Bạn không thểm%=10
Timtech

Điểm tốt! Thật không may trong phiên bản mới của tôi, tôi phải gán giá trị đó cho một biến khác, vì vậy tôi không thể.
BMac

Ok, chỉ cần tự hỏi :)
Timtech

4

Lua, 450 - 10 (cuarto / phương tiện truyền thông) - 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)
  • Giảm 12 byte bằng cách viết lại trình tạo trong 21-29.
  • Giảm thêm 1 bằng cách thay thế H>=12bằng H<12và chuyển đổi biểu thức phụ thuộc xung quanh.
  • Giảm thêm 4 người nữa bằng cách làm ô nhiễm không gian tên toàn cầu từ một chức năng (xấu xa, nhưng vì lợi ích của việc chơi golf :).
  • Đã sửa regex, tôi quên dấu hai chấm. Tuy nhiên, không thay đổi số byte.
  • Đã sửa trường hợp 0 ​​phút, tráo đổi table.concat các chuỗi op và thêm đề xuất của @ edc65, cuối cùng thêm 22 byte.
  • Tôi xấu hổ. Kéo phần functionthân ra vào phần chính đã giảm 15 phần trăm .

Nên sử dụng 'una' trong nhiều giờ, 'uno' trong vài phút. Vì vậy, '01: 01 'nên cung cấpEs 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]);}

Nên sử dụng 'una' trong nhiều giờ, 'uno' trong vài phút. Vì vậy, '01: 01 'nên cung cấpEs 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)])

Một danh sách dài các chuỗi có thể được rút ngắn như'string1 string2 string3'.split()
xnor

@xnor Được rồi, cảm ơn!
Hosch250

@ hosch250 Ngoài ra, hãy đảm bảo bạn đang theo dõi các bình luận trong bài viết gốc. Tôi có thể sẽ thực hiện nhiều thay đổi quy tắc nhỏ, và những điều này có thể sẽ giúp bạn chơi gôn.
mdc32

@ mdc32 Điều chỉnh ngay bây giờ. Tôi đã có một số lỗi dù sao.
Hosch250

2
Bạn có thể rút ngắn d[j]if i<31 else d[(j+1)%12]để d[(j+(i>30))%12]. Nói chung, nếu hai lựa chọn thay thế của bạn có cấu trúc tương tự nhau, bạn thường có thể tạo một biểu thức đơn giản bằng với từng biểu thức tương ứng tùy thuộc vào Boolean.
xnor

3

Ruby, 313 (338 - 15 - 10)

Giải pháp này dịch thời gian hiện tại khi không có đầu vào nào được đưa ra và thêm ba cụm từ "y cuarto", "y media" và "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]

Nó có hoạt động không? Đã thử trong ideone, đầu vào '01: 01 ', thời gian hiện tại 20:09, đầu ra:Son las ocho y diecioch
edc65

Tất cả các trường hợp thử nghiệm thông qua cho tôi tại địa phương. Tôi thấy có gì đó không ổn khi sao chép các con số, vì vậy tôi sẽ sửa nó.
Anh

1
"seite" nên là "siete" và "neuve" nên là "nueve"
jmm

2

Bash 423

(433 - 10 = 423, loại bỏ dấu phụ và cuarto, chúng tôi có thể giảm xuống còn 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}

Nó đã sử dụng 'una' trong nhiều giờ và 'uno' trong vài phút. Nhìn kỹ hơn :)
Ángel

Xin lỗi, nó không rõ ràng trong nháy mắt và bash rất khó kiểm tra trong các cửa sổ. +1 rồi.
edc65

@ edc66, các mệnh lệnh nằm trong femenine, sau đó $ {o [$ m] /% a / o} thay thế dấu a bằng o trong vài phút.
Ángel

2

Perl - 297 - 10 + 1 = 288 (đếm pcờ)

Chỉnh sửa: nhờ @guifa, giờ tôi có thể nhận tiền thưởng :)

#!/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).'.'

Đây là cùng một mã trong nhiều dòng để dễ đọc:

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

Nên sử dụng 'una' trong nhiều giờ, 'uno' trong vài phút. Vì vậy, '01: 01 '- nên choEs la una y uno
edc65

Nếu bạn chỉ đổi "quince" thành "cuarto" và "treinta" thành "media", bạn sẽ nhận được phần thưởng -10.
user0721090601

@ edc65 Tôi hy vọng nó ổn ngay bây giờ ...
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"}.""")}

0

Kim tự tháp : 277 một bó nữa 234 - 10 (phần thưởng cuarto / phương tiện truyền thông) = 224 byte

Bây giờ giảm hơn 50 byte so với ban đầu!

=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"

Rất lâu cho Pyth nhưng đó là vì có một số dữ liệu thô. Có lẽ có thể được chơi golf hơn nữa. Sử dụng kỹ thuật phân chia nhiệm vụ rõ ràng thành giờ, y / menos, hàng chục chữ số phút và một chữ số phút và sau đó dịch các số bằng mảng dịch và mọi thứ khác bằng cách sử dụng một ternary ternaries.

=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"

Lịch sử chơi gôn

  • 10 byte - phần thưởng, quince và trienta chỉ có thể được thay thế trong mảng dịch để không cần thay đổi ngoại trừ bài luận dịch và cùng kích thước của nó.
  • 6 byte - các ternary được tổ chức lại - thật không may, điều này đã loại bỏ 4 toán tử ternary liên tiếp :(
  • 6 byte - chơi golf khác nhau
  • 6 byte - gán giờ / phút ban đầu được đánh gôn
  • +3 byte - cố định uno / una
  • 3 byte - veinti được xây dựng từ veinte, không được mã hóa cứng
  • 18 byte - trích xuất dieci từ thanh thiếu niên <16
  • 2 byte - đã xóa một số khoảng trắng trong đó mà không có lý do
  • 2 byte - được sử dụng \ cho một chuỗi char

Đối với chuỗi 1 ký tự, chẳng hạn như ":""i", sử dụng\:\ithay vào đó.
isaacg

@isaacg oh tuyệt vời Tôi không biết bạn có thể làm điều đó, cập nhật
Maltysen
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.