带点和逗号时间标记的ASCII时钟


39

介绍

高尔夫代码解释

想象一下,字符行实际上是两行。上排小圆点-表示小时(24小时制),而下排逗号-表示分钟。只要有可能,一个字符就可以表示小时,分钟或同时表示两者

起初,您可能必须将午夜以来的分钟数转换为小时数和分钟数

结果是以“点格式”显示当前时间的字符串。点数(此处的单引号记为点,将称为so!)是自午夜以来的小时数,而逗号数是分钟数。我将展示一些示例以使其清楚。

  • (备注)hh:mm- result
  • (仅营业时间)05:00- '''''
  • (仅分钟)00:08- ,,,,,,,,
  • (小时<分钟)03:07- ;;;,,,,
  • (小时>分钟)08:02- ;;''''''
  • (小时=分钟)07:07- ;;;;;;;
  • (一天的开始)00:00- 空结果

请注意,“两个”字符最多可使用23次-对于23:xx,其中xx为23或更大。

符号

如果必须用您的语言字符进行转义(请参阅规则5),则可以将其更改为替代方法之一。如果上述替代方法还不够,则可以使用其他符号-但要使其合理。我只是不想逃避成为一个障碍。

  • ;(分号) -标记两个小时和分钟(ALT: :
  • '(撇号) -标记为小时(ALT: '``°
  • ,(逗号) -标记为分钟(ALT: .

附加规则

  1. 字节数最少的代码胜出!
  2. 您必须尽可能使用两个符号。对于02:04的结果不能为'',,,,,也不能为;',,,。必须是;;,,
  3. 输入-可以是脚本/应用参数,用户输入(如readline)或代码
    3.1中的变量。如果使用内部代码变量,则其长度必须尽可能长。这是1439(23:59),所以它看起来像t=1439
  4. “两个”字符表示的公共部分(12:05中的12,03:10中的3)必须放在字符串的开头
  5. 仅当必须在代码中将符号转义时,才能将符号替换为替代符号。
  6. 00:00之后的分钟内输入。您可以假定这是一个非负整数。

测试用例

Input: 300
Output: '''''

Input: 8
Output: ,,,,,,,,

Input: 187
Output: ;;;,,,,

Input: 482
Output: ;;''''''

Input: 427
Output: ;;;;;;;

Input: 0
Output:  (empty)

谢谢Adnan编辑我的帖子!这样,我将通过与您的新手高尔夫进行比较来学习:)
Krzysiu 2015年

3
没问题!这是一个很好的第一篇文章,也是一个很好的挑战:)
Adnan

1
这看起来很好用分号和逗号,但是撇号把它们都
弄糟

其实143923:59与不是1339。(23 x 60 + 59)。
2015年

谢谢大家的好话!:) @Sparr,是的,不好的地方:(您知道如何替换它吗?在这里插入用户名,当然是正确的!已修复:)
Krzysiu 2015年

Answers:


10

Pyth,19个字节

:.iF*V.DQ60J"',"J\;

测试套件

:.iF*V.DQ60J"',"J\;
      .DQ60            Divmod the input by 60, giving [hours, minutes].
           J"',"       Set J equal to the string "',".
    *V                 Perform vectorized multiplication, giving H "'" and M ','.
 .iF                   Interleave the two lists into a single string.
:               J\;    Perform a substitution, replacing J with ';'.

8

CJam,22 20 19字节

接收来自STDIN的输入:

ri60md]',`.*:.{;K+}

在这里测试。

说明

ri     e# Read input and convert to integer.
60md   e# Divmod 60, pushes hours H and minutes M on the stack.
]      e# Wrap in an array.
',`    e# Push the string representation of the comma character which is "',".
.*     e# Repeat apostrophe H times and comma M times.
:.{    e# Apply this block between every pair of characters. This will only applied to
       e# first N characters where N = min(hours,minutes). The others will remain
       e# untouched. So we want the block to turn that pair into a semicolon...
  ;    e#   Discard the comma.
  K+   e#   Add 20 to the apostrophe to turn it into a semicolon.
}

真的很幸运,这里的工作如何顺利进行,特别是将小时'和分钟分配给,,使堆栈上的小时和分钟的顺序与字符的字符串表示形式相匹配。

这是我到目前为止发现的唯一3字节块。但是有大量的4个字符的解决方案:

{;;';}
{';\?}
{^'0+}
{^'F-}
{-'@+}
{-'6-}
...

6

GNU Sed,37岁

得分包括+1,可供-E选择。

我对bash答案的高尔夫球感并没有特别的印象,所以我认为我会尝试sed的乐趣。

根据此meta-answer,输入为一

y/1/,/          # Convert unary 1's to commas (minutes)
s/,{60}/'/g     # divmod by 60.  "'" are hours
:               # unnamed label
s/(.*)',/;\1/   # replace an apostrophe and comma with a semicolon
t               # jump back to unnamed label until no more replacements

在线尝试


未命名标签?
mikeserv


@manatwork-我认为它一定是GNU错误。
mikeserv

@mikeserv-但也可以使用错误,对吗?我不是要嘲笑你,我只是不知道:)
Krzysiu 2015年

@Krzysiu-好吗?嗯。在这个网站上,我认为这将是卓越的标志。否则,几乎肯定不会。当程序员偏离API并使用实现细节时,程序变得依赖于版本/实现-这是一件坏事。
mikeserv

6

Python 2,56个字节

def g(t):d=t%60-t/60;print(t/60*";")[:t%60]+","*d+"'"*-d

可打印的功能(比短1个字符t=input();)。

该方法类似于Loovjo的方法,分钟数和小时数之间的数字不同,隐含的最小值为0。对于',它是负数。对于;,将min花费多达;几个小时,然后截断为分钟数,从而隐式计算。

它保存要保存的字符d,但不保存小时和分钟数。带lambda的类似物要长两个字符(58),因此变量赋值是值得的。

lambda t:(t%60*";")[:t/60]+","*(t%60-t/60)+"'"*(t/60-t%60)

直接处理输入也不会保存字符(58):

h,m=divmod(input(),60);d=m-h;print(";"*m)[:h]+","*d+"'"*-d

切片的另一种策略更长(64):

def g(t):m=t%60;h=t/60;return(";"*m)[:h]+(","*m)[h:]+("'"*h)[m:]


3

Pure Bash(无外部公用程序),103

p()(printf -vt %$2s;printf "${t// /$1}")
p \; $[h=$1/60,m=$1%60,m>h?c=m-h,h:m]
p , $c
p \' $[m<h?h-m:0]

感谢@ F.Hauri节省了2个字节。


真好!但是你可以通过交换节省2个字符$1,并$2p()p , $c在第3行
F. Hauri

是的,但是因为它仅用在中printf "%s",所以c将其为空将可以很好地工作(而不能重用)
F. Hauri 2015年

@ F.Hauri现在知道了-谢谢!
Digital Trauma 2015年

3

C,119字节

#define p(a,b) while(a--)putchar(b);
main(h,m,n){scanf("%d",&m);h=m/60;m%=60;n=h<m?h:m;h-=n;m-=n;p(n,59)p(h,39)p(m,44)}

详细

// macro: print b, a times
#define p(a,b) while(a--)putchar(b)

int main(void)
{
    int h,m,n;
    scanf("%d",&m);  // read input

    h=m/60;m%=60;    // get hours:minutes
    n=h<m?h:m;       // get common count
    h-=n;m-=n;       // get remaining hours:minutes

    p(n,59);        // print common
    p(h,39);        // print remaining hours
    p(m,44);        // print remaining minutes

    return 0;
}

1
使用putchar&整数文字作为字符可节省一个字节,在宏中提取分号可节省另外两个字节:)
Quentin

@Quentin笔记,保存5个字节
Khaled.K 2015年

您可以while在#define宏中失去空格。-1个字节
艾伯特·伦肖

1
您还可以通过仅将p(a,b)设为函数而不是宏来节省更多字节。(并在主要功能上添加一些分号)
Albert Renshaw

3

Haskell,68 66字节

g(h,m)=id=<<zipWith replicate[min h m,h-m,m-h]";',"
g.(`divMod`60)

用法示例:

(g.(`divMod`60)) 482

此处的巧妙之处在于,replicate如果给定的长度为负数或零,则它将返回空字符串,因此我可以将其应用于两个差异,并且只有正数会出现。第一部分很容易,因为分号的数量只是两者中的最小值。然后zipWith将该功能应用于相应的项目。

编辑:意识到我在几分钟内使用了错误的字符

编辑2:感谢@Laikoni,节省了2个字节


您可以将替换concat$为来节省两个字节id=<<
Laikoni

2

JavaScript(ES6)69

m=>";".repeat((h=m/60|0)>(m%=60)?m:h)+",'"[h>m|0].repeat(h>m?h-m:m-h)

2

Powershell,99 85字节

param($n)";"*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+"'"*(($h-$m)*!$b)+","*(($m-$h)*$b)

使用Loovjo的方法,这是我的powershell实现。

不打高尔夫球

param($n) 
# set the number of minutes and hours, and a boolean which one is bigger
# and also output the correct number of ;s
";"*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+ 
# add the difference between h and m as 's but only if h > m
"'"*(($h-$m)*!$b)+
# add the difference between m and h as ,s but only if m > h
","*(($m-$h)*$b)

多亏了AdmBorkBork,节省了14个字节


您可以通过对第一个使用伪三元,将$m$h声明移入其中,然后使用布尔乘法来保存。像这样-– param($n)';'*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+'°'*(($h-$m)*!$b)+','*(($m-$h)*$b)
AdmBorkBork

1

Python 3,98个字节

d=int(input());m=d%60;h=int((d-m)/60)
if m>=h:print(";"*h+","*(m-h))
else:print(";"*(m)+"'"*(h-m))

可能不是最好的答案,但这很有趣!


1

Python 2,61字节

t=input();m,h=t%60,t/60
print";"*min(h,m)+","*(m-h)+"'"*(h-m)

说明:

t=input();              # Read input
          m,  t%60,     # Do a divmod, h = div, m = mod
            h=     t/60

print";"*min(h,m)+                    # Print the minimum of the h and m, but in ";"s
                  ","*(m-h)+          # Print (m-h) ","s (if m-h is negative, print nothing)
                            "'"*(h-m) # Print (h-m) "'"s (if h-m is negative, print nothing)

1

PHP,81字节

我选择了变量输入,因为它比STDIN从命令行中读取或接受命令行参数短。

for($_=1439;$i<max($h=0|$_/60,$m=$_%60);++$i)echo$i<$h?$i<min($h,$m)?';':"'":",";

我以为我很了解PHP,但是我看到| 首次。我想我会用它来锻炼一下-我会分析一下:)
Krzysiu 2015年

失败240。尝试$i>=min($h,$m)?$h<$m?",":"'":";"(+1字节)。或使用for($_=1439;$i<max($h=0|$_/60,$m=$_%60);)echo"',;"[$i++<min($h,$m)?2:$h<$m];(76个字节)。顺便说一句:单引号使-r不可能;因此,如果您使用的是字符串或°独立字符串,则应在数小时内使用反引号(不需要使用引号-> -1字节)。
泰特斯

1

JavaScript(ES6),77 71字节

x=>';'[r='repeat'](y=Math.min(h=x/60|0,m=x%60))+"'"[r](h-y)+','[r](m-y)

在属性访问/函数参数中大量使用分配。+1
Cyoce

1

Perl 6,103 101 98 97 69字节

$_=get;say ";"x min($!=($_-$_%60)/60,$_=$_%60)~"'"x $!-$_~","x $_-$!;

输出几个数组,但是他妈的,享受。像往常一样,任何打高尔夫球的机会都会被取消。

编辑:-2个字节:勇敢并删除了一些演员表。

Edit2:-3字节,通过删除数组。

Edit3:-1字节,以正确的格式打印,使用“ lambdas”并删除括号。

Edit4 :(对不起)滥用小时-分钟应返回0,反之亦然。删除if语句。然后去掉括号,然后意识到我根本不需要lambda。-28字节:)

哇,我在这方面做得更好。


0

C,141字节

main(h,m){scanf("%d",&m);h=(m/60)%24;m%=60;while(h||m){if(h&&m){printf(";");h--;m--;}else if(h&&!m){printf("'");h--;}else{printf(",");m--;}}}

我认为您可以使用节省一些字节h>0||m>0。然后,您只需h--;m--;在每次迭代中执行一次,{}for if/else就会过时。
插入用户名

您还可以在第二个条件上保存一些字节:而不是else if(h&&!m)仅仅拥有else if(h)
Hellion 2015年

最后尝试使用三元运算符,它将避免使用诸如if和的“长”字else
insertusername此处,2015年

考虑将函数重构为将输入作为int参数的函数-至少应该可以节省您的代码scanf()
Digital Trauma

我认为没有%24必要-最大输入为23:59。
Digital Trauma 2015年

0

Gema,119个字符

<D>=@set{h;@div{$0;60}}@set{m;@mod{$0;60}}@repeat{@cmpn{$h;$m;$h;$h;$m};\;}@repeat{@sub{$h;$m};'}@repeat{@sub{$m;$h};,}

样品运行:

bash-4.3$ gema '<D>=@set{h;@div{$0;60}}@set{m;@mod{$0;60}}@repeat{@cmpn{$h;$m;$h;$h;$m};\;}@repeat{@sub{$h;$m};`}@repeat{@sub{$m;$h};,}' <<< '252'
;;;;,,,,,,,,

0

Matlab:89个字节

i=input('');m=mod(i,60);h=(i-m)/60;[repmat(';',1,min(h,m)),repmat(39+5*(m>h),1,abs(h-m))]

测试:

310
ans =
;;;;;,,,,,

0

SmileBASIC,59个字节

INPUT M
H%=M/60M=M-H%*60?";"*MIN(H%,M);",'"[M<H%]*ABS(H%-M)

解释:

INPUT MINUTES 'input
HOURS=MINUTES DIV 60 'separate the hours and minutes
MINUTES=MINUTES MOD 60
PRINT ";"*MIN(HOURS,MINUTES); 'print ;s for all positions with both
PRINT ",'"[MINUTES<HOURS]*ABS(HOURS-MINUTES) 'print extra ' or ,

它看起来很可怕,因为底部;甚至不是一样,SmileBASIC的字体


0

PHP,81字节

一些更多的解决方案:

echo($r=str_repeat)(";",min($h=$argn/60,$m=$argn%60)),$r(",`"[$h>$m],abs($h-$m));
// or
echo($p=str_pad)($p("",min($h=$argn/60,$m=$argn%60),";"),max($h,$m),",`"[$h>$m]);

用运行echo <time> | php -R '<code>'

<?=($r=str_repeat)(";",min($h=($_=1439)/60,$m=$_%60)),$r(",`"[$h>$m],abs($h-$m));
// or
<?=($r=str_repeat)(";",min($h=.1/6*$_=1439,$m=$_%60)),$r(",`"[$h>$m],abs($h-$m));
// or
<?=str_pad(str_pad("",min($h=($_=1439)/60,$m=$_%60),";"),max($h,$m),",`"[$h>$m]);

1439用输入替换,保存到文件,运行。


0

Ruby,50个字符

->t{(?;*h=t/60)[0,m=t%60]+",',"[0<=>m-=h]*m.abs}

谢谢:

  • GB
    • 提醒我,字符串中的字符数不能超过(-1个字符)
    • 重新整理我的计算(-1个字符)

使用了这么长时间Numeric.divmod,才意识到它的时间太长了。

样品运行:

2.1.5 :001 > puts ->t{(?;*h=t/60)[0,m=t%60]+",',"[0<=>m-=h]*m.abs}[252]
;;;;,,,,,,,,

1
通过截断字符串而不是使用min来保存1个字符:(?;*h=t/60)[0,m=t%60]
GB

1
通过从m中减去h来获得另一个字节:",',"[0<=>m-=h]*m.abs
GB

0

05AB1E,25个字节

60‰vy„'.Nè×}‚.BøJ„'.';:ðK

在线尝试!

60‰vy„'.Nè×}绝对可以缩短,我只是想不通,并且怀疑我是否可以节省7个字节才能用这种方法获胜,除非有向量版本的×


示例(输入等于63):

60‰                       # Divmod by 60.
                          # STACK: [[1,3]]
   vy      }              # For each element (probably don't need the loop)...
                          # STACK: []
     „'.Nè×               # Push n apostrophe's for hours, periods for minutes.
                          # STACK: ["'","..."]
            ‚             # Group a and b.
                          # STACK: [["'","..."]]
             .B           # Boxify.
                          # STACK: [["'  ","..."]]
               ø          # Zip it (Transpose).
                          # STACK: [["'."," ."," ."]
                J         # Join stack.
                          # STACK: ["'. . ."]
                 „'.';:   # Replace runs of "'." with ";".
                          # STACK: ["; . ."]
                       ðK # Remove all spaces.
                          # OUTPUT: ;..

D60÷''×s60%'.ׂ.BøJ„'.';:ðK 是我的原始版本,但比divmod还要贵。

60‰WDµ';ˆ¼}-¬0Qi'.ë''}ZׯìJ 我尝试过的另一种方法...



0

Java 8,101 99 86字节

n->{String r="";for(int m=n%60,h=n/60;h>0|m>0;r+=h--*m-->0?";":h<0?",":"'");return r;}

说明:

在这里尝试。

n->{                      // Method with integer parameter and String return-type
  String r="";            //  Result-String (starting empty)
  for(int m=n%60,h=n/60;  //   Get the minutes and hours from the input integer
      h>0|m>0;            //   Loop as long as either the hours or minutes is above 0
    r+=                   //   Append the result-String with:
       h--*m-->0?         //    If both hours and minutes are above 0
                          //    (and decrease both after this check):
        ";"               //     Use ";"
       :h<0?              //    Else-if only minutes is above 0 (hours is below 0)
        ","               //     Use ","
       :                  //    Else:
        "'"               //     Use "'"
  );                      //  End loop
  return r;               //  Return the result
}                         // End of method
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.