ドットとコンマのタイムマーカーを備えたASCIIクロック


39

前書き

コードゴルフの説明

文字の行が実際には2行であると想像してください。上の行-ドット-は時間(24時間制)を表し下のコンマ-は分を表します。1文字は、可能な場合いつでも、時間、分、または両方を表すことができます。

最初はおそらく真夜中から時間と分に変換しなければならないでしょう。

結果は、現在の時刻を「ドット形式」で示す文字列です。ドットカウント(アポストロフィはここではドットとしてカウントされ、そう呼ばれます!)は真夜中からの時間カウントであり、コンマカウントは分カウントです。明確にするためにいくつかの例を示します。

  • (備考)hh:mm- result
  • (時間のみ)05:00- '''''
  • (数分のみ)00:08- ,,,,,,,,
  • (時間<分)03:07- ;;;,,,,
  • (時間>分)08:02- ;;''''''
  • (時間=分)07:07- ;;;;;;;
  • (その日の始まり)00:00- 空の結果

「両方」の文字は最大23回使用できることに注意してください-23:xxの場合、xxは23以上です。

記号

あなたの言語で文字エスケープする必要がある場合(ルール5を参照)、それを代替の1つに変更できます。上記の選択肢では不十分な場合は、他の記号を使用できますが、合理的なものにしてください。逃げることが障壁になりたくないのです。

  • ;(セミコロン) -時間と分の両方のマーカー(ALT: :
  • '(アポストロフィ) -時間のマーカー(ALT: '``°
  • ,(カンマ) -分間のマーカー(ALT: .

追加のルール

  1. 最小バイト数のコードが勝ちです!
  2. 可能な限り両方のシンボルを使用する必要があります。02:04の場合、結果は'',,,,、またにはなりません;',,,。でなければならない;;,,
  3. 入力-スクリプト/アプリパラメーター、ユーザー入力(readlineなど)、またはコード
    3.1 内の変数を使用できます。コード内の変数を使用する場合、その長さは可能な限り長くする必要があります。それはだ1439、それは次のようになりますので、(午後11時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)

アドナン、私の投稿を編集してくれてありがとう!このようにして、初心者のゴルフとあなたのゴルフを比較して学習します:)
Krzysiu

3
問題ない!これは非常に良い最初の投稿であり、素晴らしい挑戦です:)
アドナン

1
これはセミコロンとカンマだけでとても良いように見えますが、アポストロフィはそれをすべて
覆い隠し

実際に1439はそうでは23:59ありません1339。(23 x 60 + 59)。
insertusernamehere

良い言葉をありがとう。:) @Sparr、ええ、悪い点だという:(あなたは右固定だもちろんそれは交換することができる方法のアイデアinsertusernamehere、持っている!:)を?
Krzysiu

回答:


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セッド、37

スコアには-Esedのオプションの+1が含まれます。

bashの答えのゴルフネスには特に感銘を受けませんでしたので、楽しみのためにsedを試してみようと思いました。

このメタ回答に従って、入力は単項です。

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

@Krzysiu-OK?うーん。で、このサイトで、私はそれは優秀のマークになると思います。そうでなければ、ほぼ間違いなくいいえ。プログラマがAPIから外れて実装の詳細を使用すると、プログラムはバージョン/実装に依存するようになります。これは悪いことです。
mikeserv

6

Python 2、56バイト

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

印刷する関数(1文字より短い1文字t=input();)。

この方法はLoovjoに似ています。の数は,分と時間で異なり、暗黙的な最小値は0 'です。の場合、それは否定です。の場合;、最大で数時間かかるminことにより暗黙的に計算し;、次に分数に切り捨てます。

ここで保存する文字は保存されますがd、時間と分は保存されません。ラムダのアナログは2文字長かった(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]

2バイトを節約してくれた@ F.Hauriに感謝します。


いいね!しかし、スワップ$1$2て3行目にp()書き込むことp , $cで2文字節約できます。
F. Hauri

はい、それはでのみ使用されますようprintf "%s"持つ、c(再利用されていないが)、空の意志の仕事の罰金を
F. HAURI

@ F.Hauri今、それを手に入れました-ありがとう!
デジタル外傷

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文字として&整数リテラルを使用すると、1バイト節約され、マクロ内のセミコロンを引くと、さらに2つ節約されます:)
Quentin

@Quentinのメモを取り、5バイトを保存
Khaled.K

while#defineマクロの前にスペースを失う可能性があります。-1バイト
アルバートレンショー

1
また、p(a、b)をマクロではなく関数にするだけで、さらにバイトを節約できます。(さらに、メイン関数にさらにセミコロンを振りかける)
アルバートレンショー

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指定された長さが負またはゼロの場合に空の文字列を返すため、両方の差に適用でき、正の差のみが表示されます。最初の部分は簡単です。セミコロンの数は2つの最小値にすぎないからです。次にzipWith、対応するアイテムに関数を適用します。

編集:間違った文字を数分間使用していたことに気付きました

編集2:@ライコニのおかげで2バイト保存


あなたは置き換えることによって、2つのバイトを保存することができますconcat$id=<<
ライコニ

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バイト節約


最初の擬似3項を使用して、その中に$mand $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

失敗し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
チョイス

1

Perl 6の、103の 101 98 97 69バイト

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

いくつかの配列を出力しますが、性交して楽しんでください。いつものように、ゴルフの機会はすべて実現されます。

編集:-2バイト:勇敢になり、いくつかのキャストを削除しました。

Edit2:配列を削除して-3バイト。

Edit3:-1バイトを正しい形式で印刷するには、「ラムダ」を使用して、パラセテスを削除します。

編集4 :(ごめんなさい)その時間を乱用-分は0とその逆を返すはずです ifステートメントを削除しました。次に、ブラケットを削除し、ラムダがまったく必要ないことに気付きました。-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--;、すべての反復で1回だけ必要になり、{}for if/elseは廃止されます。
insertusernamehere

また、あなたの第2の条件で数バイトを保存することができます。代わりにelse if(h&&!m)あなただけ持つことができますelse if(h)
ヘリオンに

最後に、三項演算子を使用してみてください。これによりif、やなどの「長い」単語を使用する必要がなくなりますelse
insertusernamehere

入力をintパラメータとして受け取る関数としてのリファクタリングを検討してください-少なくともscanf()
デジタル外傷

私はそれ%24が必要だとは思わない-最大入力は23:59です。
デジタル外傷

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

ルビー、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
:保存した文字列を切り捨てる代わりの分を使用して、1つの文字(?;*h=t/60)[0,m=t%60]
GB

1
Mからの時間を減算することによって、別のバイト:",',"[0<=>m-=h]*m.abs
GB

0

05AB1E、25バイト

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

オンラインでお試しください!

60‰vy„'.Nè×}間違いなく短くすることができますが、私はそれを理解できませんでした×


例(入力が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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.