Анимируйте текст в вашем терминале


46

Анимируйте текст в вашем терминале

Цель

Цель состоит в том, чтобы «анимировать» строку «Hello world» в выходных данных, чтобы каждый символ стал заглавным после каждого.

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

Например;

# Iteration 1
Hello world

# Iteration 2
hEllo world

# Iteration 3
heLlo world

# Iteration 4
helLo world

# Iteration 5
hellO world

# Iteration 6 (note: it should capitilize the space char (ie: a break between iteration 5 and iteration 7)
hello world

# Iteration 7
hello World

# Iteration 8
hello wOrld

# Iteration 9
hello woRld

# Iteration 10
hello worLd

# Iteration 11
hello worlD

Он должен анимировать строку только один раз, и между каждым состоянием должна быть задержка в 1 секунду.

вход

Ввод не требуется, но "Hello world" должна быть строкой, которая является "анимированной".

Выход

Строка «Hello world» должна быть анимированной. Вывод должен быть в виде 1 строки для создания своего рода волновой анимации. Пустая конечная новая строка разрешена. Пример GIF;

https://i.gyazo.com/be12b693063b463540c5bf1f03d2454a.gif

Я видел это на видео с metasploit youtube и думал, что эффект был довольно крутым, и именно здесь я записал GIF, поэтому он немного запаздывает, но я надеюсь, что он хорошо иллюстрирует вывод

Это , победителем считается младший счетчик байтов.

Песочница Ссылка


Может ли он выйти и остановиться с ошибкой?
Стьюи Гриффин

@StewieGriffin, пока анимация доступна для просмотра, конечно.
ʰᵈˑ

Я не думаю, что задержка в 1 секунду добавляет проблемы. У нас была такая куча, и каждый раз кажется, что добавляется один и тот же шаблон.
xnor

2
@xnor Вы подразумеваете, что длительность задержки явно равна 1 секунде, или вы вообще имеете в виду задержку? Последнее не имеет никакого смысла, так как в конце концов это анимация ..
Metoniem

1
@Metoniem Нет, только те, которые описаны в цели. Если я не понял неправильно. Каждая буква должна быть написана заглавными буквами только один раз слева направо, начиная с «H» в «hello» и заканчивая «D» в «world»
ʰᵈˑ

Ответы:


33

Vim 26 байт

ihello world<ESC>qq~gsul@qq0@q

Пояснение (пока нет. Gif):

Во-первых, мы должны ввести текст «Привет, мир». Это довольно просто. Это просто:

ihello world<ESC>

В этот момент курсор находится на «d» в «мире». Следующий:

qq              " Start recording into register 'q'
  ~             " Swap the case of the character underneath the cursor, and move the cursor to the right
   gs           " Sleep for one second
     u          " Undo the last change (of swapping case).
      l         " Move one character to the right (Get it? 'l' == 'Right' because vim is intuitive!)
                " This will cause the error to break on the last character of the input.
       @q       " Call register 'q'
         q      " Stop recording
          0     " Move to the first character
           @q   " Call the recursive macro

Есть также две другие 26-байтовые версии, которые я нашел:

ihello world<ESC>qq~gsulq011@q
ihello world<ESC>011@='~gsul'<cr>

Человек это круто! Вот результат: i.gyazo.com/52d0b9268446aed36ce7eb641c40ff6c.gif (половина из них так или иначе, Gyazo остановил запись)
ʰᵈˑ

Я не думаю, что ~ разрывает петлю . Я верю, что именно lэто делает тяжелую работу
Kritixi Lithos

@KritixiLithos Ах, после тестирования кажется, что ты прав. Хороший вопрос, я отредактирую это
DJMcMayhem

1
Могу подтвердить - это работает.
SIGSTACKFAULT

15

Python 2, 98 94 90 байт

for x in range(11):s='hello world';print'\r'+s[:x]+s[x:].capitalize(),;[1for y in' '*8**8]

-9 -4 байта благодаря @ElPedro -4 байта благодаря @JonathanAllan и @Rod


3
Добро пожаловать в PPCG, хороший первый пост c:
Rod

2
Хороший пост! Кажется, что в нем есть заглавные буквы "H" и "W" одновременно, хотя repl.it/Fhii - Кажется, он не строчные буквы "H"
ʰᵈˑ

1
О проблеме печати вы можете передать -uаргумент и использовать print"\t"+s[:x]+s[x:].title(),;(обратите внимание на запятую) . И это не изменит количество ваших байтов (потому что аргумент добавит +2 байта)
Rod

2
@Rod Флаг будет считаться одним байтом, поскольку допустимый вызов для Python python -c 'code here'. С флагом, вызов будет python -uc 'code here', который отличается на один байт.
Mego

1
В значительной степени ваша версия, но 95 байтов и очищает экран (я тестировал с 2.7.8 на Windows 7-64). Попробуйте онлайн не дает анимацию, просто построчно результат.
Джонатан Аллан

12

Commodore 64, 168 162 137 133 BASIC (и токенизированных) использованных байтов

 0s=1024:?"{control+n}{clear home}hello world":fOi=.to1:fOj=.to11:x=pE(s+j):pokes+j,x+64
 1x=pE(1023+j):pO1023+j,abs(x-64):pO1029,32:pO1035,32:fOz=.to99:i=.:nEz,j,i

Вам нужно будет использовать сокращения BASIC для ввода ключевых слов в настоящий C64 или эмулятор (или ввести программу в Commodore 128 и загрузить ее обратно в режиме C64, хотя это также должно работать на 128). {control+n}Будет работать только / дисплей после открытия цитаты. Это сокращение для chr$(14)и поэтому сохраняет некоторые байты и переключает набор символов в бизнес-режим или символы верхнего / нижнего регистра.

Я добавил некоторые сокращения для вас, чтобы вы. Символ {clear home}создается нажатием клавиши Shiftи CLR/HOMEпосле открывающей кавычки.

Для наглядности необъяснимый список может быть введен следующим образом:

 0 let s=1024
 1 print chr$(14); chr$(147); "hello world"
 2 for i=0 to 1
 3  for j=0 to 11
 4   let x=peek(s + j)
 5   poke s + j, x + 64
 6   let x=peek(1023 + j)
 7   poke 1023 + j, abs(x - 64)
 8   poke 1029, 32
 9   poke 1035, 32
10   for z=0 to 99
11    let i=0
12   next z
13  next j
14 next i

Он работает, переключая кодировку PETSCII в бизнес-режим (верхний / нижний регистр) и записывая строку приветствия в верхнюю строку экрана, расположенную в ячейке памяти $ 0400, затем будет принимать значение в каждом месте для следующего Оттуда 11 байтов и увеличиваем каждое значение на 64 (в верхнем регистре). Если счетчик j> 0, он вызывает процедуру в строке 2, чтобы снова уменьшить предыдущую ячейку памяти на 64.

Строка 3 - это пауза, она также записывает пробел в ячейки $ 0405 и $ 040b, что является исправлением ошибки (которое, вероятно, можно удалить, чтобы сэкономить несколько байтов).

Commodore C64 Привет, мир


Я должен добавить, что fori=0to1step0... nextiпо сути создает бесконечный (без перехода) цикл, вроде как while(true){...}в более современных языках.
Шон Бебберс

1
Почему бы вам просто не использовать goto вместо бесконечного цикла? Даже с 2 новыми строками, которые должны быть добавлены, это все равно сохранит байты. Кроме того, количество байтов в ОЗУ не совпадает с количеством байтов в вашем коде.
MilkyWay90

Потому что GO TOэто забанено, верно ;-) Можно легко составить список самостоятельно, CLRпрежде чем FRE(0)
обрабатывать

1
о, извините за это
MilkyWay90

11

C #, 230 215 193 161 135 134 130 байтов

Это C #, так что долго верно! :-( Но после некоторой помощи и поиска мне (и другим, действительно) удалось уже удалить ровно 100 байт.

Golfed

()=>{for(int i=1;;){var b="\rhello world".ToCharArray();b[i++]-=' ';System.Console.Write(b);System.Threading.Thread.Sleep(1000);}}

Ungolfed

class P
{
    static void Main()
    {
        for (int i = 1;;)
        {
            var b = "\rhello world".ToCharArray();
            b[i++] -= ' ';
            System.Console.Write(b);
            System.Threading.Thread.Sleep(1000);
        }
    }
}

Скриншот

Анимация с задержкой в ​​1 секунду Хотя это выглядит намного лучше, когда циклы и быстрее ..

Обновления

  • Потерял 15 байтов при использовании возврата каретки вместо Clear()которого также позволил мне заменить использование на System.Consoleгде-то встроенное.

  • Замененная программа на лямбду, экономящая 23 байта благодаря @devRicher

  • Это стало своего рода сотрудничеством с @devRicher на данный момент, благодаря некоторым его предложениям мне удалось потерять еще 32 байта!
  • Благодаря двум действительно умным и интересным предложениям @Kratz мне удалось заменить new string(b)на bи b[i]=char.ToUpper(b[i])на b[i]-=' ', сэкономив мне еще 26 байтов!
  • На 1 байт меньше благодаря перемещению i++благодаря @Snowfire
  • 4 байта меньше, перемещая возврат каретки в начало строки и удаляя i<11из моего forцикла

1
Перейдите class P{static void Main(){ ... }}на ()=>{ ... }несколько байтов. PPCG принимает функции в качестве ответов, поэтому лямбда работает нормально.
devRicher

@devRicher Ах, я вижу, я никогда не использовал ламб до этого, но это кажется классным улучшением. Спасибо!
Metoniem

Если вы не знаете, как их использовать (или не хотите), все еще хорошо для простого void g(){ ... }.
devRicher

Вы можете получить доступ к строкам с помощью индексов массива ( char g = string j[x]), чтобы сохранить около 50 байтов:()=>{var s="Hello world";for(int i=1;i<11;i++){string h = s;h[i]=char.ToUpper(s[i]);System.Console.Write(h+"\r");System.Threading.Thread.Sleep(1000);}}
devRicher

1
Вы можете сохранить еще один байт, удалив инкремент из предложения for и поместив его в массив, например b[i++]-=' '. Это пригодится, потому что тогда вы также можете удалить условие в цикле for и просто написать for(int i=0;;). ОП указал в комментариях, что программа может завершиться с ошибкой, поэтому вы можете разрешить IndexOutOfRangeException
Snowfire

10

Powershell, 126 119 107 104 байт

'Hello world';$s='hello world';1..10|%{sleep 1;cls;-join($s[0..($_-1)]+[char]($s[$_]-32)+$s[++$_..11])}

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

Редакции (вероятно, будет много):

Изменить $s.Lengthна const 1011

Реструктурированный построитель строк, удален 1 оператор соединения и используется ++$sвместо ($s+1), чтобы сохранить несколько байтов благодаря @AdmBorkBork

AdmBorkBork указывает, что просто использование строки дважды на самом деле короче, чем инкапсуляция, а затем .ToLower()ее вставка - что говорит о том, насколько многословен PowerShell, -3!


в основном перебираем длину строки, формируем массив из трех частей: прекапитальный, заглавный и посткапитальный, отнимаем 32 от средней буквы, затем преобразуем обратно в символ, чтобы получить верхний регистр, к счастью, это не не превращаете ли пространство в видимый символ? Надеюсь, это приемлемо?


2
Вы можете сохранить еще три байта спереди, просто распечатав строку, а не сохраняя $sи .ToLower()вставляя ее. -'Hello world';$s='hello world';
AdmBorkBork


9

Сборка CP-1610 , 50 DECLE = 63 байта

Этот код предназначен для запуска на Intellivision .

Код операции CP-1610 кодируется 10-битным значением, известным как «DECLE». Длина этой программы составляет 50 ДЕЛЕ, начиная с 4800 долларов и заканчивая 4831 долларов.

                                  ROMW  10          ; use 10-bit ROM
                                  ORG   $4800       ; start program at address $4800

                          main    PROC
4800 0002                         EIS               ; enable interrupts (to enable display)

4801 0001                         SDBD              ; load pointer to string in R4
4802 02BC 0026 0048               MVII  #@@str, R4

4805 02A2                         MVI@  R4,     R2  ; R2 = length of string
4806 0091                         MOVR  R2,     R1  ; R1 = uppercase counter

4807 02BD 0214            @@loop  MVII  #$214,  R5  ; R5 = video memory pointer
4809 0093                         MOVR  R2,     R3  ; R3 = character counter

480A 02A0                 @@next  MVI@  R4,     R0  ; R0 = next character
480B 0338 0020                    SUBI  #32,    R0  ; minus 32 -> character #
480D 004C                         SLL   R0,     2   ; multiply by 8 to get the
480E 0048                         SLL   R0          ; correct GROM card
480F 03F8 0007                    XORI  #7,     R0  ; add 7 (for white)

4811 014B                         CMPR  R1,     R3  ; uppercase? ...
4812 020C 0002                    BNEQ  @@draw

4814 0338 0100                    SUBI  #256,   R0  ; ... yes: sub 32*8

4816 0268                 @@draw  MVO@  R0,     R5  ; draw character
4817 0013                         DECR  R3          ; decrement character counter
4818 022C 000F                    BNEQ  @@next      ; process next character or stop

481A 0001                         SDBD              ; R0 = spin counter to wait ~1 second
481B 02B8 0038 00D3               MVII  #$D338, R0  ;    = 54072 = 13518 * 60 / 15
                                                    ; (assuming 13518 cycles per frame)

481E 0010                 @@spin  DECR  R0          ; 6 cycles
481F 022C 0002                    BNEQ  @@spin      ; 9 cycles
                                                    ; -> 15 cycles per iteration

4821 0114                         SUBR  R2,     R4  ; reset pointer to beginning of string
4822 0011                         DECR  R1          ; decrement uppercase counter
4823 022C 001D                    BNEQ  @@loop      ; process next iteration or stop

4825 0017                         DECR  PC          ; infinite loop

4826 000B 0068 0065 006C  @@str   STRING 11, "hello world"
482A 006C 006F 0020 0077
482E 006F 0072 006C 0064
                                  ENDP

Выход

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


7

MATL , 30 байт

11:"10&Xx'hello world't@)Xk@(D

Попробуйте это в MATL Online!

11:              % Push [1 2 ... 11]
  "              % For each k in [1 2 ... 11]
  10&Xx          %   Pause for 10 tenths of a second and clear screen
  'hello world'  %   Push this string
  t              %   Duplicate
  @)             %   Get the k-th character from the duplicated string
  Xk             %   Convert to uppercase
  @(             %   Write into the k-th position of the string
  D              %   Display
                 % Implicit end

5

PHP, 76 74 71 байт

Спасибо @hd за задержку, равную целой секунде, а не за ее долю!
Спасибо @ user63956 за 2 байта и @aross за 3 байта.

for(;$c=($s="hello world")[$i];sleep(print"$s\r"))$s[$i++]=ucfirst($c);

Беги с -nr.


1
Вы можете сохранить 2 байта с помощью sleep(print"$s\r").
user63956

1
Сохранить 3 байта с ucfirst
aross

4

C 97 выведено 106 байтов

с экранированными символами считается за 1 байт

char*a="HELLO\0WORLD\xED";b,c;m(){for(b=0;b<156;putchar(a[c]+32*(b/12^c||c==5)))(c=b++%12)||fflush(sleep(1));}

Примечание: я прокомментировал задержку на несвязанном TIO, потому что он ожидает завершения, прежде чем отобразить вывод, он также не распознает возврат каретки и ставит новые строки. Кроме того, если вы работаете в Windows, сон длится в миллисекундах, а не в секундах, так что sleep(1)должно стать sleep(1000).

Примечание 2: Я отозвал эту запись на время, пока не были устранены ошибки в выходных данных.


По какой-то причине это ничего не выводит на мою машину
Kritixi Lithos

Если вы работаете в Windows, вам придется изменить задержку, она также завершится при возврате каретки, поэтому вы можете изменить 130 на 129, чтобы избежать ее печати во время последней итерации.
Ahemone

Для меня эта программа вообще не заканчивается и ничего не выводит. Мне пришлось вручную ^Cэто остановить. (также я на Mac)
Kritixi Lithos

Я считаю, что это проблема с буфером печати, сейчас я заберу свою запись.
Ahemone

4

JavaScript (ES6), 141 139 131 байт

Сохранено 8B благодаря Apsillers

_=>a=setInterval("b=[...`hello world`],c.clear(b[d]=b[d].toUpperCase(++d>10&&clearInterval(a))),c.log(b.join``)",1e3,c=console,d=0)

объяснение

Это создает функцию без аргументов, которая разбивает строку hello worldв массив символов и заглавную d+1го символа. dэто счетчик, который начинается как 0и увеличивается каждый раз.

использование

f=_=>a=setInterval("b=[...`hello world`],c.clear(b[d]=b[d].toUpperCase(++d>10&&clearInterval(a))),c.log(b.join``)",1e3,c=console,d=0)
f()

Умно, буду обновлять.
Люк

Кроме того, я не вижу смысла делать это функцией, поскольку она не требует ввода - просто запустите код, верно?
Апсиллеры

В вопросе говорится, что это должна быть программа, но в этом случае вы также можете отправить функцию. Фрагменты кода, как правило, не допускаются.
Люк

Это мило, ГГ!
ʰᵈˑ

Можете ли вы отличить ваше понимание запрещенного «фрагмента кода» от разрешенной «программы» в этом случае? Если вы просто удалите ведущую, _=>то у вас будет готовая программа (например, если вы вставите ее в файл, Node.js успешно выполнит ее до конца). Мое понимание запрета «фрагментов кода» противоречит написанию кода, который неявно принимает некоторые входные данные в качестве переменной, например, «если мы предполагаем, что iуже есть входные данные, мы можем сделать ...», чего здесь не происходит, поскольку явно нет ввода.
Апсиллеры

4

Noodel , 22 байта

”<8@\|DḶ|\6þıHḶƥɲSḍsɲS

Попробуй:)


Как это устроено

”<8@\|DḶ|\6þ           # Displays the string "hello¤world".
”<8@\|DḶ|\6            # Decompresses to the array ["h", "e", "l", "l", "o", "¤", "w", "o", "r", "l", "d"] and pushes it on top of the stack.
           þ           # Pushes a copy of the array to the screen which since is an array is done by reference.

            ı          # Makes the array on the top of the stack the new stack.

             HḶƥɲSḍsɲS # Loops eleven times creating the animation.
             H         # Pushes the string "H" on to the top of the stack.
              Ḷ        # Consumes the "H" that gets evaluated as a base 98 number which comes out to eleven.
               ƥ       # Move the stack pointer up one.
                ɲS     # Switch the case of the top of the stack which will show up on the screen because the array is done by reference.
                  ḍs   # Delay for one second.
                    ɲS # Switch the case back.
                       # Implicit end of the loop.

Фрагмент использует 25-байтовую версию, которая зацикливается непрерывно.

<div id="noodel" cols="10" rows="2" code="”<8@\|DḶ|\6þıḷʠ*HḶƥɲSḍsɲS" input=""/>
<script src="https://tkellehe.github.io/noodel/release/noodel-2.5.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>



3

Perl 6 , 65 61 байт

for 3..12 ->\i{sleep say "\echello world".&{S:nth(i)/./{$/.uc}/}}

(sleep say S:nth(3+$++)/./{$/.uc}/with "\echello world")xx 11

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

Как это устроено

Экранирующая последовательность ANSI \ecочищает экран.
На каждой итерации i'-й символ жестко закодированной строки заменяется ее заглавной версией. Функция всегда возвращает , который передается функции сна , которое интерпретирует его как второй.
sayTrue1


3

Рубин, 82 81 байт

12.times{|a|$><<?^H*11;'Hello world'.chars{|y|$><<((0!=a-=1)?y:y.upcase)};sleep 1}

^ H ascii 8 (backspace), и только 1 байт.


3

C 87 байтов

m(){char*f,a[]="\rhello world";for(f=a;*++f;*f&=95,printf(a),*f|=32,fflush(sleep(1)));}

Компилируется и работает на Linux.


3

Mathematica, 130 128 123 110 108 байт

Dynamic@o
s="hello world";i=1;t=StringTake;Do[o=t[s,{1,i-1}]<>Capitalize@t[s,{i}]<>t[s,{++i,11}];Pause@1,11]

Объяснение: С i=111 по 11 напечатайте с 1-го по (i-1) -й символ «привет мира», используйте заглавные буквы "hello world"[i], затем напечатайте остальную часть строки, увеличиваясь iв то же время.


3

Java 215 212 204 203 байта

interface A{static void main(String z[])throws Exception{for(int i=0;i<10;i++){char[]b="helloworld".toCharArray();b[i]=Character.toUpperCase(b[i]);System.out.println(new String(b));Thread.sleep(1000);}}}

Ungolfed:

 interface A {
 static void main(String z[]) throws Exception {
    for (int i = 0; i < 10; i++) {
        char[] b = "helloworld".toCharArray();
        b[i] = Character.toUpperCase(b[i]);
        System.out.println(new String(b));
        Thread.sleep(1000);
    }
  }
}

1
Не должно ли быть interface A(с пробелом)? Плюс вы можете удалить пространство между ,и Character.toUpperCase.
NoOneIsHere

2
Добро пожаловать на сайт!
DJMcMayhem

Престижность @NoOneIsЗдесь за 3 балла
DevelopingDeveloper

Спасибо @DJMcMayhem, всегда любил читать через испытания и, наконец, получил возможность ответить на один!
DevelopingDeveloper

3

R , 106 103 байта

x=el(strsplit("hello world",""))
for(i in 1:11){y=x;y[i]=toupper(y[i]);cat('\f',y,sep='');Sys.sleep(1)}

Простая петля, очистка консоли с помощью cat('\f')системы кажется несколько зависимой от системы, но я не знаю лучшего способа.


Я пытался превзойти это, используя utf8ToInt. Это не сработало, пространство необходимо обрабатывать как особый случай. В процессе я обнаружил, что, cat("\014")кажется, работает лучше, чем работать там, где cat("\f")нет. но не на
TIO

2

C 122 байта

i;f(){char s[]="Hello world\r";for(i=0;i<11;i++){s[i]=toupper(s[i]);s[i-1]=tolower(s[i-1]);printf(s);fflush(0);sleep(1);}}

Короче C #: D


1
Также, чтобы последний кадр был виден, вы должны сделать это i<11вместо цикла i<10for
Kritixi Lithos

2

Perl, 75 байт

sleep print"\33c".("hello world"=~s/(.{$_})(.)(.*)/$1\U$2\E$3\n/r)for 0..10

Использует код ANSI ESCcдля очистки консоли и перемещения курсора в верхний левый угол на каждой итерации, но все еще нуждается \nв конце строки замены, чтобы избежать потери всей анимации в буфере строк.

Успешный вызов printвозвращает значение 1, которое может быть передано непосредственно sleep.


Вы можете использовать $`и $'для сохранения нескольких байтов (.{$_})(.)(.*)(это не будет работать в терминале, но это не проблема). Это требует изменения немного остальную часть вашего кода , хотя: "hello world"=~s/./sleep print"\33c$`\U$&\E$'\n"/ger. (Я написал почти этот точный код, а затем, когда посмотрел, кто-нибудь уже написал ответ на Perl, я нашел ваш). И немного подробностей о bytecount: вы можете использовать буквальный перевод строки для сохранения байта и, может быть, какой-то тип букв \33c(хотя и не слишком уверен насчет последнего).
Дада

2

SmileBASIC, 90 71 байт

FOR I=0TO 10CLS?"hello world
LOCATE I,0?CHR$(CHKCHR(I,0)-32)WAIT 60NEXT

2

Желе , 24 21 байт

”Æ⁹Œu⁸¦ȮœS
“½,⁻⁸3»Jç€

Это нильадная ссылка / функция, которая печатает в STDOUT. Это не работает как полная программа.

Код не может быть протестирован на TIO; он использует управляющие символы, а TIO не имеет эмулятора терминала (пока).

Как это устроено

“½,⁻⁸3»Jç€  Niladic link. No arguments.

“½,⁻⁸3»     Index into Jelly's dictionary to yield "hello world".
       J    Indices; yield [1, ..., 11].
        ç€  Apply the helper link to each index, with right arg. "hello world".


”Æ⁹Œu⁸¦ȮœS  Dyadic helper link. Left argument: i. Right argument: "hello world"

Ӯ          Set the return value to '\r'.
  ⁹         Set the return value to "hello world". Implicitly prints '\r'.
   Œu⁸¦     Uppercase the i-th letter.
       Ȯ    Print.
        œS  Sleep "hello world" seconds. (Strings are cast to Boolean.)

(Strings are cast to Boolean.)Это обманчиво!
Эрик Outgolfer

2

C 122 байта

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

main(){
    char*p=".Hello world\rH";
    write(1,p+1,13);
    do{
        sleep(1);
        *p=8;
        p[1]|=32;
        p[2]^=(p[2]>32)*32;
        write(1,p++,3);
    }while(p[4]);
}

(Новые строки и отступы косметические, а не часть байтов)

Теперь некоторые читатели могут заметить, что для запуска на современных машинах требуется некоторый массаж (волшебное заклинание -static -Wl,-N), но именно так привыкли вести себя реальные реализации C, так что я думаю, что это правильно. Он также предполагает, что набор символов - ASCII, и не печатает завершающий символ новой строки.

Бонус: для версии EBCDIC вы можете заменить 8на 22и 64с 32и переключить логику для p[1]и p[2]. Чтобы протестировать систему не-EBCDIC, вы можете скомпилировать ее -funsigned-char -fexec-charset=cp037.

Выход составляет 43 байта: Hello world«H‹hE‹eL‹lL‹lO‹o ‹ W‹wO‹oR‹rL‹lD


2

Scala, 92 байта

val h="hello world"
0 to 10 map{i=>print("\b"*99+h.updated(i,h(i)toUpper))
Thread sleep 999}

Ungolfed

val h="hello world"    //declare a variable h with the string "hello world"
0 to 10                //create a range from 0 to 10
map { i=>              //loop with index i
  print(                 //print
    "\b" * 99              //99 backspace chars
    + h.updated(           //and h with
      i,                     //the i-th char
      h(i).toUpper           //replaced with the i-th char in uppercase
    )     
  )
  Thread sleep 999       //sleep 999 ms
}

1
+1 заh(i)toUpper
Всегда спрашиваю

2

Пакет, 184 байта

@echo off
for %%h in (Hello hEllo heLlo helLo hellO hello)do call:c %%h world
for %%w in (World wOrld woRld worLd worlD)do call:c hello %%w
exit/b
:c
timeout/t>nul 1
cls
echo %*

Любопытно, что командная строка для timeout/t>nul 1повреждена, если нет завершающей строки, поэтому я не могу поместить ее в конец файла.


2

Рубин, 108 байт

Первый раз, студент первого курса. Это не орел, но я, по крайней мере, немного горжусь.

12.times{|i|sleep(0.1); puts "\e[H\e[2J", "hello world".sub(/(?<=.{#{Regexp.quote(i.to_s)}})./, &:upcase);}

2

Паскаль, 187 152 байта

Не совсем самый эффективный или самый короткий, но работает довольно хорошо!

uses crt,sysutils;label R;const X:Word=1;P='hello world';begin
R:clrscr;write(P);gotoxy(X,1);write(upcase(P[X]));sleep(999);X:=X*Ord(X<11)+1;goto R
end.

Протестировано и работает на Free Pascal Compiler 2.6+.

Спасибо @manatwork за сохранение 35 байт!


Я использовал http://www.onlinecompiler.net/pascal для компиляции файла и запуска его в Windows.
До сих пор не видел никаких проблем с этим.


UpCaseФункция существует с давних времен Turbo. (Там он обрабатывается только Char, но в Free Pascal также обрабатывает строки.)
manatwork

Пара небольших твиков: достаточно объявить X Word(или Byte); сделать P a constтаким, чтобы оно выводило тип из значения инициализации; в то время как там, сделайте X инициализированной константой, чтобы избавиться от отдельного varключевого слова (это может работать не во всех вариантах Pascal, но, безусловно, работает во Free Pascal); используйте ClrScrдля перехода в верхний левый угол; заменить , что ifс одним выражением: X:=X*Ord(X<11)+1. pastebin.com/FfaixkES
manatwork

Я действительно не знал этого const X:Word=1;P='hello world';и это const X:Word=1;P='hello world';было возможно. Я изучил Pascal на Turbo Pascal 7, который может быть несовместим с этим. И совсем забыли upcase. Спасибо большое!
Исмаэль Мигель

2

C 120 110 104 96 байт

f(){char *j,s[]="\rhello world";for(j=s;*++j;*j-=32,printf(s),*j+=32,fflush(0),sleep(‌​1));}

Неуправляемая версия

void f()
{
  char *j;
  char s[]="hello world";
  j=s; 

   for (;*j;j++)
   {
      *j-=32;  
       printf(s); // print the string and right after change the same char to lower case
       *j+=32;
      fflush(0);
      sleep(1);
   }

}

@Pakk Спасибо за сохранение некоторых байтов, отличная идея. :)

@Pakk @KarlNapf Спасибо, ребята, за ваш вклад.

можно еще укоротить !? :)


Используйте -=и +=. Кроме того, переменная указателя может сохранить, []но я не уверен.
Карл Напф

1
char * j; f () {char s [] = "привет мир"; for (j = s; * j; j ++) {* j- = 32; printf ("\ r% s", s); * j + = 32; fflush (0); sleep (1);}} (103

1
Идея, лежащая в основе предыдущего комментария: сделайте его снова строчным после printf, тогда вам не нужно проверять, существует ли j-1. И используйте указатели, чтобы сохранить некоторые символы.

2
char *j,s[]="hello world";чтобы сохранить еще несколько символов.

1
f(){char*j,s[]="\rhello world";for(j=s;*++j;*j-=32,printf(s),*j+=32,fflush(0),sleep(1));}89 байт.
Карл Напф

2

Python 2, 220 189 179 байт

Решение без использования строк и capitalize()байтов, как есть:

import time,sys
from numpy import *
F=fromstring("\rhello world",int8)
for i in range(1,12):
    time.sleep(1)
    F[i]-=32
    savetxt(sys.stdout,F,fmt="%c",newline="")
    F[i]+=32

И немного более длинный вариант (191 символ) без сброса регистра:

import time,sys
from numpy import *
a=arange(11)
F=tile(fromstring("\rhello world",int8),(11,1))
F[a,a+1]-=32
for i in a:
    time.sleep(1)
    savetxt(sys.stdout,F[i],fmt="%c",newline="")

Добро пожаловать на сайт! Похоже, вы сделали лишние пробелы. Особенно вокруг ваших равных знаков
Wheat Wizard

2

C ++, 88 125 байт

#include<iostream>#include<unistd.h>
int main(){for(int c;++c<12;){char a[]="\rhello world";a[c]-=32;std::cout<<a;sleep(1);}}

Безголовая версия:

#include <iostream>
#include <unistd.h>

int main()
{
   for (int c;++c<12;)
   {
      char a[] = "\rhello world";
      a[c]-=32;
      std::cout << a;
      sleep(1);
   }
}

Скомпилировано с TDM-GCC на компьютере с Windows 10 с Dev-C ++.

Изменить: я забыл о включениях в моей первой версии.


Эй, ты парень, который помог мне с моим ответом на C #! Ваш подход C ++ заставил меня понять, что я действительно могу удалить это условие из моего forцикла, переместив возврат каретки в начало строки ... Я тоже вам помогу: выполнение for(int c=1;;c++)сэкономит вам 1 байт.
Метонием

Также, как вы предложили в моем ответе на C #, в сочетании с моим последним комментарием вы можете затем сделать, for(int c=1;;)а затем a[c++]-=32;сохранить еще один байт.
Метония

Но даже с возвратом каретки в начале, он все равно печатает символ (Ó в моем случае) на выход после hello world, хотя я не совсем уверен, почему ...
Snowfire

Это ... довольно странно. Этого не должно быть ?!
Метонием
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.