Codegolf - Пришло Испанское Время!

  • Автор темы Takeoff
  • Обновлено
  • 22, Oct 2024
  • #1

У меня есть простая задача, которую относительно легко реализовать с помощью кода. Ваша цель состоит в том, чтобы написать программу, которая будет выводить время, написанное на испанском языке, в формате ЧЧ:ММ. Многие люди, вероятно, не знают как чтобы это сделать, поэтому я уточню.

Время в испанском языке довольно логично. Обычно это происходит по схеме «Es la/Son las (час) y (минуты)». Часы указаны в 12-часовом формате, а «Es la» — только используется если час равен 1 (т.е. часу). С протоколами дела обстоят иначе. Если минут меньше 30, то она представляется так, как показано выше. Однако если минута больше 30, то час округляется в большую сторону, а минуты вычитаются. Например, 7:35 переводится как «8 часов минус 25 минут». Еще несколько примеров будут приведены ниже. Список необходимых испанских номеров можно найти здесь. На некоторых цифрах есть ударения, но они не обязательны.

Примечание: В источнике написано «уно», но, если быть грамматически правильным, это должно быть «уна». Это пока не должно влиять ни на какие ответы.

Примечание 2: Кроме того, «серо» не обязательно. Если ваша программа выводит «Es la una» или «Son las tres», меня это устраивает. Приносим извинения за такие изменения в правилах.

Правила

  • Ввод будет осуществляться через STDIN или его эквивалент на вашем языке.
  • Никакого чтения из сторонних библиотек.
  • Ваш код может делать что угодно с недопустимыми входными данными.

Бонусы

  • -10, если ваш код добавляет эти дополнительные фразы: «y cuarto» для :15, «y media» для :30 и «menos cuarto» для :45 (округлено вверх).
  • -15, если ваш код может обрабатывать A.M. и PM, отвечая «de la mañana» и «de la tarde» соответственно.
  • -15, если ваш код может переводить текущее время, если ввод не указан.

Подсчет очков

  • Это соревнование по кодовому гольфу, и оно будет оцениваться в байтах, а не в символах.

Примеры

Вход: Es la una menos cinco. Output: 12:55

Вход: Es la una y veintinueve. Output: 1:29

Вход: Son las siete menos quince (or cuarto). Output: 6:45

Вход: Son las ocho y diez. Output: 8:10

Дайте мне знать, если здесь есть что указать. Это мой первый вопрос, поэтому он определенно не идеален.

#код-гольф #колмогоров-сложность #свидание

Takeoff


Рег
24 Feb, 2010

Тем
74

Постов
189

Баллов
609
  • 26, Oct 2024
  • #2

JavaScript (ES6) 308 316

Редактировать2 исправление ошибки Редактировать забыл получить бонус
Как программа с вводом/выводом через всплывающее окно

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

Как тестируемая функция

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

Тест В консоли FireFox/FireBug

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 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"}.""")}

Выход

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

Да, самый ожидаемый язык, появившийся на соревнованиях по гольфу, написанный худшим игроком в гольф в мире, вернулся!

Java — 676 байт (716-10-15-15)

Гольф:

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

Негольфед:

p

Сделки с 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} and 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,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] , с AM/PM и не имеет ввода. Так что я могу претендовать на все бонусы, хотя, если бы я не реализовал эти функции, у меня был бы еще более низкий балл, лол. фейспалмс

 

Fahjlbnf


Рег
20 Dec, 2006

Тем
73

Постов
188

Баллов
573
  • 26, Oct 2024
  • #3

Python 3: 294 символа — 10 = 284

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+1,j][i<31]],'una'][j==1],'y'if i<31 else'menos',d[min(i,60-i)])

Это дает бонус в десять баллов за использование «cuarto» и «media».

Читаем часы и минуты как 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]);} s. If the minutes are above 30, we move to the next hour, measure minutes away from 60, and change the conjunction to "menos".

Список function has translations of Spanish numbers up to 15. We make table.concat быть H<12 to prevent things like "diecicero". This is done by awkwardly calling H>=12 с начальным пробелом; обычный 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)+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) would just ignore it. The zero-minute case is handled later.

Чтобы получить числа больше 15, мы объединяем строку из десятков цифр с соответствующей строкой из одной цифры. #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+1:h; m=o=n?60-m:m; if(u=m>15&m!=20)o=m; 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]); } and #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+1:h;m=o=n?60-m:m;if(u=m>15&m!=20)o=m;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]);} записываются как «медиа» и «куарто» бесплатно.

Python 3 сохраняет одну сеть символов по сравнению с Python 2: -4 для preg_filter() instead of <? echo , +2 за печатные скобки, +1 за <?= .

 

Gordonf


Рег
17 Sep, 2011

Тем
74

Постов
184

Баллов
554
  • 26, Oct 2024
  • #4

PHP, 351 349 360 - 15 = 345 байт

<?=preg_filter(...,...)

Эта программа не является командной строкой: она принимает входные данные через $_GET[0]. Возможно, вам придется отключить уведомления в вашем php.ini. Теперь есть автоматическое время без ввода данных, благодаря Ниету Темному Абсолу.

Использованные трюки:

~(...) saves one byte by bitwise inverting a string, as you don't need quote marks as PHP usually assumes all ASCII from 0x80 to 0xFF is a string.

<?$a=split(~ß,~œšßŠ‘ß›Œß‹šŒßœŠž‹ßœ–‘œßŒš–ŒßŒ–š‹šßœ—ß‘Šš‰šß›–š…ß‘œšß›œšß‹šœšßœž‹œšßŽŠ–‘œšß›–šœ–߉š–‘‹–ß‹š–‘‹ž)?><?=preg_filter(~Ð×ÑÔÖÅ×ÑÔÖК,'(($h=($1-($k=$2<31))+1)>1?~¬‘ß“žŒß:~ºŒß“žß).$a[$h].($k?~߆ß:~ß’š‘Œß).(($m=$k?$2+0:60-$2)<16?$a[$m]:($m<20?$a[16].$a[$m]:($m<21?viente:($m<30?$a[17].$a[$m]:$a[18])))).~Ñ',$_GET[0]?:date(~·Å–)); : The // это ярлык для записи raw_input . input обычно заменяет строку с помощью регулярного выражения, но мы можем использовать устаревший модификатор /e, чтобы оценить полученную строку как PHP-код. Следовательно, вместо того, чтобы разбивать входную строку на две отдельные переменные, мы можем использовать обратные ссылки ($1 и $2) на совпадающую входную строку, экономя большое количество байтов.

 

Paf426skestSoky


Рег
09 Nov, 2019

Тем
95

Постов
207

Баллов
702
  • 26, Oct 2024
  • #5

С++: 474...422 411 байт

В этой версии используется бонус cuarto/media (-10).

30

Моя первая попытка игры в гольф по коду! Постараюсь улучшить его на этих выходных.

Негольфед:

15 ||answer||

Луа, 450 – 10 (куарто/медиа) – 15 (манана/тарде) = 425

split
  • Удалил 12 байт, переписав генератор на 21-29.
  • Удалил еще 1 путем замены split(' ') with '' и переключение зависимого выражения.
  • Удалил еще 4, загрязнив глобальное пространство имен функцией (зло, но в интересах игры в гольф :).
  • Исправлено регулярное выражение, я забыл двоеточие. Однако это не меняет количество байтов.
  • Исправлен случай нулевых минут, заменены местами d[0] out for string ops, and added @edc65's suggestion, ultimately adding 22 bytes.
  • Мне стыдно. Потянув d body out into the main chunk reduced the length by a whopping 15 байт.
 

Srmariola


Рег
26 May, 2017

Тем
68

Постов
204

Баллов
584
  • 26, Oct 2024
  • #6

Д - 484 байта

int ||answer||

Питон 3, 409 байт

h,m=map(int,input().split(':')) t="y" d="yunoydosytresycuatroycincoyseisysieteyochoynueveydiezyonceydoceytreceycatorceycuarto".split(t)*2 if m>30:h=h+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]][m>15]+".") ||answer||

Руби, 313 (338 – 15 – 10)

Это решение переводит текущее время, когда не было введено никаких данных, и добавляет три фразы «y cuarto», «y media» и «menos cuarto».

media ||answer||

Баш 423

(433 - 10 = 423, убрав диакритические знаки и куарто, мы можем опуститься до 381)

quarto ||answer||

Perl - 297 - 10 + 1 = 288 (считая 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); } } flag)

Редактировать: благодаря @guifa теперь я могу претендовать на бонус :)

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

Вот тот же код в несколько строк для удобства чтения:

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 ||answer||

Скала 652 байт — 25

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

Pyth: 277 еще несколько 234 - 10 (куарто/медиа-бонус) = 224 байта

Теперь уменьшено более чем на 50 байт от оригинала!

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)))?'Son las '+N(1+h):'Es la una')+(m>30?' menos '+N(60-m):-m?' y '+N(~~m):'') )

Безумно долго для Pyth, но это потому, что есть необработанные данные. Вероятно, можно играть в гольф еще дальше. Использует очевидную технику разделения задачи на часы, y/menos, десятки минут и единицы минут, а затем переводит числа, используя массив перевода, и все остальное, используя кучу троичных чисел.

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)))?'Son las '+N(1+h):'Es la una')+(m>30?' menos '+N(60-m):-m?' y '+N(~~m):''))

История гольфа

  • 10 байт - бонус, айву и триенту можно просто заменить в массиве перевода, поэтому никаких изменений не требуется, кроме эссе перевода и его того же размера.
  • 6 байтов — реорганизованные тернарные операторы — к сожалению, это удалило 4 последовательных тернарных оператора :(
  • 6 байт — другие различные игры в гольф
  • 6 байт — начальное назначение часов/минут в гольфе
  • +3 байта - исправлено uno/una
  • 3 байта — построенные венеты из венете, не закодированные жестко.
  • 18 байт — извлеченные цифры от подростков <16 лет
  • 2 байта - без причины удалены некоторые пробелы
  • 2 байта - используется \ для односимвольных строк
 

Mikki maus


Рег
25 Oct, 2011

Тем
69

Постов
196

Баллов
551
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно