Загрузка ... навсегда


106

Ваша задача - создать бесконечный загрузочный экран, который выглядит следующим образом:

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


Или, чтобы быть более конкретным:

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

правила

  • Выходной текст должен выглядеть точно так, как указано. Конечные символы новой строки / пробелы являются приемлемыми.
  • Вам не следует ждать 0,25 секунды, прежде чем вы начнете показывать вывод - первый кадр должен быть напечатан сразу после запуска программы.
  • Ваша программа должна работать бесконечно долго. Например, если вы используете счетчик для фреймов, он никогда не должен вызывать ошибку, превышая максимум на вашем языке.
  • Хотя период ожидания между каждым «кадром» должен составлять 0,25 секунды, очевидно, что он никогда не будет точным - допустимая погрешность составляет около 10%.
  • Вы можете отправить функцию, но она должна распечатать stdout.
  • Вы можете отправить ответ в неконсольной (но все же основанной на тексте) среде, если она способна создавать загрузочную анимацию.
  • Это , поэтому выигрывает самое короткое решение (в байтах). Применяются стандартные лазейки для игры в гольф.
  • Если возможно, предоставьте gif вашего экрана загрузки в действии.

пример

Вот код C ++, который я использовал для создания примера (без гольфа):

#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).
Artyer

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?
Захари

Да, это в конечном итоге будет. Исправлено!
darrylyeo

1
Не могли бы вы заменить i++,i%=4с i=-~i%4на байты?
Захари

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команду
Роман Gräf

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

2
Вы должны иметь возможность использовать IP-адрес «1.1» (-4 байта), потому что большинство платформ автоматически расширит его до 1.0.0.1.
phyrfox

1
Вы можете сэкономить 1 байт, удалив пространство перед >nul.
YourDeathIsComing

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

20

Узел, 72 70 байт

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

Замените \x1Bбуквальным escape-символом, чтобы получить правильное количество байтов. Позвоните, f()чтобы начать анимацию. Вот как это выглядит в эмуляторе терминала ConEmu на моем компьютере:

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


Попробуйте использовать \033c(замените \033его фактическим представлением символа). Выглядит не так хорошо, но экономит несколько байтов.
Mama Fun Roll

Не iпереполнится?
Захари

12
@ZacharyT Это будет через 71 миллион лет, но я могу исправить это, если это необходимо
ETHproductions

3
«Ваша программа должна работать бесконечно долго. Например, если вы используете счетчик для кадров, счетчик никогда не должен вызывать ошибку, превышая максимум на вашем языке». Да, это необходимо.
Захари

3
@Florent Но тогда он не будет работать на узле ;-)
ETHproductions

14

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

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

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

Самоочевидно, использует \rдля очистки линии и использует потрясающую интерполяцию строк Kotlin.

РЕДАКТИРОВАТЬ: Сохранено 1 байт благодаря @ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu путем изменения while(true)наwhile(1>0)


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

2
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Режим «полная программа» не приемлем? Это можно запустить как скрипт Kotlin .ktsбез определения классов или функций. Кроме того, отличный звонок с while(1>0)!
Тайлер МакДонелл

3
Но что, если однажды 0 станет больше 1 ???? : P
FlipTack

Отличная идея с использованием сценария Kotlin. @ 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}

Интерфейс командной строки PowerShell на некоторых компьютерах будет слегка зависать, поэтому он не выглядит идеально, но он настолько хорош, насколько это возможно.

Переместил $ a ++ в цикл for для сохранения одного байта, (нет ;)

Затем переместил его в индексатор массива, чтобы сохранить еще 2 байта, спасибо Роману за указание на это.

Также сохранен еще 1 байт ( ;) путем перемещения части Clear screen ( cls) в цикл for.

Выпуск и исправление указал TimmyD для бесконечного аспекта вопроса, только +5 Bytes требуется, изменилось $a++%4в ($a=++$a%4)так он никогда не поднимется выше 3.

Сохраните еще один байт, оставив цикл for полностью пустым, благодаря «что угодно» за указание на то, что это действительно возможно в Powershell Version 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)
Roman Gräf

всегда забывать что-то - спасибо за это!
colsw

2
Я не очень хорошо разбираюсь в Powershell, но когда я увидел запись Windows Batch, я подумал: «Может ли Powershell победить это?». И вот оно!
Якуб Янковский

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

1
Пожалуйста. Похоже, что это работает для Версии 2+, просто лень проверять раньше;)
что угодно

11

Pyth - 36 35 байт

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

Не работает онлайн, очевидно.


У вас есть GIF этого в действии? Кроме того, есть ли счетчик, который может переполниться?
FlipTack

@ Flp.Tkc единственный счетчик, Zкоторый является целым числом Python, которое не переполняется. Я пытался сделать подарок, но не мог заставить его работать. Если вы знаете, как его создать, вы можете запустить его с помощью интерпретатора pyth по адресу github.com/isaacg1/pyth
Maltysen

4
Если целое число не переполняется, то оно, вероятно, будет расти до тех пор, пока не заполнит всю память, что приведет к его отказу по крайней мере через 10 лет на большинстве 32-разрядных систем. Конечно, сначала наступит тепловая смерть вселенной, но все же ...
JJRV

11

Matlab, 78 75 байт

a='\|/-';while 1;clc;disp(['Loading... ',a(1)]);a=a([2:4,1]);pause(1/4);end

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



9

Mathematica, 74 67 байт

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

Огромные 7 байт благодаря @dahnoak


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

1
@ Dahnoak ура! Я не осознавал, что ListAnimate - вещь. Обидно, что <>Flat не 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)", символ вместо строки

Я бы прокомментировал свои предложения по его ответу, но на самом деле у меня недостаточно репутации, чтобы это сделать

Ungolfed:

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 байт.
Разнагул

Также задача состоит в том, чтобы создать требуемый вывод точно. Что в настоящее время не так.
Разнагул

Так и должно быть, я забыл '|' и завершающий пробел после «Загрузка ...».
Snowfire

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

9

В-четвертых, 7273 байта

РЕДАКТИРОВАТЬ :

  • Добавлена ​​версия только для Gforth, 69 байт (Спасибо @ninjalj!)
  • Добавлен пропущенный пробел после «Загрузка ...» (Thx @Roman Gräf!), +1 байт
  • Обновлен для более точного соответствия правилам (с тем же количеством байтов)

Golfed

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

Gforth версия

Версия GNU Forth-only может быть уменьшена до 69 байтов следующим образом:

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

Screencast

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

Попробуйте онлайн!


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 intне может переполниться. Спасибо @Zachary T за указание на это и сохранение байта!
Он останавливается только на машине, потому что машине не хватает памяти, но для этого требуется 9,7 поколения с 4 ГБ памяти int.

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

Вот как это работает на Windows:

загрузка

Я также проверил его на виртуальной машине Linux. Я не мог проверить это на Mac.


1
Если я правильно помню, вы можете использовать, i=-~i%4чтобы сохранить байты для
паренов

2
Не заменять [i],;i=-~i%4с [i%4],;i+=1сохранить байт , так как она не превышает максимальную для Python, только максимальный объем памяти?
Захари

9
Я должен понизить голосование за то, что вы вошли как Administrator...
Нил

5
@Neil Честно говоря, я просто поместил файл Python в Administrator и запустил его оттуда, потому что другие имена учетных записей являются реальными именами (Personal PC).
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
Хоки

@ Хоки Спасибо за идею. На самом деле у меня изначально был счетчик увеличения по модулю 4, но он был немного длиннее (потом я получил байт из-за требования не делать начальной паузы). Кроме того, я думаю, что четкий экран и нормальное отображение короче, чем fprintfс обратным ходом
Луис Мендо

7

Dyalog 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), добавьте его к (увеличивая его) и возьмите mod-4 (чтобы предотвратить его переполнение).
  • : запустите функцию снова с новым .

Анимация


Каким-то образом я знал, что кто-то отправит ответ на этот вызов для Dyalog (/ APL) :)
YoYoYonnY

7

C #, 187 байт

Golfed:

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("\\");}

Ungolfed:

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

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

Извините, что ваше решение становится длиннее из-за моего комментария. Не могли бы вы использовать 1>0вместо того, trueчтобы вернуть его на 186?
manatwork

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

2
@ Manatwork Ну, кажется, C # это не для гольфа.
Эрик Outgolfer

7

Snap !, 8 блоков

8 блоков Snap!

Это был один из самых первых алгоритмов, которые я когда-либо ломал голову над Apple] [e


1
Покажите нам свой бейсик Applesoft :)
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условием.
Манатворк

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

Это не сработает Dominik R, это в конечном итоге переполнится.
Захари


6

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

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

Должен выполняться, передавая -t .01интерпретатору дополнительный аргумент, то есть +4 к числу байтов.

Для этого нужно поместить в стопку четыре символа, распечатать верхний, не удаляя его, и сдвинуть стопку на одну позицию. Затем он печатает \b(возврат, символ x08) и перезапускает цикл.

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

Вы можете попробовать это онлайн , но этот интерпретатор не распознает символ возврата, поэтому вывод будет немного странным.


Обычно флаги вроде -nоцениваются как 1 байт, поэтому я думаю, что вы можете оценить аргумент как t, .01что составляет 4 байта. Хорошее использование правила 10%, кстати :)
FlipTack

@ Flp.Tkc Спасибо! Я не был уверен, как посчитать байты для аргумента, мне нравится этот путь :)
Лев

@Leo - есть ли причина использовать 0.01, а не более крупный тик с меньшим количеством инструкций? Я добавил свою версию, которая использует цикл из 8 инструкций и счетчик тиков 0,03; # "... gnidaoL" л?! vob0. "\ | / -": о} 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 байт, если нет завершающего символа новой строки / пробела
FlipTack

^ Флп. Спасибо, там была строка с пробелом в конце
Самуил

@ Сэмюэл, нужны ли строки 13-17? Кажется, без этих строк все работает очень хорошо. Насколько я могу судить (боюсь, не так здорово в сборке), вы печатаете загрузку ...., затем | символ, затем удалите этот символ, затем введите цикл, где вы повторяете печать | в первый раз.
user254948

@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! (в сочетании с линиями, упомянутыми выше)
user254948

5

R 85 89 байт

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

Изменить: Исправлен ответ так, что не Tпереполняется, сбрасывая счетчик, если больше, чем 4.

Единственный интересный аспект этого ответа является использование АиР TRUTHYвстроенной команды T. Фактически это предопределенный набор переменных, 1/TRUEкоторый означает, что нам не нужно инициализировать счетчик, но мы можем начать увеличивать его T.


В Tконечном итоге переполнится?
FlipTack

@ Flp.Tkc Это не будет переполнено, но будет рассматриваться как бесконечное прошлое, и 1e+308в этом случае NAвозвращается, так что я думаю, что тогда этот ответ недействителен (не заметил его в правилах). Скоро будет обновление
Billywob

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

Хм ... 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 () там?
Джон U

В большинстве систем вам нужен fflush, многие из них буферизуются на основе новых строк. Однако возможно, что в некоторых системах это не нужно.
LambdaBeta

Вы могли бы использовать fprintf(stderr,...вместо этого, так как это не буферизованная строка, как stdout. Он f...stderr,берет восемь символов, а fflush(0);десять - это чистый выигрыш двух персонажей.
Мастер

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'-\|/'\|/-'.
Примо

Кажется, у вас есть дополнительный пробел перед вашим кодом.
Эрик Outgolfer

1
Вы можете сохранить другой байт, используя литерал \r.
ниндзя

1
Используйте y'-|\/'\/|-'/4вместо еще .252.
Примо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.