ถึงเวลาของสเปนแล้ว!


24

ฉันมีงานง่าย ๆ ที่ควรใช้งานได้ง่ายโดยใช้รหัส เป้าหมายของคุณคือการเขียนโปรแกรมที่จะส่งออกเวลาที่เขียนในภาษาสเปนให้เวลาในรูปแบบ HH: MM หลายคนคงไม่รู้ว่าจะทำอย่างไรดังนั้นฉันจะทำอย่างละเอียด

เวลาในสเปนค่อนข้างสมเหตุสมผล มันมักจะตามรูปแบบของ "Es la / Son las (ชั่วโมง) y (นาที)" ชั่วโมงอยู่ในรูปแบบ 12 ชั่วโมงและ "Es la" จะใช้เฉพาะในกรณีที่ชั่วโมงคือ 1 (เช่นหนึ่งนาฬิกา) นาทีเป็นเรื่องราวที่แตกต่าง หากนาทีน้อยกว่า 30 แสดงว่าเป็นนาทีดังที่แสดงไว้ด้านบน อย่างไรก็ตามถ้านาทีมากกว่า 30 แสดงว่าชั่วโมงนั้นถูกปัดขึ้นและนาทีจะถูกลบออก ตัวอย่างเช่น 7:35 แปลเป็น "8 ชั่วโมงลบ 25 นาที" ตัวอย่างเพิ่มเติมจะได้รับด้านล่าง รายการหมายเลขสเปนที่มีความจำเป็นที่สามารถพบได้ที่นี่ มีสำเนียงอยู่บ้าง แต่ก็ไม่จำเป็น

หมายเหตุ:แหล่งข้อมูลบอกว่า "uno" แต่เพื่อให้ถูกต้องตามหลักไวยากรณ์ควรเป็น "una" สิ่งนี้จะไม่ส่งผลกระทบต่อคำตอบใด ๆ

หมายเหตุ 2:นอกจากนี้ "cero" ก็ไม่จำเป็นเช่นกัน หากโปรแกรมของคุณแสดงผล "Es la una" หรือ "Son las tres" นั่นก็ใช้ได้กับฉัน ขออภัยสำหรับการเปลี่ยนแปลงกฎเหล่านี้

กฎระเบียบ

  • การป้อนข้อมูลจะได้รับผ่าน STDIN หรือเทียบเท่าในภาษาของคุณ
  • ไม่มีการอ่านจากห้องสมุดภายนอก
  • รหัสของคุณสามารถทำอะไรก็ได้ด้วยการป้อนข้อมูลที่ไม่ถูกต้อง

โบนัส

  • -10 หากรหัสของคุณเพิ่มวลีพิเศษเหล่านี้ - "y cuarto" สำหรับ: 15, "y media" สำหรับ: 30 และ "menos cuarto" สำหรับ: 45 (ปัดเศษขึ้น)
  • -15 หากรหัสของคุณสามารถจัดการกับ AM และ PM ได้โดยตอบกลับด้วย "de la mañana" และ "de la tarde"
  • -15 ถ้ารหัสของคุณสามารถแปลเวลาปัจจุบันหากไม่มีการป้อนข้อมูลให้

เกณฑ์การให้คะแนน

  • นี่เป็นความท้าทายของรหัส - กอล์ฟและจะได้คะแนนเป็นไบต์ไม่ใช่ตัวอักษร

ตัวอย่าง

อินพุต: 8:10 เอาต์พุต:Son las ocho y diez.

อินพุต: 6:45 เอาต์พุต:Son las siete menos quince (or cuarto).

อินพุต: 1:29 เอาต์พุต:Es la una y veintinueve.

อินพุต: 12:55 เอาต์พุต:Es la una menos cinco.

แจ้งให้เราทราบหากมีสิ่งใดระบุที่นี่ นี่เป็นคำถามแรกของฉันดังนั้นมันจึงไม่สมบูรณ์แบบแน่นอน


สำหรับข้อมูลของคุณคุณจะได้รับข้อเสนอแนะก่อนที่คุณโพสต์ที่Sandbox
ยืด Maniac

1
@ Sparr ฉันสงสัยมัน อาจมีตัวเลขมากพอที่จะต้องฮาร์ดโค้ดเพื่อให้เกิดสิ่งนี้ - อย่างน้อย 45 ตัวอักษรมีค่าแม้แต่การบัญชีสำหรับรูปแบบ
mdc32

1
@ เดนนิสอืม ... ฉันเดาว่าทั้งคู่ก็คงสบายดี Es la una y ceroค่อนข้างซ้ำซากดังนั้นฉันเห็นประเด็นของคุณ ฉันไม่ได้ระบุสิ่งนี้ดังนั้นฉันเดาว่าอย่างใดอย่างหนึ่งจะดี ขอบคุณสำหรับความคิดเห็น.
mdc32

1
คุณควรเพิ่ม01:21เป็นกรณีทดสอบเพราะอย่างน้อยหนึ่งตอบสับสนโดยสิ่งที่คุณกล่าวเกี่ยวกับอูนา VS uno
ปีเตอร์เทย์เลอร์

3
โบนัสที่สองคือ (เกือบ) ไม่เคยคุ้มค่าเพราะวลี "de la", "manana" และ "tarde" เพียงอย่างเดียวนับได้ถึง 16 ไบต์แล้ว
britishtea

คำตอบ:


9

JavaScript (ES6) 308 316

แก้ไขข้อผิดพลาด Edit2 แก้ไขลืมที่จะรับโบนัส
ในฐานะโปรแกรมที่มี I / O ผ่านป๊อปอัพ

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

เป็นฟังก์ชั่นที่ทดสอบได้

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

ทดสอบในคอนโซล 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)))
}

เอาท์พุต

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

ใช่ภาษาที่คาดหวังน้อยที่สุดที่จะปรากฏในการแข่งขันกอล์ฟเขียนโดยนักกอล์ฟที่แย่ที่สุดในโลกกลับมาแล้ว!

Java - 676 ​​ไบต์ (716-10-15-15)

แข็งแรงเล่นกอล์ฟ:

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

Ungolfed:

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

ข้อตกลงกับquartoและmediaกับ AM / PM และไม่มีการป้อนข้อมูล ดังนั้นฉันสามารถรับโบนัสทั้งหมดได้แม้ว่านั้นถ้าฉันไม่ได้ใช้คุณสมบัติเหล่านั้นฉันก็จะได้คะแนนที่ต่ำกว่าฮ่า ๆ facepalms


6

Python 3: 294 ตัวอักษร - 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]+".")

สิ่งนี้จะได้รับโบนัสสิบจุดสำหรับการใช้ "cuarto" และ "media"

เราอ่านชั่วโมงและนาทีเป็นints หากนาทีสูงกว่า 30 เราจะเลื่อนไปที่ชั่วโมงถัดไปวัดนาทีจาก 60 และเปลี่ยนการรวมเป็น "menos"

รายการdนี้มีการแปลตัวเลขภาษาสเปนไม่เกิน 15 รายการเราd[0]ใช้''เพื่อป้องกันสิ่งต่าง ๆ เช่น "diecicero" สิ่งนี้ทำได้โดยการเรียกอย่างเชื่องช้าsplit(' ')พร้อมช่องว่างเริ่มต้น ปกติsplitจะไม่สนใจมัน กรณีนาทีศูนย์ได้รับการจัดการในภายหลัง

ในการรับตัวเลขที่สูงกว่า 15 เราจะรวมสตริงหลักสิบหลักกับสตริงหนึ่งหลักที่เหมาะสม 15และ30เขียนเป็น "media" และ "cuarto" โดยไม่มีค่าใช้จ่าย

งูหลาม 3 ช่วยประหยัดสุทธิถ่านมากกว่าหนึ่งงูหลาม 2: -4 สำหรับinputแทนraw_input, 2 สำหรับ parens ในการพิมพ์ +1 //สำหรับ


ฉันเสียใจที่จะบอกว่ามันซับซ้อนกว่านั้น 01:21 ควรเป็นla una y veintiunoเพราะเวลาเป็นผู้หญิง แต่นาทีเป็นผู้ชาย
Peter Taylor

@ PeterTaylor ฉันเห็น uno / una ส่งผลกระทบต่อจำนวนเท่านั้นหรือไม่
xnor

ใช่แม้ว่ามันจะสูงถึงตัวเลขเป็นร้อย
Peter Taylor

@PeterTaylor แก้ไข 5 ตัวอักษร
xnor

@ edc65 อ๊ะฉันลืมที่จะวางในการเปลี่ยนแปลงที่เกิดขึ้นจริงของunaการunoควรจะทำงานในขณะนี้
xnor

5

PHP, 351 349 360 - 15 = 345 ไบต์

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

โปรแกรมนี้ไม่ได้เป็นบรรทัดคำสั่ง: มันต้องป้อนข้อมูลผ่านทาง $ _GET [0] คุณอาจต้องปิดการใช้งานการแจ้งเตือนใน php.ini ของคุณ ตอนนี้มาพร้อมกับเวลาอัตโนมัติโดยไม่ต้องป้อนข้อมูลด้วย Niet the Dark Absolute

เทคนิคที่ใช้:

~(...) บันทึกหนึ่งไบต์โดย bitwise inverting สตริงในขณะที่คุณไม่จำเป็นต้องมีเครื่องหมายคำพูดเพราะ PHP มักจะสมมติว่า ASCII ทั้งหมดจาก 0x80 ถึง 0xFF เป็นสตริง

<?=preg_filter(...,...)การเป็นทางลัดในการเขียน<?= โดยปกติจะใช้การแทนที่บนสตริงโดยใช้ regex แต่เราสามารถใช้ตัวปรับค่าเสื่อมราคา / e เพื่อประเมินสตริงผลลัพธ์เป็นโค้ด PHP ดังนั้นแทนที่จะต้องแยกสตริงอินพุตออกเป็นสองตัวแปรแยกกันเราสามารถใช้การอ้างอิงย้อนกลับ ($ 1 และ $ 2) บนสตริงอินพุตที่ตรงกันเพื่อประหยัดไบต์จำนวนมาก<? echopreg_filter()


2
คุณสามารถรับโบนัส -15 ได้หากคุณใช้$_GET[0]?:date(~·Å–)เพื่อลบ 3 จากคะแนนของคุณ
Niet the Dark Absolute

ขอบคุณ ฉันได้ทำสิ่งนั้นและปรับปรุงอีกเล็กน้อย
Tryth

5

C ++: 474 ... 422 411 ไบต์

รุ่นนี้แลกของรางวัล 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]);}

ความพยายามครั้งแรกของฉันที่การตีกอล์ฟ! จะพยายามปรับปรุงให้สุดสัปดาห์นี้

Ungolfed:

#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
ไม่สามารถคุณm%=10
Timtech

จุดดี! น่าเสียดายที่การแก้ไขใหม่ของฉันฉันต้องกำหนดค่าให้กับตัวแปรที่แตกต่างกันดังนั้นฉันจึงไม่สามารถ
BMac

ตกลงเพียงแค่สงสัย :)
Timtech

4

Lua, 450 - 10 (cuarto / สื่อ) - 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)
  • ลดขนาด 12 ไบต์โดยเขียนตัวสร้างใหม่สำหรับ 21-29
  • ลดลง 1 อีกโดยแทนที่H>=12ด้วยH<12และสลับนิพจน์ที่อยู่รอบ ๆ
  • ลดลง 4 อีกโดยทำให้เนมสเปซส่วนกลางจากฟังก์ชั่น (ความชั่วร้าย แต่เพื่อผลประโยชน์ของการเล่นกอล์ฟ :)
  • แก้ไข regex ฉันลืมเครื่องหมายจุดคู่ ไม่เปลี่ยนจำนวนไบต์อย่างไรก็ตาม
  • แก้ไขกรณีเป็นศูนย์นาทีเปลี่ยนtable.concatเป็นสตริง ops และเพิ่มคำแนะนำของ @ edc65 ในที่สุดก็เพิ่ม 22 ไบต์
  • ฉันละอายใจ ดึงfunctionร่างกายออกไปในก้อนหลักลดความยาวโดยมหันต์15 ไบต์

ควรใช้ 'una' เป็นชั่วโมง 'uno' เป็นนาที ดังนั้น '01: 01 'ควรให้Es la una y uno
edc65

3

D - 484 ไบต์

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

ควรใช้ 'una' เป็นชั่วโมง 'uno' เป็นนาที ดังนั้น '01: 01 'ควรให้Es la una y uno
edc65

3

Python 3, 409 ไบต์

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)])

รายการของสตริงที่สั้นสามารถย่อให้สั้นลงได้เช่น'string1 string2 string3'.split()
xnor

@xnor เอาล่ะขอบคุณ!
Hosch250

@ hosch250 และให้แน่ใจว่าคุณได้ติดตามความคิดเห็นในโพสต์ต้นฉบับอีกครั้ง ฉันอาจจะทำการเปลี่ยนแปลงกฎเล็กน้อยมากมายและสิ่งเหล่านี้อาจช่วยให้คุณเล่นกอล์ฟได้
mdc32

@ mdc32 ปรับตอนนี้ ฉันมีข้อผิดพลาดอยู่แล้ว
Hosch250

2
คุณสามารถร่นไปd[j]if i<31 else d[(j+1)%12] d[(j+(i>30))%12]โดยทั่วไปหากทางเลือกสองทางของคุณมีโครงสร้างที่คล้ายกันคุณสามารถสร้างนิพจน์อย่างง่าย ๆ ที่เท่ากับแต่ละอันขึ้นอยู่กับบูลีน
xnor

3

Ruby, 313 (338 - 15 - 10)

วิธีการแก้ปัญหานี้แปลเวลาปัจจุบันเมื่อไม่มีการป้อนข้อมูลและเพิ่มสามวลี "y cuarto", "y media" และ "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]

ใช้งานได้หรือไม่ พยายามใน ideone ป้อน '01: 01 ', เวลาปัจจุบัน 20:09, ผลลัพธ์:Son las ocho y diecioch
edc65

กรณีทดสอบทั้งหมดส่งให้ฉันในพื้นที่ ฉันเห็นสิ่งผิดปกติในการคัดลอกตัวเลขดังนั้นฉันจะแก้ไข
britishtea

1
"seite" ควรเป็น "siete" และ "neuve" ควรเป็น "nueve"
jmm

2

Bash 423

(433 - 10 = 423 การถอดกำกับและการออกเสียงเราสามารถลงไปที่ 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}

มันใช้ 'una' เป็นเวลาหลายชั่วโมงและ 'uno' เป็นเวลาหลายนาที ดูอย่างถี่ถ้วนยิ่งขึ้น :)
แองเกล

ขออภัยไม่ชัดเจนและ bash ยากที่จะทดสอบใน windows +1 แล้ว
edc65

@ edc66 กฎอยู่ใน femenine แล้ว $ {o [$ m] /% a / o} แทนที่ a ต่อท้ายด้วย o สำหรับนาที
Ángel

2

Perl - 297 - 10 + 1 = 288 (นับpธง)

แก้ไข: ขอบคุณ @guifa ตอนนี้ฉันสามารถรับโบนัสได้แล้ว :)

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

นี่คือรหัสเดียวกันในหลายบรรทัดสำหรับการอ่าน:

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

ควรใช้ 'una' เป็นชั่วโมง 'uno' เป็นนาที ดังนั้น '01: 01 '- ควรให้Es la una y uno
edc65

หากคุณเพียงแค่เปลี่ยน "quince" เป็น "cuarto" และ "treinta" เป็น "media" คุณจะได้รับโบนัส -10
user0721090601

@ edc65 ฉันหวังว่ามันจะโอเคตอนนี้ ...
core1024

0

สกาลา 652 ไบต์ - 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

Pyth : 277 พวงมากกว่า 234 - 10 (โบนัสโบนัส / สื่อ) = 224 ไบต์

ตอนนี้ลดลงมากกว่า 50 ไบต์จากต้นฉบับ!

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

นานพอสมควรสำหรับ Pyth แต่นั่นเป็นเพราะมีข้อมูลดิบบางส่วน อาจจะสามารถตีกอล์ฟต่อไปได้ ใช้เทคนิคที่ชัดเจนในการแบ่งงานออกเป็นหลายชั่วโมง y / Menos, สิบหลักนาทีและหนึ่งหลักนาทีแล้วแปลตัวเลขโดยใช้อาร์เรย์การแปลและทุกอย่างอื่นโดยใช้ 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"

ประวัติศาสตร์การเล่นกอล์ฟ

  • 10 bytes - โบนัส, quince และ trienta สามารถถูกแทนที่ในอาร์เรย์การแปลได้ดังนั้นจึงไม่จำเป็นต้องเปลี่ยนแปลงยกเว้นเรียงความการแปลและขนาดเดียวกัน
  • 6 ไบต์ - ประกอบไปด้วยไตรภาคี
  • 6 ไบต์ - การตีกอล์ฟอื่น ๆ
  • 6 ไบต์ - กำหนดชั่วโมง / นาทีเริ่มต้นที่เล่นกอล์ฟ
  • +3 ไบต์ - แก้ไข uno / una
  • 3 ไบต์ - veinti ที่สร้างจาก veinte ไม่ใช่ hardcoded
  • 18 bytes - แยก dieci จากวัยรุ่น <16
  • 2 ไบต์ - ลบช่องว่างบางส่วนในนั้นโดยไม่มีเหตุผล
  • 2 ไบต์ - ใช้ \ สำหรับหนึ่งอักขระถ่าน

สำหรับสตริงอักขระ 1 รายการเช่น":"และ"i"ใช้\:และ\iแทน
isaacg

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