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


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.