现在是西班牙时间!


24

我有一个简单的任务,应该相对容易通过代码来实现。您的目标是编写一个程序,该程序以HH:MM格式给出输出以西班牙语编写的时间。很多人可能不知道该怎么做,所以我将详细说明。

用西班牙语的时间是很合逻辑的。它通常遵循“ Es la / Son las(小时)y(分钟)”的模式。小时采用12小时格式,当小时为1(即一点钟)时才使用 “ Es la” 。分钟是一个不同的故事。如果分钟小于30,则表示为上图。但是,如果分钟超过30分钟,则将小时四舍五入并减去分钟。例如,将7:35转换为相当于“ 8小时减去25分钟”。下面将给出更多示例。可以在此处找到所需的西班牙语编号列表。有些数字带有重音符号,但并非必需。

注意:消息来源说“ uno”,但是为了语法上的正确,它应该是“ una”。到目前为止,这不应影响任何答案。

注2:同样,“ cero”不是必需的。如果您的程序输出“ Es la una”或“ Son las tres”,那对我来说很好。抱歉,这些规则更改。

规则

  • 输入将通过STDIN或您所用语言的等效语言提供。
  • 没有从外部图书馆阅读。
  • 您的代码可以使用无效的输入执行任何操作。

奖金

  • 如果您的代码添加了这些额外的短语,则为-10-“ 15”的“ y cuarto”,“ 30”的“ y media”和“ 45”的“ menos cuarto”(向上取整)。
  • 如果您的代码可以处理AM和PM,则返回-15,并相应地返回“ de lamañ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.

让我知道是否在此处指定任何内容。这是我的第一个问题,因此绝对不是完美的。


供您参考,在发布到沙盒之前,您可以获得反馈。
2014年

1
@Sparr我对此表示怀疑。可能必须有足够的数字来进行硬编码-至少要包含45个字符,甚至还要考虑模式。
mdc32

1
@Dennis Hmm ...我想两个都可以。Es la una y cero非常重复,所以我明白你的意思。我没有具体说明,所以我猜任何一个都可以。感谢您的反馈。
mdc32

1
您应该添加01:21一个测试用例,因为至少有一个回答者对您所说的una vs uno感到困惑。
彼得·泰勒

3
第二个好处是(几乎?)永远不值得,因为短语“ de la”,“ manana”和“ tarde”仅已计数多达16个字节。
britishtea 2014年

Answers:


9

的JavaScript(ES6)308 316

Edit2错误修复 Edit忘记声明奖金,
作为带有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);}}

取消高尔夫:

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并没有输入。因此,即使我没有实现这些功能,我也可以要求所有的奖金,但我的得分会更低,哈哈。洗脸


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减去,然后将连词更改为“菜单”。

该名单d有多达15我们使西班牙数字转换d[0]''防止像“diecicero”。这是通过尴尬地调用split(' ')初始空间来完成的;普通人split只会忽略它。零分钟情况将在稍后处理。

要获得大于15的数字,我们将十位数字字符串与适当的一位数字字符串结合在一起。15并免费30写成“媒体”和“ cuarto”。

Python 3比Python 2节省了一个字符网:-4 input代替raw_input,+2 代替印刷品,+1代替//


我很伤心地说,它更重要的是复杂的。01:21应该是点点滴滴,因为小时是女性的,而分钟是男性的。
彼得·泰勒

@PeterTaylor我明白了。Uno / una是唯一受影响的人吗?
xnor 2014年

是的,尽管如果数量增加到数百个,还会有其他人。
彼得·泰勒

@PeterTaylor固定,为5个字符。
xnor

@ edc65哎呀,我忘了在实际的变化粘贴unauno,现在应该工作。
xnor 2014年

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 Absol,无需输入即可自动计时。

使用的技巧:

~(...) 通过按位反转字符串来节省一个字节,因为您不需要引号,因为PHP通常假定从0x80到0xFF的所有ASCII都是字符串。

<?=preg_filter(...,...)<?=是写作的捷径<? echopreg_filter()通常使用正则表达式对字符串进行替换,但是我们可以使用已贬值的/ e修饰符将结果字符串评估为PHP代码。因此,不必将输入字符串分成两个单独的变量,我们可以在匹配的输入字符串上使用反向引用($ 1和$ 2),从而节省大量字节。


2
如果您使用$_GET[0]?:date(~·Å–)分数减去3,则可以申请-15奖金。
Niet the Dark Absol 2014年

谢谢。我已经做到了这一点,并且还有其他一些小的改进。
Tryth 2014年

5

C ++:474 ... 422个 411字节

此版本正在兑换cuarto /媒体红利(-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]);}

我第一次尝试打高尔夫球!这个周末将尝试改善它。

取消高尔夫:

#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)
  • 通过重写21-29的生成器丢弃12个字节。
  • 更换后又掉了1个 H>=12具有H<12与周围切换依赖性表达。
  • 通过从函数中污染全局名称空间,又删除了4个(邪恶,但出于高尔夫目的:)。
  • 修复了正则表达式,我忘了冒号。但是,不更改字节数。
  • 修复了零分钟的情况,交换了 table.concat为字符串操作,并添加了@ edc65的建议,最终增加了22个字节。
  • 我感到羞耻。将function主体拉出到主要块中可以减少15个字节的长度。

应使用'una'数小时,使用'uno'数分钟。因此,“ Es la una y uno
01:01

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'数分钟。因此,“ Es la una y uno
01:01

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 2014年

@xnor好吧,谢谢!
Hosch250 2014年

@ hosch250另外,请确保您再次关注原始帖子中的评论。我可能会进行许多次要的规则更改,这些可能会帮助您打高尔夫球。
mdc32

@ mdc32立即调整。我还是有一些错误。
Hosch250

2
您可以缩短d[j]if i<31 else d[(j+1)%12]d[(j+(i>30))%12]。通常,如果您的两个选择具有相似的结构,则通常可以制作一个简单的表达式,该表达式等于布尔值,每个表达式都相等。
xnor 2014年

3

露比(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 2014年

所有测试用例都在本地通过了我。我发现复制数字时出了点问题,因此我将解决此问题。
britishtea 2014年

1
“ seite”应为“ siete”,“ neuve”应为“ nueve”
jmm

2

重击423

(433-10 = 423,删除变音符号和cuarto,我们可以降至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}在分钟内用o替换结尾的a。
安赫尔

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'数分钟。因此,“ Es la una y uno
01:01

如果您只是将“木瓜”更改为“ cuarto”,将“ treinta”更改为“媒体”,则将获得-10的奖励。
2014年

@ edc65我希望现在可以...
core1024

0

Scala 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

Pyth277 多一束 234-10(cuarto / media bonus)= 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,数十位数和分钟位数,然后使用转换数组转换数字,并使用三元组来转换其他所有内容。

=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个字节-奖金,木瓜和三部曲只能在翻译数组中替换,因此除了翻译论文及其大小相同外,无需进行任何更改。
  • 6个字节-重组的三元数-不幸的是,这删除了4个连续的三元运算符:(
  • 6个字节-其他各种打高尔夫球
  • 6个字节-高尔夫球最初的小时/分钟分配
  • +3个字节-固定的uno / una
  • 3字节-从静脉构造静脉,未硬编码
  • 18字节-从16岁以下青少年中提取的骰子
  • 2个字节-无缘无故删除了其中的一些空格
  • 2个字节-用于一个字符串的\

对于1个字符串,例如":""i",请使用\:\i
isaacg 2015年

@isaacg哦,很酷,我不知道您能做到这一点
Maltysen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.