Завантаження… Назавжди


106

Ваше завдання - зробити нескінченний екран завантаження, який виглядає приблизно так:

введіть тут опис зображення


Або, якщо бути конкретнішим:

  • Не беруть ніяких даних.
  • Вихідні дані Loading...з пробілом, але без зворотнього рядка.
  • Нескінченно цикл через символи |, /, -і \: кожні 0,25 секунд, перезаписати останню з наступним в послідовності. Ви можете перезаписати лише останній символ або видалити та переписати весь рядок, поки довгий час Loading...залишається незмінним.

Правила

  • Вихідний текст повинен виглядати точно так, як зазначено. Приймаються нові рядки / пробіли.
  • Ви повинні НЕ чекати 0,25 секунди , перш ніж спочатку показуючи висновок - перший кадр повинен бути надрукований , як тільки програма запускається.
  • Ваша програма повинна мати можливість працювати безстроково. Наприклад, якщо ви використовуєте лічильник для кадрів, лічильник ніколи не повинен викликати помилку, перевищуючи максимум у вашій мові.
  • Хоча період очікування між кожним "кадром" повинен становити 0,25 секунди, очевидно, це ніколи не буде точним - допускається похибка в 10% або більше.
  • Ви можете надіслати функцію, але вона повинна надрукуватись stdout.
  • Ви можете надіслати відповідь у неконсольному (але все ж текстовому) середовищі, якщо воно здатне створити анімацію завантаження.
  • Це , тому найкоротше рішення (в байтах) виграє. Діють стандартні лазівки з кодовим гольфом.
  • Якщо можливо, надайте gif вашого завантажувального екрана в дії.

Приклад

Ось код C ++, який я використовував для створення прикладу (ungolfed):

#include <iostream>
#include <string>
#include <thread>

using namespace std;

int main() {
    string cycle = "|/-\\";
    int i = 0;

    cout << "Loading... ";

    while (true) {
        // Print current character
        cout << cycle[i];

        // Sleep for 0.25 seconds
        this_thread::sleep_for(chrono::milliseconds(250));

        // Delete last character, then increase counter.
        cout << "\b";
        i = ++i % 4;
    }
}

Нехай переможе найкращий гольфіст!


3
Чи можуть повідомлення чекати 0,25 секунди, перш ніж відображати вихід?
ETHproductions

2
Ні, але дякую, що згадуєте про це, я додам його до правил @ETHproductions
FlipTack

Чи прийнятний останній рядок (після анімаційного символу)?
Мідь

Звичайно :) @Copper
FlipTack

1
@TheBitByte це означає, що теоретично, всередині вашої програми не призведе до помилок - наприклад, переповнення лічильника або досягнення максимальної глибини рекурсії.
FlipTack

Відповіді:


76

HTML / CSS, 183 180 163 161 160 147 143 байт

a{display:inline-flex;overflow:hidden;width:1ch}c{animation:c 1s steps(4)infinite}@keyframes c{to{margin:0-4ch
<pre>Loading... <a><c>|/-\</pre>

Редагувати: збережено 3 байти завдяки @betseg. Збережено 17 байт завдяки @manatwork. Збережено 1 байт завдяки @Daniel. Збережено 13 байт завдяки @Ismael Miguel. Збережено 4 байти завдяки @Fez Vrasta.


4
Відповідно до мета, CSS + HTML чудово відповідає на запитання. Крім того, я допустив це в описі виклику. Тож ця відповідь цілком справедлива :)
FlipTack

5
HTML + CSS - це TC, тому я не розумію, чому це може бути неконкурентом
TuxCrafting

1
@ TùxCräftîñg CSS, безумовно, не закінчується, оскільки ви можете вирішити в ньому проблему зупинки (Якщо не існує нескінченної анімації, вона зупиняється). Я думаю, те саме стосується і HTML (якщо ви не включаєте JS).
Художник

4
@Artyer stackoverflow.com/a/5239256/3273184 що - то варто задуматися.
Mama Fun Roll

4
@MamaFunRoll У коментарі до цього допису зазначається, що це насправді не доводить це TC, оскільки він не може циклікувати без втручання користувача. Однак це може вирішити цю проблему, тому я не бачу жодної проблеми з цією відповіддю.
ETHproductions

57

Vim, 43 , 41 байт

qqSLoading... |<esc>:sl250m
r/@:r-@:r\@:@qq@q

Два байти збережено завдяки @Udioica!

Ось (трохи застаріла) анімація про це відбувається в режимі реального часу!

введіть тут опис зображення

І ось пояснення:

qq                              " Start recording into register 'q'
  SLoading... |<esc>            " Replace all of the text in the buffer with 'Loading... |'
                    :sl250m     " Sleep for 250 ms
r/                              " Replace the bar with a slash
  @:                            " Re-run the last ex command (sleeping)
    r-                          " Replace the slash with a dash
      @:                        " Re-run the last ex command (sleeping)
        r\                      " Replace the dash with a backslash
          @:                    " Re-run the last ex command (sleeping)
            @q                  " Run macro 'q' (the one we're recording)
              q                 " Stop recording
               @q               " Call macro 'q', which will run forever because it's recursive

1
просто цікаво: чи це порушує "Ваша програма повинна мати можливість працювати безстроково"? чи може вона врешті-решт досягти переповнення стека? :)
Дан Дуб

4
@dahnoak Ну, очевидно, я не можу нескінченно перевірити це, але це не виділяє зайвої пам’яті, тому я не бачу жодної причини, яка б не працювала на невизначений час.
DJMcMayhem

1
Якщо перейти iна Sта перемістити його всередині макроса, ви можете пропустити його r|.
udioica

2
@dahnoak Немає причин, чому двигун vi не міг помітити хвостову рекурсію. І деякі реалізації рекурсії зробили б це природно (уявіть, якщо є вектор команд, які слід виконати, і поточне місце виконання. Потім @qбуде вставлено в поточному розташуванні вміст скрипту реєстру q. Не потрібен стек і ні пам'яті , виділеної , якщо немає команди для запуску після @q того, як всередині q).
Yakk

Майже щоразу, коли ви публікуєте відповідь на виклик, я дізнаюся щось нове (в даному випадку @:і :sl), тож дякую і продовжуйте їх надходити :)
Крістіан Рондо

37

HTML + JS (ES6), 20 + 51 50 = 70 байт

setInterval(_=>a.innerHTML='|/-\\'[i=-~i%4],i=250)
Loading... <a id=a>-

-1 байт (Захарій Т)

Ознайомтеся також з моєю відповіді на 132 байт HTML / CSS .


Може це перелив i?
Zacharý

Так, це врешті-решт було б. Виправлено це!
darrylyeo

1
Чи не могли б ви замінити i++,i%=4з i=-~i%4на байти?
Zacharý

2
@Xufox <pre>Єдиний забезпечений одношаровий шрифт був використаний, щоб chодиниці працювали. У правилах нічого не згадується про використовувану сімейство шрифтів. ;)
darrylyeo

1
Якщо я не помиляюся, перший символ, надрукований JS, буде останнім у рядку; тож слід ініціювати -замість цього /. Або запустити |і пропустити наскрізь '-\\|/'. Хороший приріст, хоча.
Тит

21

Пакет Windows, 121 114 84 80 79 78 байт

Просто викидаючи це для задоволення.

for %%b in (/ - \ ^|)do (cls
@echo Loading... %%b
ping 1.1 -n 1 -w 250>nul)
%0

Мені не вдалося призначити pipe ( |) до масиву, тому мені довелося додати його вручну з іншим завданням.Затримка робиться за допомогою PING, яка може бути неточною .

Вихід:

введіть тут опис зображення

Редагувати:

  • Дякуємо Роману Гряфу за збереження 7 байт!
  • Дякуємо Нілу за збереження 30 байт! Я також трохи більше налаштував це, щоб зберегти байти на нових рядках.
  • Завдяки phyrfox за збереження 4 байт!
  • Завдяки YourDeathIsComing за збереження 2 байтів!

3
Ви можете зняти @echo offта поставити @перед кожним setчи echoкомандою
Роман Гряф

1
Вам не потрібен масив, in (/ - \ ^|)працює. Крім того,% 0 - це коротший шлях до циклу, ніж goto.
Ніл

2
Ви повинні мати можливість використовувати IP-адресу "1.1" (-4 байти), тому що більшість платформ автоматично розгорне цю версію до 1.0.0.1.
фірфокс

1
Ви можете зберегти 1 байт, видаливши пробіл перед >nul.
YourDeathIsComing

1
Я мав на увазі простір перед ним, а не після нього.
YourDeathIsComing

20

Вузол, 72 70 байт

f=i=>console.log('\x1BcLoading... '+'|/-\\'[setTimeout(f,250,i=-~i%4),i])

Замініть \x1Bбуквальним символом втечі, щоб отримати правильний підрахунок байтів. Зателефонуйте, f()щоб почати анімацію. Ось як це виглядає в емуляторі терміналу ConEmu на моєму комп’ютері:

введіть тут опис зображення


Спробуйте скористатися \033c(замініть \033його фактичним представництвом char). Це виглядає не так добре, але це економить кілька байт.
Mama Fun Roll

Не iпереповниться?
Zacharý

12
@ZacharyT Це буде через 71 мільйон років, але я можу виправити це, якщо потрібно
ETHproductions

3
"Ваша програма повинна мати можливість працювати безстроково. Наприклад, якщо ви використовуєте лічильник для кадрів, лічильник ніколи не повинен викликати помилку, перевищуючи максимум у вашій мові.", Так, це необхідно.
Zacharý

3
@Florent Але тоді він не працюватиме на Node ;-)
ETHproductions

14

Котлін, 67 66 байт

while(1>0)"|/-\\".map{print("\rLoading... $it");Thread.sleep(250)}

введіть тут опис зображення

Досить зрозумілий, використовуючи, \rщоб очистити лінію та скориставшись дивовижною інтерполяцією Котліна.

EDIT: Збережено 1 байт завдяки @ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu, змінивши while(true)наwhile(1>0)


1
Ви можете зберегти один байт, використовуючи while(1>0)замість while(true)(-1) і, ймовірно, слід включити у свою відповідь фактичний синтаксис функції ( fun a(){<code>}, +9). Якщо ви хочете бути трохи обманливим, ви можете використовувати функцію зберігання як змінну ( val a={<code>}, +8).
Ф. Джордж

2
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Неприйнятний режим "повної програми"? Це може бути запущено як сценарій Котліна .ktsбез визначень класів або функцій. Також чудовий дзвінок while(1>0)!
Тайлер МакДонлл

3
Але що робити, якщо одного дня 0 стає більшим за 1 ???? : P
FlipTack

Відмінна ідея використання сценарію Котліна. @ Flp.Tkc Ваш коментар нагадав мені про це: codegolf.stackexchange.com/a/101131/62024 . Ще тремтить, що це можливо.
Ф. Джордж

@TylerMacDonell Дійсно? Я не знав, що ви можете запустити kotlin безпосередньо як сценарій. Дякуємо за інформацію.
TheNumberOne

14

Vim, 35 байт

iLoading... \-/|<Esc>qqdb:sl250m<CR>p@qq@q

Нудна версія. Ось краще невідповідне рішення:

Vim (1 секунда сну), 27 байт

idbgsp@@<C-U>Loading... \-/|<Esc>@.

Використання gsне тільки набагато коротше, але й не потрібно натискати на Enter. Це означає, що макрос підходить в рядок, і я можу зберегти байти, перейшовши на @.. (Оскільки після рекурсивного дзвінка нічого не може працювати, я можу набрати все, що хочу.)


Дякую за цю відповідь! Я дізнався gs, @.і @@всередині @.все ще болить голова!
Крістіан Рондо

14

Pyth, 31 байт

Wm,p+"\rLoading... "d.d.25"|/-\

Перекладач тут .

Завантаження GIF

Пояснення

Wm,p+"\rLoading... "d.d.25"|/-\
    +"\rLoading... "d              Concatenate the string "\rLoading... " and the variable d
   p                               Print the result without a newline
                     .d.25         Sleep for 0.25 seconds
  ,                                Form a two-element list with the results of the two statements above. This is only needed to execute both statements in a single lambda function.
 m                        "|/-\    Map the above statement over the characters in the string "|/-\", setting the variable d to the character for each iteration
W                                  While the result of the map statement is true, do nothing

13

Powershell (v4), 57 56 54 53 58 57 Байт

Повернувшись до Bytecount, з якого я почав!

for(){cls;"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}

На деяких комп’ютерах CLI в паттерні потужності трохи виблисне, тому він не виглядає ідеально, але це так добре, як я можу отримати.

Переміщено $ a ++ у цикл for, щоб зберегти один байт, (ні ;)

Потім перемістив його в індексатор масиву, щоб зберегти ще 2 байти, завдяки Роману за те, що вказав на це.

Також збережено ще 1 байт ( ;), перемістивши clsчастину Очистити екран ( ) у цикл for.

Випуск та виправлення, вказане TimmyD на нескінченний аспект питання, потрібно лише +5 байт, змінених $a++%4на ($a=++$a%4)так, щоб він ніколи не перевищував 3.

Збережено ще один байт, залишивши цикл for абсолютно порожнім, завдяки «що завгодно» за те, що вказав, що це фактично можливо у Powershell Версії 4!

Новий оновлений gif для (остаточної?) Версії цієї відповіді.

Завантаження Gif

for(;;cls){"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}

for(;;cls){"Loading... "+"|/-\"[$a++%4];sleep -m 250}

for(;;){"Loading... "+"|/-\"[$a++%4];sleep -m 250;cls}

for(;;$a++){"Loading... "+"|/-\"[$a%4];sleep -m 250;cls}

for(;;){$a++;"Loading... "+"|/-\"[$a%4];sleep -m 250;cls}


2
for(;;){"Loading... "+"|/-\"[$a++%4];sleep -m 250;cls}(перехід $a++до останнього використання $a)
Роман Гряф

завжди щось забуваючи - за це дякую!
colsw

2
Я не дуже вмілий у Powershell, але коли побачив запис Windows Batch, я подумав: "Чи міг би Powershell це перемогти?". І ось воно!
Якуб Янковський

1
Принаймні, на ps v4 ви повинні мати можливість ще одного байта, зберігаючи умови абсолютно порожніми:for(){cls;"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}
б

1
Ласкаво просимо. Насправді, здається, це працює для версії 2+, раніше було занадто ліниво перевіряти;)
б

11

Pyth - 36 35 байт

#+"\033cLoading... "@"\|/-"~hZ.d.25

Очевидно, це не працює в Інтернеті.


Чи є у вас gif цього в дії? Також чи є лічильник, який міг би переповнитись?
FlipTack

@ Flp.Tkc єдиним лічильником є Zціле число пітона, яке не переповнюється. Я намагався зробити gif, але не міг змусити його працювати. Якщо ви знаєте, як це зробити, можете запустити його з інтерпретатором pyth за
Maltysen

4
Якщо ціле число не переповниться, воно, ймовірно, зростатиме до заповнення всієї пам'яті, що призведе до виходу з ладу принаймні через 10⁶⁵⁰⁰⁰⁰⁰⁰⁰ років у більшості 32-бітних систем. Звичайно, спочатку станеться теплова смерть Всесвіту, але все ж ...
jjrv



9

Математика, 74 67 байт

ListAnimate["Loading... "<>#&/@{"|","/","-","\\"},AnimationRate->4]

Широкі 7 байт завдяки @dahnoak


ListAnimate["Loading... "<>#&/@Characters@"|/-\\",AnimationRate->4]
Дан Дуб

1
@dahnoak ура! Я не розумів, що ListAnimate - це річ. Прикро, що <>Flat is not Listable, інакше ще 4 байти можуть бути поголені!
Сіммонс

Просто для розваги:Dynamic["Loading... "<>{"|","/","-","\\"}[[1+Round[4Now@"Second"]~Mod~4]],UpdateInterval->.25]
shrx

9

C #, 170 133 Байт

void X(){Console.Write("Loading...  ");for(;;){foreach(var c in "|/-\\"){Console.Write("\b"+c);System.Threading.Thread.Sleep(250);}}}

Велика подяка Роману Гряфу та рознагалу, який врятував мені 37 байт. (Особливо рознагал, який зазначав, що моє оригінальне рішення все одно було недійсним. Я якось пропустив щось там, але це виправлено зараз і повинно відповідати вимогам :)

досить схожий на існуючу відповідь Піта Ардена C #, але з деякими вдосконаленнями

наприклад, "for (;;)" замість "while (true)", char замість рядка

Я б прокоментував свої пропозиції щодо його відповіді, але насправді у мене недостатньо репутації для цього.

Безголовки:

static void X()
{
    Console.Write("Loading...  ");
    for (;;)
    {
        foreach (var c in "|/-\\")
        {
            Console.Write("\b" + c);
            System.Threading.Thread.Sleep(250);
        }
    }
}

2
Чому першого не видалити Console.Write("\b");та не змінити другого Console.Write("\b"+a);?
Роман Ґраф

Визначати дію не потрібно і довго використовувати цикл, як-от foreach(var a in"|/-\\")і додати код, який у вас зараз є в дії, оскільки тіло заощадить ~ 20 байт.
raznagul

Також завдання полягає в тому, щоб точно створити необхідний вихід. Що зараз не так.
рознагул

Має бути так, зараз я забув '|' та пробіл після "Завантаження ...".
Сніжна пожежа

У вашій безгольовій версії (оскільки вона не відповідає версії для гольфу), ви можете видалити першу Console.Write()та використовувати лише одну, Console.Write($"Loading... {c}\r")а не другу.
молоко

9

По-четверте, 72, 73 байти

Редагувати :

  • Додана версія лише для Gforth, 69 байт (спасибі @ninjalj!)
  • Додано пропущений пробіл після "Завантаження ..." (Thx @ Roman Gräf!), +1 байт
  • Оновлено, щоб точніше відповідати правилам (в одному байті)

Гольф

: L '| '/ '- '\ begin .\" \rLoading... " 3 roll dup emit 250 ms again ; L

Версія Gforth

Версія лише для GNU Forth може бути зведена до 69 байтів так:

'| '/ '- '\ [begin] .\" \rLoading... " 3 roll dup emit 250 ms [again]

Екранна трансляція

введіть тут опис зображення

Спробуйте в Інтернеті!


1
Оскільки ви використовуєте gforth, якщо ви не переймаєтесь переносністю до інших Forth, ви можете використовувати [begin]і [again]поза визначенням слова.
ніндзя

9

Python 2, 81 79 78 77 байт

import time
i=1
while 1:print'\rLoading...','\|/-'[i%4],;i+=1;time.sleep(.25)

Досить просте рішення, яке спить за допомогою time.

Я використовую \r(Повернення каретки), щоб повернутися до початку рядка, а потім надрукувати повідомлення, що перезаписує рядок.

Я починаю з того, i=1щоб уникнути подвійного втечі \(Це '\|/-'замість '|/-\\').

У минулому я раніше мав -~iна увазі i + 1уникати дужок. (Завдяки @ Flp.Tkc за ці -2 байти!) (Це було i=(i+1)%4проти i=-~i%4)

Тепер я просто даю лічильнику піднятися назавжди, оскільки технічно Python ints не може переповнюватись. Дякуємо @Zachary T за вказівку на це та збереження байта!
Він зупиняється лише на машині, оскільки в апараті не вистачає пам'яті, але для цього потрібно 9,7 поколінь із 4 Гб пам'яті int.

Завдяки @Kade за -1 байт, де print a,bроздруковані відбитки aта bпростір, тому мені не потрібен власний простір.

Ось його подарунок, який працює в Windows:

Завантаження

Я тестував його і на Linux VM. Я не міг перевірити це на Mac.


1
Якщо я правильно пам'ятаю, ви можете використовувати i=-~i%4для збереження байтів для паронів :)
FlipTack

2
Чи не замінювати [i],;i=-~i%4з [i%4],;i+=1зберегти байт , так як вона не перевищує максимальну для Python, тільки максимальний обсяг пам'яті?
Zacharý

9
Я повинен порушити вас, щоб увійти як Administrator
Ніл

5
@Neil Якщо чесно кажучи, я просто поклав файл Python в Адміністратор і запустив його звідти, оскільки інші імена облікових записів - справжні імена (Персональний ПК).
Artyer

2
Я дозволю пропозицію @ZacharyT, оскільки технічно цілі числа Python можуть бути нескінченно великими, доки у комп'ютера є пам'ять для їх зберігання
FlipTack

7

MATL , 36 байт

1 байт видалено за допомогою ідеї @ flawr про кругове зміщення рядка

'\-/|'`Xx1YS'Loading... 'y1)hD.25Y.T

Ось gif-запис із офлайн-компілятора:

введіть тут опис зображення

Або спробуйте в MATL Online! Якщо вона спочатку не запускається, оновіть сторінку та натисніть «Виконати» ще раз.

Як це працює

'\-/|'           % Push this string
`                % Do...while
  Xx             %   Clear screen
  1YS            %   Circularly shift thr string 1 step to the right
  'Loading... '  %   Push this string
  y              %   Duplicate the string of shifting symbols
  1)             %   Get the first character
  hD             %   Concatenate the two strings and display
  .25Y.          %   Pause for 0.25 seconds
  T              %   Push "true". This is used as loop condition, to it
                 %   generates an infinite loop
                 % End loop implicitly

Гей Луїс. добре зроблено з MATL, як завжди. Ось невелика зміна кругового списку. і відображення. Як ви думаєте, ви могли б перекласти це у ще коротший розв’язок:a='\|/-';k=1; fprintf('Loading... -') while 1 k=mod(k,4)+1; fprintf('\b\b%c\n',a(k)); pause(.25); end
Хокі

@Hoki Дякую за ідею. Насправді я спочатку мав зростаючий лічильник модуля 4, але це було трохи довше (потім я отримав байт через вимогу не мати початкової паузи). Крім того, я думаю, що чіткий екран і нормальний дисплей коротший, ніж fprintfу зворотних просторах
Луїс Мендо

7

Діалог APL, 50 байт

Це працює лише у версії Windows, оскільки в іншому випадку ⎕SMвікно не відображатиметься, якщо не ⎕SRбуде викликано.

{⎕SM←1 1,⍨⊂⊃⍵⌽'Loading... '∘,¨'|/-\'⋄∇4|⍵+⌈⎕DL÷4}1

Пояснення:

  • {... }1: запустити функцію, починаючи з⍵=1
  • Loading... '∘,¨'|/-\': генерувати чотири можливі виходи
  • ⊂⊃⍵⌽: Поверніть список, щоб спочатку поставити перший елемент, візьміть перший елемент і додайте його
  • ⎕SM←1 1,⍨: покладіть рядок у верхній лівий кут ⎕SMвікна.
  • ⎕DL÷4: зачекайте 1/4 секунди
  • 4|⍵+⌈: округлюйте отримане значення (секунди, витрачені на очікування, тому це завжди 1), додайте його до (збільшуючи) та візьміть мод-4 (щоб уникнути його переповнення).
  • : запустити функцію знову з новою .

Анімація


Я якось знав, що хтось подасть відповідь на цей виклик для Dyalog (/ APL) :)
YoYoYonnY

7

C #, 187 байт

Гольф:

void L(){Console.Write("Loading...");Action<string>l=(a)=>{Console.SetCursorPosition(11,0);System.Threading.Thread.Sleep(250);Console.Write(a);};while(true){l("|");l("/");l("-");l("\\");}

Безголовки:

public void L()
{
  Console.Write("Loading...");
  Action<string> l = (a) =>
  {
    Console.SetCursorPosition(11, 0);
    System.Threading.Thread.Sleep(250);
    Console.Write(a);
  };
  while (true)
  {
    l("|");
    l("/");
    l("-");
    l("\\");
  }
}

Ще чекаю, поки він завантажиться ...

введіть тут опис зображення


Ще чекаю, що на дисплеї з'явиться “\”…
маніпуляція

@manatwork О, лайно, лінива копія та вклеювання. Виправлю це, коли незабаром я повернусь до свого столу :)
Піт Арден

Вибачте за те, що ваше рішення стає довше через мого коментаря. Ви не можете використовувати 1>0замість того, trueщоб повернути його до 186?
манатура

@ErikGolfer エ リ ッ ク ゴ ル フ ァ ー, поняття про C # не маю, але виходячи з того, що мова є копією Java і, мабуть, підтверджено Can't cast int to bool , я подумав, що це не вийде. (BTW, якщо це працює, можливо, використання першого дзвінка l()як умови також буде спрацьовувати?)
manatwork

2
@manatwork Добре, здається, що C # є нездійсненним.
Ерік Аутгольфер

7

Snap !, 8 блоків

8 блоків Snap!

Це був один із перших алгоритмів, які я коли-небудь спантеличував в Apple] [e


1
Покажіть нам свій Applesoft BASIC :)
roblogic

1
Я з радістю зробив би це в Hypercard.
wyldstallyns

6

ретикулярна, неконкурентна, 40 байт

:i=@C"Loading... "o"|/-\\".iHo14%w.i1+4,

введіть тут опис зображення

Я забув здійснити купу речей, в тому числі w. Ну добре.

Пояснення

:i=@C"Loading... "o"|/-\\".iHo14%w.i1+4,
:i=                                       set `i` to the TOS
   @C                                     clear the screen
     "Loading... "o                       output that string
                   "|/-\\"                push that string
                          .i              get `i`
                            H             get the `i`th character of that string
                             o            and output it
                              14%         push 0.25 (1/4)
                                 w        wait that long
                                  .i      get `i`
                                    1+    increment
                                      4,  mod 4
                                          this wraps around the beginning of the program,
                                          setting i to the said value

6

Баш, 98 69 байт

while s='\|/-';do
printf "\rLoading... ${s:i=++i%4:1}"
sleep .25
done

Дякую багатьом людям за багато байтів, що відійшли в гольф!


Крім того, вам не доведеться уникати зворотної косої риси, якщо ви використовуєте одинарні лапки, і аргументи для цього echo -e -nможна поєднувати зecho -en
Еван Чен

Ви можете зберегти 2 рядки та 13 байт, замінивши лінію ехо на:echo -en "\rLoading... ${s:i=(i+1)%4:1}"
Ipor Sircer

echo -enprintf; зробити завдання whileумовою s .
манатура

використовувати Printf як manatwork сказав, спростити подстроку і помістити його безпосередньо в whileстані: while printf "\rLoading... ${s:i++%4:1}";do. 67 байт
Домінік Р

Це не спрацює з Домініком R, але це може переповнитись.
Zacharý


6

> <> , 55 + 4 = 59 байт

"...gnidaoL"v
l?!voc1. ^:<>
<v<>'\|/-'>^v
^<^<<<8{<<^o<

Потрібно запустити, передаючи -t .01інтерпретатору як додатковий аргумент, це +4 у кількості байтів.

Для цього потрібно поставити чотири символи, які слід надрукувати на стеку, надрукувати верхній, не виймаючи його та перемістивши стек на одне положення. Потім він друкує \b(backspace, символ x08) і перезапускає цикл.

Час виконання досягається аргументом, переданим інтерпретатору, який змушує зачекати 0,01 секунди перед виконанням кожної інструкції. Існує 23 інструкції між вихідним та наступним (більшість з них просто переміщують покажчик інструкцій на наступну комірку), тому це зачекатиме 0,23 секунди плюс час, необхідний для виконання інструкцій, який без проблем вписується у запитувані 0,25 с з 10% помилкою.

Ви можете спробувати його в Інтернеті , але той інтерпретатор не розпізнає символ зворотної області, тому вихід буде дещо дивним.


Зазвичай такі прапори -nоцінюються як 1 байт, тому я думаю, що ви можете оцінити аргумент як t, .01що становить 4 байти. Гарне використання правила 10% btw :)
FlipTack

@ Flp.Tkc Дякую! Я не був впевнений у тому, як рахувати байти для аргументу, мені це подобається :)
Лев

@Leo - Чи є причина використання 0,01, а не більшого галочки з меншими інструкціями? Я додав свою версію, яка використовує цикл з 8 інструкцій і кількість галочок 0,03; # "... gnidaoL" l?! vob0. "\ | / -": o} 8o51. > #
Слізний пелікан

@Tealpelican Є причина, але це не дуже добре: правила зазначають, що "Ви не повинні чекати 0,25 секунди, перш ніж спочатку показувати вихід - перший кадр повинен бути надрукований, як тільки програма запущена", тому я не зробив Я не хочу робити таймер занадто довгим, в той час як з іншого боку це код гольфу, тому я не хотів робити його занадто коротким. Врешті-решт я вирішив провести цикл із 25 інструкцій, що займає по 0,01 секунди, щоб досягти точного часу запиту на 0,25 секунди; коли я його реалізував, я зрозумів, що мені не вистачає місця для повного циклу, тому мені довелося вдатися до використання правила 10%.
Лев

Я, мабуть, неправильно прочитав правила. Це цілком хороша причина для проведення часу :)
Пелікан Тіл

6

Файл MS-DOS .COM, 56 байт

Тут вміст файлу у шістнадцятковій:

b4 09 ba 2c 01 cd 21 b2 2f e8 11 00 b2 2d e8 0c
00 b2 5c e8 07 00 b2 7c e8 02 00 eb ea b4 02 cd
21 b2 08 cd 21 b9 05 00 f4 e2 fd c3 4c 6f 61 64
69 6e 67 2e 2e 2e 20 24

Відповідний код асемблера виглядає приблизно так:

    mov ah, 9      ; Print "Loading... "
    mov dx, text
    int 21h
theloop:
    mov dl, '/'    ; Call "chrout" for "/", "-", "\" and "|"
    call chrout
    mov dl, '-'
    call chrout
    mov dl, '\'
    call chrout
    mov dl, '|'
    call chrout
    jmp theloop    ; Endless loop

chrout:            ; Sub-Function "chrout"
    mov ah, 2      ; Output the character
    int 21h
    mov dl, 8      ; Output backspace
    int 21h
    mov cx,5       ; Call "HLT" 5 times
timeloop:
    hlt            ; Normally HLT will wait ~55 milliseconds
                   ; (Assuming no keyboard key is pressed)
    loop timeloop
    ret            ; End of the function

text:
    ASCII "Loading... ",'$'

1
Утримування натиснутої клавіші прискорює віджимання, яке можна виправити шляхом маскування переривань, окрім переривання таймера, наприклад:mov al, 0xfe / out 0x21,al
ninjalj

Коментар до HLT невірний, ви, мабуть, мали на увазі, що HLT прокидається при ~ 18,2 Гц (або, точніше, в тактовий час NTSC / 12/65536 Гц).
ніндзя

@ninjalj Дякую Я змінив коментар ...
Мартін Розенау

6

NASM x86_64 - 349 283 байт

Для цього слід запустити 64-бітні системи Linux

побудовано за допомогою:

nasm loading_golfed.asm -felf64 && ld loading_golfed.o

%use altreg
global _start
section .data
o:db"Loading...  "
s:db"|/-\\"
b:db`\bx`
q:dq 0,250000000
_start:mov r0,1
mov r7,1
mov r6,o
mov r2,12
syscall
mov r2,2
l:mov r7,1
mov al,[s+r8]
mov [b+1],al
mov r0,1
mov r6,b
syscall
mov r0,35
lea r7,[q]
mov r6,0
syscall
inc r8
and r8,3
jmp l

анімація:

збережено 65 байт - дякую користувачеві254948

введіть тут опис зображення


Я підраховую 349 байт, якщо тільки немає
останнього

^ Flp. Tkc Спасибі, в кінці була лінія з пробілом
Самуель

@Samuel потрібні рядки 13-17? Здається, без цих ліній працює дуже добре. Наскільки я можу сказати (я не боюсь у складанні, я боюся) ви друкуєте Loading ...., то | символу, потім видаліть цей символ, а потім введіть цикл, де ви повторюєте друк | вперше.
користувач254948

@Samuel на додаток xor r8, r8 -> mov r8,0 (зберігає 1 символ), деякі MOV мають додатковий простір (mov r7, 1 -> mov r7,1). далі інструкція cmp r8,4, jl l, xor r8, r8 може бути замінена на AND r8,3 (збереження 15 символів). Ви повинні бути до 285 байт, а не 349! (у поєднанні із зазначеними вище рядками)
користувач254948

5

R, 85 89 байт

repeat{if(T>4)T=1;cat("\fLoading...",c("|","/","-","\\")[T],sep="");T=T+1;Sys.sleep(.25)}

Редагувати: Виправлено відповідь таким, що Tне буде переповнено шляхом скидання лічильника, якщо більше 4.

Єдиний цікавий аспект цієї відповіді - використання R TRUTHY вбудованої команди T. Це фактично визначений набір змінних, 1/TRUEщо означає, що нам не потрібно ініціалізувати лічильник, але ми можемо почати збільшуватися T.


Буде чи в Tкінці кінців переповнення?
FlipTack

@ Flp.Tkc Це не переповнюватиметься, але трактується як минуле нескінченності, 1e+308у цьому випадку NAповертається, тому я думаю, що ця відповідь тоді була недійсною (не помічала її в правилах).
Оновиться

1
Насправді ви можете отримати його на 2 байти коротше, якщо не використовуєте вбудований T: i=1;repeat{cat("\rLoading...",c("\\","|","/","-")[i]);Sys.sleep(.25);i=`if`(i>3,1,i+1)}це 87 байт.
планування

Хм ... чи працює R тільки на векторах? Чому для атомів немає модульних або бітових операторів? є Tвектором? Чи T=(T+1)%%4працює? Це дозволило б заощадити ще 5 байт.
Тит

2
... або T=T%%4+1: навіть на 2 байти коротше.
Тит

5

Haskell (GHC), 103 91 байт

import GHC.Conc
mapM((>>threadDelay 250000).putStr)$("\rLoading... "++).pure<$>cycle"|/-\\"

Дякуємо @nimi за збереження 12 байт!


Не потрібно повноцінної програми. mapM((threadDelay 250000>>).putStr)$("\rLoading... "++).pure<$>cycle"|/-\\".
німі

Два байти можна зберегти, використовуючи 10% допуску та заміну 250000та пробіл перед ним на (4^9).
Крістіан Сіверс

5

C (у UNIX-подібних системах) 88 байт

main(_){for(;;){_%=4;printf("\rLoading... %c","\\-/|"[_++]);fflush(0);usleep(250000);}}

Починається з неправильного характеру, але я думаю, що це виглядає приємніше. Ви можете легко змінити порядок символів, змінивши "\ - / |" рядок.


Можна додатково пройти в гольф, перемістивши заяви в for, наприклад:, ain(_){for(;printf("\rLoading... %c","\\-/|"[_%4]);usleep(250000))_++,fflush(0);}тоді можна було б подати в гольф, припускаючи обгортку для цілого переповнення:main(_){for(;printf("\rLoading... %c","\\-/|"[_++%4]);usleep(250000))fflush(0);}
ninjalj

Вам потрібен fflush () там?
Джон У

У більшості систем вам потрібен fflush, багато з них буферні на основі нових рядків. Однак можливо, що це не потрібно в деяких системах.
LambdaBeta

Ви можете використовувати fprintf(stderr,...замість цього, оскільки це не буферизована лінія stdout. f...stderr,Займає вісім символів, в той час як fflush(0);потрібно десять, так що це чиста перемога двох символів.
cmaster

5

Perl, 71 63 61 байт

s//\rLoading... |/;select$\,$\,$\,y'-|\/'\/|-'/4while$|=print

Попередня версія:

$_="\rLoading... |";{$|=print;y#|/\-\\#/\-\\|#;select$\,$\,$\,.25;redo}

Дякуємо @primo за 10 байт.


2
Приємний фокус, а не використовувати selectтайм-аут Time::HiRes. Ви можете зберегти кілька байтів, використовуючи ... while$|=printдефіси в транслітерації вперед і в кінець. s//\r Loading... |/також зберігає байт над призначенням.
прим

2
А також, якщо ви використовуєте одинарні лапки для транслітерації роздільник, немає ніякої необхідності , щоб уникнути зворотного косі рис або: y'-\|/'\|/-'.
прим

Здається, у вас є додатковий простір перед кодом.
Ерік Атголфер

1
Ви можете зберегти інший байт, використовуючи буквал \r.
ніндзя

1
Використовуйте y'-|\/'\/|-'/4замість .25ще 2.
прим
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.