ASCII годинник з маркерами часу та крапки


39

Вступ

код пояснення гольфу

Уявіть, що лінія знаків насправді два ряди. Верхній рядок - крапки - представляє години (24-годинна система), а нижній - коми - представляє хвилини . Один символ може представляти годину, хвилину або обидва - коли це можливо.

Спочатку, напевно, вам доведеться перетворити хвилини з півночі на години та хвилини .

Результат - рядок, що показує поточний час у "крапковому форматі". Відлік точок ( апостроф вважається тут крапкою і буде називатися так! ) - це кількість годин з півночі, а число комами - кількість хвилин. Я покажу кілька прикладів, щоб це було зрозуміло.

  • (Зауваження) hh: mm - result
  • (Лише години) 05:00 - '''''
  • (Лише хвилин) 00:08 - ,,,,,,,,
  • (годин <хв.) 03:07 - ;;;,,,,
  • (години> хвилини) 08:02 - ;;''''''
  • (годин = хвилин) 07:07 - ;;;;;;;
  • (початок дня) 00:00 - ( порожній результат )

Зауважте, що символ "обидва" можна використовувати максимум 23 рази - для 23: xx, де xx - 23 або більше.

Символи

Якщо персонаж повинен (див правило 5.) екранувати на вашій мові, ви могли б змінили його на одну з альтернатив. Якщо зазначених альтернатив недостатньо, ви можете використовувати інші символи, але зберігайте це розумно. Я просто не хочу, щоб втеча була перешкодою.

  • ;(Точка з коми) - маркер для обох годин і хвилин (альт: :)
  • '(Апостроф) - маркер для годин (альт: '``°)
  • ,(Кома) - маркер хвилин (альт: .)

Додаткові правила

  1. Код з найменшою кількістю байтів виграє!
  2. Ви повинні використовувати обидва символи, коли це можливо. Для 02:04 результату бути не може '',,,,, ані ;',,,. Це повинно бути;;,,
  3. Введення - це може бути параметр сценарію / програми, введення користувача (наприклад, лінія зчитування) або змінна всередині коду
    3.1. Якщо використовується внутрішня змінна код, то її довжина повинна бути якомога довшою. Це 1439(23:59), так би виглядалоt=1439
  4. Загальна частина, що символізується символом "обидва" (12 в 12:05, 3 в 03:10), повинна бути розміщена на початку рядка
  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
це виглядає так добре лише крапками з комою та комами, але апострофи зривають це все :(
Sparr

Насправді 1439є 23:59і ні 1339. (23 х 60 + 59).
Вставтекористувач

Дякую всім за добрі слова! :) @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 Sed, 37

Оцінка включає +1 за -Eваріант сіт.

Я не був особливо вражений гольфністю моєї відповіді на баш , тому я подумав, що спробую з 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 - гаразд? хм. на цьому сайті я думаю, що це буде знаком передового досвіду. інакше майже точно немає. коли програмісти відхиляються від API та використовують деталі реалізації, програми стають залежними від версії / реалізації - це погано.
mikeserv

6

Python 2, 56 байт

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

Функція, яка друкує (на один знак коротше, ніж t=input();).

Метод схожий на метод Лооджо . Кількість ,є різною між хвилинами та годинами, з неявним мінімумом 0. Бо 'це заперечення. Тому що ;, обчислюється minнеявно, забираючи стільки ;годин, а потім обрізаючи кількість хвилин.

Це дозволяє економити символи d, але не кількість годин і хвилин тут. Аналог з лямбда був на два знаки довший (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і $2в p()і написати p , $cв рядку 3.
F. Hauri

Так, але оскільки він використовується лише в a 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& цілих літералів як символів економить один байт, витягуючи крапки з комою всередині макросу, економить ще два :)
Квентін

@ Quuentin Примітка зроблена, збережено 5 байтів
Khaled.K

Ви можете втратити місце перед вашим whileу макросі #define. -1 байт
Альберт Реншо

1
Ви також можете зберегти ще кілька байтів, просто зробивши функцію p (a, b) замість макросу. (І посипавши ще трьома напівколонами до вашої основної функції)
Альберт Реншо

3

Хаскелл, 68 66 байт

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

Приклад використання:

(g.(`divMod`60)) 482

Розумний біт тут полягає в тому replicate, що поверне порожню рядок, якщо вказана довжина від’ємна або нульова, тому я можу застосувати її до обох відмінностей, і з’явиться лише позитивна. Перша частина проста, оскільки кількість крапки з комою - це як мінімум з двох. Потім zipWithзастосовується функція до відповідних елементів.

EDIT: Зрозуміло, що я використовував неправильний знак протягом декількох хвилин

EDIT 2: Збережено 2 байти завдяки @Laikoni


Ви можете зберегти два байти, замінивши 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)

Використання метод Лоуджо , це моя реалізація оболонок.

неозорий

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)

Збережено 14 байт завдяки AdmBorkBork


Ви можете зберегти, використовуючи псевдотермінал для першого, переміщуючи в нього $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 досить добре, але бачу | вперше. Думаю, я використаю це для трохи вправ - проаналізую це :)
Кшисю

Невдачі для 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 байт). Btw: одна цитата робить -rнеможливою; тому вам слід використовувати backtick годинами, якщо вони є рядком або °окремим (не потребує лапок -> -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 байт для друку у правильному форматі, використовуючи "лямбда" та видаляючи парантези.

Edit4: (вибачте, хлопці), зловживаючи цими годинами - хвилини повинні повернути 0 і навпаки. Видалено, якщо заяви. Потім зняти дужки, потім зрозуміти, що мені зовсім не потрібна лямбда. -28 байт :)

Woah їм стає краще в цьому.


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--;лише раз на кожній ітерації, і {}для if/elseцього застаріло б.
Вставтекористувач

Ви також можете зберегти кілька байтів на своєму другому умовному: замість цього else if(h&&!m)ви можете просто матиelse if(h)
Hellion

І нарешті спробуйте скористатися термінальним оператором, це позбавить вас від використання "довгих" слів типу ifі else.
Вставтекористувач

Розгляньте рефакторинг як функцію, яка приймає вхід як int-параметр - це має принаймні зберегти вас scanf().
Цифрова травма

Я не думаю, що %24це потрібно - максимальний вклад - 23:59.
Цифрова травма

0

Гема, 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

Матлаб: 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}

Завдяки:

  • ГБ за
    • нагадуючи мені, що я не можу взяти більше рядків із рядка, ніж у нього (-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 символ, обрізаючи рядок, а не використовуючи min:(?;*h=t/60)[0,m=t%60]
GB

1
І ще один байт, віднявши h від m:",',"[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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.