Es ist spanische Zeit!

24

Ich habe eine einfache Aufgabe, die relativ einfach mittels Code zu implementieren sein sollte. Ihr Ziel ist es, ein Programm zu schreiben, das die auf Spanisch geschriebene Zeit im Format HH: MM ausgibt. Viele Leute wissen wahrscheinlich nicht, wie sie das machen sollen, also werde ich darauf näher eingehen.

Die Zeit in Spanisch ist ziemlich logisch. Es folgt normalerweise dem Muster "Es la / Son las (Stunde) y (Minuten)". Stunden sind im 12-Stunden-Format und "Es la" wird nur verwendet, wenn die Stunde 1 ist (dh 1 Uhr). Die Protokolle sind eine andere Geschichte. Wenn die Minute kürzer als 30 ist, wird sie wie oben dargestellt. Wenn die Minute jedoch über 30 liegt, wird die Stunde aufgerundet und die Minute abgezogen. Beispiel: 7:35 entspricht "8 Stunden minus 25 Minuten". Einige weitere Beispiele werden unten angegeben. Die Liste der erforderlichen spanischen Nummern finden Sie hier . Einige Zahlen enthalten Akzente, die jedoch nicht erforderlich sind.

Hinweis: Die Quelle sagt "uno", aber um grammatikalisch korrekt zu sein, sollte es "una" sein. Dies sollte bisher keine Antworten beeinflussen.

Anmerkung 2: Auch "cero" ist nicht erforderlich. Wenn Ihr Programm "Es la una" oder "Son las tres" ausgibt, ist das in Ordnung für mich. Entschuldigen Sie diese Regeländerungen.

Regeln

  • Die Eingabe erfolgt über STDIN oder ein gleichwertiges Programm in Ihrer Sprache.
  • Kein Lesen aus externen Bibliotheken.
  • Ihr Code kann mit ungültigen Eingaben alles machen.

Boni

  • -10 wenn Ihr Code diese zusätzlichen Ausdrücke hinzufügt - "y cuarto" für: 15, "y media" für: 30 und "menos cuarto" für: 45 (aufgerundet).
  • -15 Wenn Ihr Code AM und PM verarbeiten kann, antworten Sie entsprechend mit "de la mañana" und "de la tarde".
  • -15 wenn Ihr Code die aktuelle Zeit übersetzen kann, wenn keine Eingabe erfolgt.

Wertung

  • Dies ist eine Code-Golf-Herausforderung und wird nach Bytes und nicht nach Zeichen gewertet.

Beispiele

Eingabe: 8:10 Ausgabe:Son las ocho y diez.

Eingabe: 6:45 Ausgabe:Son las siete menos quince (or cuarto).

Eingabe: 1:29 Ausgabe:Es la una y veintinueve.

Eingabe: 12:55 Ausgabe:Es la una menos cinco.

Lassen Sie mich wissen, ob es hier etwas zu spezifizieren gibt. Dies ist meine erste Frage, daher ist sie definitiv nicht perfekt.

mdc32
quelle
Zu Ihrer Information können Sie Feedback erhalten, bevor Sie Beiträge in der Sandbox veröffentlichen .
Stretch Maniac
1
@Sparr Ich bezweifle es. Es gibt wahrscheinlich genug Zahlen, die fest codiert werden müssen, um dies zu erreichen - mindestens 45 Zeichen, sogar unter Berücksichtigung von Mustern.
mdc32
1
@ Tennis Hmm ... ich denke, entweder wäre in Ordnung. Es la una y ceroist ziemlich repetitiv, also verstehe ich deinen Standpunkt. Ich habe das nicht spezifiziert, also denke ich, dass beides in Ordnung wäre. Danke für die Rückmeldung.
mdc32
1
Sie sollten dies 01:21als Testfall hinzufügen , da mindestens ein Antwortender durch das, was Sie über una vs uno sagten, verwirrt war .
Peter Taylor
3
Der zweite Bonus ist (fast?) Nie wert, denn die Phrasen "de la", "manana" und "tarde" allein zählen bereits bis zu 16 Bytes.
britishtea

Antworten:

9

JavaScript (ES6) 308 316

Edit2 Bugfix Edit hat vergessen, den Bonus
als Programm mit I / O via Popup zu beanspruchen

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

Als testbare Funktion

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

Test In FireFox / Firebug - Konsole

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

Ausgabe

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
quelle
8

Ja, die am wenigsten erwartete Sprache, die der schlechteste Golfspieler der Welt bei einem Golfwettbewerb erwartet, ist zurück!

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

Golf gespielt:

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

Beschäftigt sich mit dem quartound media, mit dem AM / PM und hat keine Eingabe. Also kann ich alle Boni beanspruchen, obwohl ich, wenn ich diese Funktionen nicht implementiere, eine noch niedrigere Punktzahl hätte, lol. Gesichtspalmen

Rodolfo Dias
quelle
6

Python 3: 294 Zeichen - 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]+".")

Dies bringt den Zehn-Punkte-Bonus für die Verwendung von "cuarto" und "media"

Wir lesen die Stunden und Minuten als ints. Wenn die Minuten über 30 liegen, wechseln wir zur nächsten Stunde, messen den Abstand von 60 Minuten und ändern die Konjunktion in "menos".

Die Liste dhat die Übersetzungen der spanischen Zahlen bis zu 15. Wir machen d[0]sein , ''Dinge zu verhindern , wie „diecicero“. Dies geschieht durch umständliches Aufrufen split(' ')mit einem Anfangsraum; der Stammgast splitwürde es einfach ignorieren. Der Null-Minuten-Fall wird später behandelt.

Um Zahlen über 15 zu erhalten, kombinieren wir die zehnstellige Zeichenfolge mit der entsprechenden einstelligen Zeichenfolge. 15und 30werden kostenlos als "media" und "cuarto" geschrieben.

Python 3 speichert ein Char-Netz über Python 2: -4 für inputanstelle von raw_input+2 für gedruckte Parens, +1 für //.

xnor
quelle
Ich bin traurig zu sagen, dass es komplizierter ist. 01:21 sollte la una y veintiuno sein, denn Stunden sind weiblich, Minuten sind männlich.
Peter Taylor
@ PeterTaylor Ich verstehe. Ist uno / una die einzige betroffene Nummer?
8.
Ja, obwohl es andere geben würde, wenn es zu Hunderten kommen würde.
Peter Taylor
@PeterTaylor Fixed, für 5 Zeichen.
8.
@ edc65 Hoppla, ich habe vergessen, die aktuelle Änderung von unain einzufügen uno, sollte jetzt funktionieren.
8.
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(~·Å–));

Dieses Programm ist keine Befehlszeile: Es nimmt Eingaben über $ _GET [0] entgegen. Möglicherweise müssen Sie Benachrichtigungen in Ihrer php.ini deaktivieren. Dank Niet the Dark Absol kommt jetzt die automatische Zeit ohne Eingabe.

Tricks verwendet:

~(...) Speichert ein Byte durch bitweises Invertieren einer Zeichenfolge, da Sie keine Anführungszeichen benötigen, da PHP normalerweise davon ausgeht, dass alle ASCII-Zeichen von 0x80 bis 0xFF eine Zeichenfolge sind.

<?=preg_filter(...,...): Das <?=ist eine Abkürzung zum Schreiben <? echo. preg_filter()Wendet normalerweise Ersetzungen auf eine Zeichenfolge unter Verwendung eines regulären Ausdrucks an, aber wir können den Modifikator depreciated / e verwenden, um die resultierende Zeichenfolge als PHP-Code auszuwerten. Anstatt die Eingabezeichenfolge in zwei separate Variablen aufteilen zu müssen, können wir daher Rückverweise ($ 1 und $ 2) auf die übereinstimmende Eingabezeichenfolge verwenden, wodurch große Mengen an Bytes eingespart werden.

Tryth
quelle
2
Sie können den Bonus -15 beanspruchen, wenn Sie $_GET[0]?:date(~·Å–)3 von Ihrer Punktzahl abziehen.
Niet the Dark Absol
Vielen Dank. Ich habe das und eine weitere kleine Verbesserung gemacht.
Versuchen Sie es
5

C ++: 474 ... 422 411 Bytes

Diese Version löst den cuarto / media Bonus (-10) ein.

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

Mein erster Versuch überhaupt, Code zu spielen! Ich werde versuchen, es an diesem Wochenende zu verbessern.

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]);
}
BMac
quelle
1
Könnten Sie nichtm%=10
Timtech
Guter Punkt! Leider muss ich in meiner neuen Revision diesen Wert einer anderen Variablen zuweisen, daher kann ich nicht.
BMac
Ok, wundere mich nur :)
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)
  • 12 Bytes durch Neuschreiben des Generators für 21-29 gelöscht.
  • Fiel 1 mehr durch Ersetzen H>=12durch H<12und Vertauschen des abhängigen Ausdrucks.
  • 4 weitere durch Verschmutzung des globalen Namensraums von einer Funktion entfernt (böse, aber im Interesse des Golfspiels :).
  • Reparierte den regulären Ausdruck, ich vergaß den Doppelpunkt. Ändert jedoch nicht die Byteanzahl.
  • Der Fall von null Minuten wurde behoben table.concat, durch Zeichenfolgenoperationen ersetzt und der Vorschlag von @ edc65 hinzugefügt, wodurch letztendlich 22 Bytes hinzugefügt wurden.
  • Ich bin beschämt. Das Herausziehen des functionKörpers in den Hauptblock reduzierte die Länge um satte 15 Bytes .
Criptychon steht bei Monica
quelle
Sollte 'una' für Stunden und 'uno' für Minuten verwenden. '01: 01 'sollte alsoEs la una y uno
edc65
3

D - 484 Bytes

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
quelle
Sollte 'una' für Stunden und 'uno' für Minuten verwenden. '01: 01 'sollte alsoEs la una y uno
edc65
3

Python 3, 409 Bytes

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
quelle
Eine lange Liste von Zeichenfolgen kann wie 'string1 string2 string3'.split()
folgt
@ xnor Okay, danke!
Hosch250
@ hosch250 Vergewissere dich außerdem, dass du den Kommentaren im ursprünglichen Beitrag erneut folgst. Ich werde wahrscheinlich viele kleine Regeländerungen vornehmen, und diese werden Ihnen wahrscheinlich beim Golfen helfen.
mdc32
@ mdc32 Wird gerade angepasst. Ich hatte sowieso einige Fehler.
Hosch250,
2
Sie können verkürzen d[j]if i<31 else d[(j+1)%12]zu d[(j+(i>30))%12]. Wenn Ihre beiden Alternativen eine ähnliche Struktur haben, können Sie häufig einen einfachen Ausdruck erstellen, der dem jeweiligen Ausdruck in Abhängigkeit vom Booleschen Wert entspricht.
Xnor
3

Ruby, 313 (338-15-10)

Diese Lösung übersetzt die aktuelle Zeit ohne Eingabe und fügt die drei Ausdrücke "y cuarto", "y media" und "menos cuarto" hinzu.

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
quelle
Funktioniert es? Versucht in Ideone, Eingabe '01: 01 ', aktuelle Zeit 20:09, Ausgabe:Son las ocho y diecioch
edc65
Alle Testfälle bestanden für mich vor Ort. Ich sehe, dass beim Kopieren der Zahlen etwas schief gelaufen ist, also werde ich das beheben.
britishtea
1
"seite" sollte "siete" und "neuve" sollte "nueve" sein
jmm 10.11.14
2

Bash 423

(433 - 10 = 423)

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}
Engel
quelle
Es verwendet bereits 'una' für Stunden und 'uno' für Minuten. Schauen Sie genauer :)
Ángel
Es tut uns leid, es ist auf einen Blick nicht klar und es ist schwierig, Bash in Windows zu testen. +1 dann.
edc65
@ edc66, die Ordnungszahlen sind in Femenine, dann ersetzt $ {o [$ m] /% a / o} das abschließende a durch o für die Minuten.
Angel
2

Perl - 297 - 10 + 1 = 288 (Zählen der pFlagge)

Edit: dank @guifa kann ich jetzt einen Bonus beanspruchen :)

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

Hier ist derselbe Code zur besseren Lesbarkeit in mehreren Zeilen:

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
quelle
Sollte 'una' für Stunden und 'uno' für Minuten verwenden. Also '01: 01 '- sollte gebenEs la una y uno
edc65
Wenn Sie nur "Quitte" in "Cuarto" und "Treinta" in "Medien" ändern, erhalten Sie einen Bonus von -10.
user0721090601
@ edc65 Ich hoffe, es ist jetzt in Ordnung ...
Core1024
0

Scala 652 Bytes - 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
quelle
0

Pyth : 277 ein paar mehr 234 - 10 (cuarto / media bonus) = 224 Bytes

Jetzt über 50 Bytes vom Original reduziert!

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

Wahnsinnig lang für Pyth, aber das liegt daran, dass es einige Rohdaten gibt. Kann wohl noch weiter golfen werden. Verwendet die offensichtliche Technik der Aufteilung der Aufgabe in Stunden, Y / Menos, Zehnerstelle von Minuten und Einerstelle von Minuten und übersetzt dann Zahlen unter Verwendung eines Übersetzungsarrays und alles andere unter Verwendung einer Tonne von Ternären.

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

Golf Geschichte

  • 10 Bytes - Bonus, Quitte und Trienta können einfach im Übersetzungsarray ersetzt werden, sodass keine Änderungen erforderlich sind, mit Ausnahme des Übersetzungsaufsatzes und der gleichen Größe.
  • 6 Bytes - reorganisierte ternäre Operatoren - leider wurden die 4 aufeinander folgenden ternären Operatoren entfernt :(
  • 6 Bytes - andere verschiedene Golf
  • 6 Bytes - Golf Anfangsstunde / min Zuordnung
  • +3 Bytes - Uno / Una behoben
  • 3 bytes - veinti aus veinte konstruiert, nicht fest codiert
  • 18 Bytes - Dieci von Teenagern <16 extrahiert
  • 2 Bytes - einige Leerzeichen wurden ohne Grund entfernt
  • 2 Bytes - verwendet \ für eine Zeichenkette
Maltysen
quelle
Für 1 Zeichenkette, wie ":"und "i", Verwendung \:und \istattdessen.
Isaacg
@isaacg oh cool, ich wusste nicht, dass Sie das tun können, Aktualisierung
Maltysen