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


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.