Анімуйте текст у своєму терміналі


46

Анімуйте текст у своєму терміналі

Мета

Мета - "анімувати" рядок "Привіт, світ" у своєму виході, щоб кожен символ мав велику літери один за одним.

Ваша програма може вийти після написання великої літери.

Наприклад;

# 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

Я бачив це на відео з метасплату youtube і думав, що ефект був досить класним, саме там я записав gif, так що це трохи мляво, але я сподіваюся, що це добре показує вихід

Це , переможцем буде вважатися найнижчий байт.

Пісочниця Посилання


Чи може він вийти та зупинитися з помилкою?
— Стюі Гріффін

@StewieGriffin до тих пір, поки анімація переглядається, обов'язково.
— ʰᵈˑ

Я не думаю, що затримка на 1 секунду спричинює складність. У нас була така купа, і кожен раз, здається, додається однакова котельня.
— xnor

2
@xnor Ви маєте на увазі, що тривалість затримки явно становить 1 секунду, або ви маєте на увазі будь-яку затримку? Пізніше не має сенсу, оскільки це анімація, зрештою ..
— Metoniem

1
@Metoniem Ні, лише ті, що описані в цілі. Якщо я не зрозумів. Кожен лист має бути написаний з великої літери один раз зліва направо лише раз, починаючи з "H" на "привіт" і закінчуючи на "D" на "світі"
— ʰᵈˑ

Відповіді:


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, хороший перший пост з:
— Rod

2
Гарний пост! Це, здається, має велику літеру "H" і "W" одночасно, хоча repl.it/Fhii - Схоже, це не
— замість

1
Щодо проблеми друку, ви можете передавати -uаргументи та використовувати print"\t"+s[:x]+s[x:].title(),;(зверніть увагу на кінцеву кому) . І це не змінить вашу кількість байтів (оскільки аргумент додасть +2 байти)
— пд

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){...}до більш сучасних мов.
— Shaun Bebbers

1
Чому ви просто не використовуєте гото замість нескінченного циклу? Навіть за допомогою двох нових рядків, які потрібно було б додати, це все одно збереже байти. Також байти оперативної пам'яті не такі, як кількість байтів у вашому коді.
— MilkyWay90

Оскільки GO TOце заборонено, правда ;-) Ви можете легко розробити лістинг самостійно, CLRперш ніж відпрацювати вільний байт, що залишився зі зламаною FRE(0)функцією
— Shaun Bebbers

1
про шкода про це
— MilkyWay90

11

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

Це C #, так це довго! :-( Але після деякої допомоги та пошуку мені (та іншим, справді) вдалося видалити рівно 100 байт.

Гольф

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

Безумовно

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 байти!
  • Завдяки 2 дійсно розумні і цікаві пропозиції по @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
Ви можете зберегти інший байт, видаливши приріст з пункту для і додавши його до типу масиву b[i++]-=' '. Це стане в нагоді, адже тоді ви також можете зняти умову в циклі for і просто написати for(int i=0;;). OP в коментарях зазначив, що програма може вийти з помилкою, тому ви можете дозволити 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

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

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


в основному проведіть через довжину рядка, сформуйте масив з трьох частин, попереднього капіталу, великого та пост-капіталу, відведіть 32 від середньої літери, а потім перетворіть назад до знака, щоб отримати верхній регістр, на щастя, це не Не перетворять простір у видимий символ, я сподіваюся, що це прийнятно?


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


9

CP-1610 збірка, 50 DECLE = 63 байт

Цей код призначений для запуску на Intellivision .

Опкод CP-1610 кодується з 10-бітовим значенням, відомим як "DECLE". Ця програма довжиною 50 DECLE, починаючи з $ 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
— 1717 року

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

Якщо ви знаходитесь у вікні, вам доведеться змінити затримку, вона також закінчиться поверненням каретки, тому ви, можливо, захочете змінити 130 на 129, щоб уникнути друку її під час останньої ітерації.
— Агемон

Для мене ця програма зовсім не закінчується, і вона нічого не дає. Мені довелося вручну ^Cце зупинити. (також я на mac)
— Kritixi Lithos

Я вважаю, що це проблема з буфером для друку, зараз я зніму свій запис.
— Агемон

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

Локшина , 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 (зворотний простір) і становить лише 1 байт.



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 до друкуйте від 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);}}}

Безголівки:

 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

Kudos to @NoOneIsHere за 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
— JayCe

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<10знаходитесь у циклі
— 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. (Я написав майже цей точний код, тоді, коли шукав, чи хтось ще розмістив відповідь на перл, я знайшов свій). І трохи подробиці про число рахунків: ви можете використовувати літеральний новий рядок, щоб зберегти байт, а може бути і якийсь літтерал \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ç€

Це niladic посилання / функція, яка друкує на 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.)Це хитро!
— Ерік Аутгольфер

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}

Безумовно

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 також обробляє рядки.)
— манатура

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

Я справді цього не знав, 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); сон (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="")

Ласкаво просимо на сайт! Схоже, ви зробили додатковий пробіл. Особливо навколо ваших рівних знаків
— Пшеничний майстер

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 байт.
— Metoniem

Так само, як ви запропонували у моїй відповіді C #, у поєднанні з моїм останнім коментарем ви могли потім зробити, for(int c=1;;)а потім a[c++]-=32;зберегти ще один байт.
— Metoniem

Але навіть коли повернення вагона на початку, воно все одно друкує персонаж (Ó в моєму випадку) на вихід після привіт світу, хоча я не дуже впевнений, чому ...
— Сніжна пожежа

Це ... досить дивно. Це не повинно статися ?!
— Metoniem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.