Animuj tekst w swoim terminalu


46

Animuj tekst w swoim terminalu

Cel

Celem jest „animacja” ciągu „Witaj świecie” w twoich wynikach, tak aby każda postać była pisana wielkimi literami po sobie.

Twój program może wyjść po każdej dużej litery.

Na przykład;

# 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

Powinien animować ciąg tylko raz, a pomiędzy każdym stanem powinno być 1 sekundowe opóźnienie.

Wejście

Nie jest wymagane wprowadzanie danych, ale „Witaj świecie” musi być ciągiem „animowanym”.

Wynik

Ciąg „Witaj świecie” musi być animowany. Wyjście musi mieć 1 linię, aby stworzyć rodzaj animacji fali. Dozwolona jest pusta końcowa nowa linia. Przykład gif;

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

Widziałem to na wideo z YouTube Metasploit i pomyślałem, że efekt był całkiem fajny, z którego nagrałem gif, więc jest trochę opóźniony, ale mam nadzieję, że ilustruje to dobrze

To jest , najniższa liczba bajtów zostanie uznana za zwycięzcę.

Link do piaskownicy


Czy może wyjść i zatrzymać się z błędem?
Stewie Griffin

@StewieGriffin, o ile animacja jest widoczna, jasne.
ʰᵈˑ

Nie sądzę, że 1 sekundowe opóźnienie stanowi dodatkowe wyzwanie. Mieliśmy taką grupę i za każdym razem wydaje się, że dodawana jest ta sama płyta kotłowa.
xnor

2
@ xnor Czy masz na myśli, że czas trwania opóźnienia wynosi 1 sekundę, czy w ogóle masz na myśli jakieś opóźnienie? Później nie miałoby żadnego sensu, bo to w końcu animacja ...
Metoniem

1
@Metoniem Nie, tylko te opisane w bramce. Chyba że źle zrozumiałem. Każda litera musi być pisana wielkimi literami tylko raz od lewej do prawej, zaczynając od „H” w „hello”, a kończąc na „D” w „world”
ʰᵈˑ

Odpowiedzi:


33

Vim 26 bajtów

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

Objaśnienie (jeszcze nie .gif):

Najpierw musimy wpisać tekst „witaj świecie”. To całkiem proste. To poprostu:

ihello world<ESC>

W tym momencie kursor znajduje się na „d” w „świecie”. Kolejny:

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

Znalazłem też dwie inne 26-bajtowe wersje:

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

Człowieku, co jest fajne! Oto wynik: i.gyazo.com/52d0b9268446aed36ce7eb641c40ff6c.gif (w każdym razie połowa, Gyazo przestał nagrywać)
2017

Nie sądzę, żeby ~ przerywa pętlę . Wierzę, lże to ciężka praca
Kritixi Lithos

@KritixiLithos Ah, po przetestowaniu wydaje się, że masz rację. Dobrze, wyedytuję to
DJMcMayhem

1
Potwierdź - to działa.
SIGSTACKFAULT

15

Python 2, 98 94 90 bajtów

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

-9 -4 bajty dzięki @ElPedro -4 bajty dzięki @JonathanAllan i @Rod


3
Witamy w PPCG, niezły pierwszy post c:
Rod

2
Niezły post! Wydaje się, że ma to jednocześnie duże „H” i „W”, chociaż repl.it/Fhii - Wydaje się, że nie ma małych liter „H”
ʰᵈˑ

1
Jeśli chodzi o problem z drukowaniem, możesz przekazać -uargument i użyć print"\t"+s[:x]+s[x:].title(),;(zwróć uwagę na przecinek końcowy) . I to nie zmieni liczby bajtów (ponieważ argument dodałby +2 bajty)
Rod

2
@Rod Flaga byłaby liczona jako jeden bajt, ponieważ akceptowalnym wywołaniem dla Pythona jest python -c 'code here'. W przypadku flagi wywołanie byłoby python -uc 'code here'inne niż jeden bajt.
Mego

1
Prawie twoja wersja, ale 95 bajtów i czyści ekran (testowałem z 2.7.8 na Windows 7-64). Wypróbuj online nie daje animacji, tylko wynik linia po linii.
Jonathan Allan

12

Commodore 64, 168 162 137 133 Użyto bajtów BASIC (i tokenizowanych)

 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

Będziesz musiał użyć skrótów słowa kluczowego BASIC, aby wprowadzić to do prawdziwego C64 lub emulatora (lub wprowadź program do Commodore 128 i załaduj go z powrotem w trybie C64, chociaż powinno to również działać na 128). {control+n}Zadziała tylko / wyświetlacz po otwierającym cytatu. Jest to skrót, chr$(14)dlatego zapisuje niektóre bajty i przełącza zestaw znaków na tryb biznesowy lub wielkie / małe litery.

Dodałem dla ciebie kilka skrótów, więc ty. {clear home}Postać jest przez naciśnięcie Shifti CLR/HOMEklucz po cudzysłowem otwarcie.

W celach ilustracyjnych niepisany wykaz można wprowadzić w następujący sposób:

 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

Działa poprzez przełączenie zestawu znaków PETSCII w tryb biznesowy (wielkie / małe litery) i zapisanie ciągu znaków hello world w górnym wierszu ekranu, który znajduje się w lokalizacji pamięci 0400 $, następnie weźmie wartość w każdej lokalizacji dla następnego Stamtąd 11 bajtów i zwiększ każdą wartość o 64 (odpowiednik wielkich liter). Jeśli licznik j wynosi> 0, wywołuje procedurę w linii 2, aby ponownie zmniejszyć poprzednią lokalizację pamięci o 64.

Wiersz 3 to pauza, zapisuje także spację do lokalizacji 0405 $ i 040b, co jest naprawą błędu (który prawdopodobnie można by usunąć, aby zaoszczędzić trochę bajtów).

Commodore C64 animowany witaj świecie


Powinienem dodać, że fori=0to1step0... nextizasadniczo tworzy nieskończoną (bez goto) pętlę, trochę jak while(true){...}w bardziej współczesnych językach.
Shaun Bebbers

1
Dlaczego nie użyjesz goto zamiast nieskończonej pętli? Nawet z 2 nowymi liniami, które należałoby dodać, nadal oszczędzałby bajty. Również bajty RAM nie są takie same jak liczba bajtów w kodzie.
MilkyWay90,

Ponieważ GO TOjest zbanowany, prawda ;-) Można łatwo samodzielnie opracować listę, CLRzanim FRE(0)
opracuje

1
och przepraszam za to
MilkyWay90

11

C #, 230 215 193 161 135 134 130 bajtów

To jest C #, więc długo dobrze! :-( Ale po pomocy i wyszukiwaniu, ja (i inni, naprawdę) udało mi się usunąć dokładnie 100 bajtów.

Grał w golfa

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

Bez golfa

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);
        }
    }
}

Zrzut ekranu

Animacja z 1 sekundowym opóźnieniem Chociaż wygląda dużo lepiej, gdy pętla i szybciej ..

Aktualizacje

  • Straciłem 15 bajtów, używając znaku powrotu karetki zamiast tego, Clear()co pozwoliło mi również na zastąpienie znaku „ System.Consoleuse” ​​gdzieś inline.

  • Program zastąpiony przez lambda oszczędzający 23 bajty dzięki @devRicher

  • W tym momencie stała się to swego rodzaju współpraca z @devRicher , dzięki niektórym jego sugestiom udało mi się stracić kolejne 32 bajty!
  • Dzięki 2 naprawdę inteligentne i ciekawe sugestie by @Kratz udało mi się zamienić new string(b)z bi b[i]=char.ToUpper(b[i])z b[i]-=' ', oszczędzając mi kolejne 26 bajtów!
  • 1 bajt mniej dzięki przenoszeniu i++dzięki @Snowfire
  • 4 bajty mniej, przesuwając karetkę powrót na początek łańcucha i usuwając i<11z mojej forpętli

1
Zmień class P{static void Main(){ ... }}na, ()=>{ ... }aby wyciąć kilka bajtów. PPCG przyjmuje funkcje jako odpowiedzi, więc lambda działa dobrze.
devRicher

@devRicher Ah Rozumiem, nigdy wcześniej nie używałem lambas, ale wydaje się, że to świetna poprawa. Dzięki!
Metoniem

Jeśli nie wiesz, jak ich używać (lub nie chcesz), nadal jest w porządku void g(){ ... }.
devRicher

Możesz uzyskać dostęp do ciągów za pomocą indeksów tablicowych ( char g = string j[x]), aby zaoszczędzić około 50 bajtów:()=>{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
Możesz zapisać kolejny bajt, usuwając inkrementację z klauzuli for i umieszczając ją w dostępie do tablicy jak b[i++]-=' '. To by się przydało, ponieważ wtedy można również usunąć warunek w pętli for i po prostu napisać for(int i=0;;). OP wskazał w komentarzach, że program może wyjść z błędem, więc można zezwolić na wyjątek IndexOutOfRangeEx
Snowfire

10

PowerShell, 126 119 107 104 bajtów

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

wprowadź opis zdjęcia tutaj

Rewizje (prawdopodobnie będzie ich wiele):

Zmień $s.Lengthna const 1011

Restrukturyzowany konstruktor ciągów, usunięto 1 instrukcję join i zastosowano ++$szamiast niej ($s+1), aby zaoszczędzić trochę bajtów dzięki @AdmBorkBork

AdmBorkBork zwraca uwagę, że dwukrotne użycie łańcucha jest w rzeczywistości krótsze niż enkapsulacja, a następnie .ToLower()„odłożenie go” - co wiele mówi o tym, jak pełna jest PowerShell, -3!


w zasadzie przewiń przez długość łańcucha, ułóż tablicę z trzech części: przed-wielką, wielką i post-dużą, odejmij 32 od środkowej litery, a następnie przekonwertuj z powrotem na znak, aby uzyskać wielkie litery, na szczęście nie też nie zamienisz spacji w widoczną postać, mam nadzieję, że jest to do przyjęcia?


2
Możesz zaoszczędzić jeszcze trzy bajty z przodu, po prostu drukując ciąg zamiast zapisywać go $si .ToLower()wklejać. -'Hello world';$s='hello world';
AdmBorkBork


9

Zespół CP-1610 , 50 DECLE = 63 bajty

Ten kod jest przeznaczony do uruchamiania na Intellivision .

Kod operacji CP-1610 jest kodowany z 10-bitową wartością, znaną jako „DECLE”. Ten program ma 50 DECLE długości, zaczynając od 4800 $, a kończąc na 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

Wynik

wprowadź opis zdjęcia tutaj


7

MATL , 30 bajtów

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

Wypróbuj w 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 bajtów

Dziękuję @hd za opóźnienie trwające pełną sekundę i bez ułamka!
Dzięki @ user63956 za 2 bajty i @aross za 3 bajty.

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

Uruchom z -nr.


1
Możesz zapisać 2 bajty za pomocą sleep(print"$s\r").
user63956

1
Zaoszczędź 3 bajty dzięki ucfirst
aross

4

C, 97 wycofanych 106 bajtów

ze znakami ucieczki liczonymi jako 1 bajt

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));}

Uwaga: Skomentowałem opóźnienie czasowe dla niepowiązanego TIO, ponieważ czeka on na zakończenie przed wyświetleniem danych wyjściowych, nie wydaje się również rozpoznawać zwrotów karetki i umieszcza nowe wiersze. Ponadto, jeśli korzystasz z systemu Windows, sen trwa w milisekundach, a nie sekundach, więc sleep(1)powinno się to stać sleep(1000).

Uwaga 2: Wycofałem ten wpis na chwilę, dopóki błędy wyjściowe nie zostaną usunięte.


Z jakiegoś powodu nie wyświetla to niczego na moim komputerze
Kritixi Lithos

Jeśli korzystasz z systemu Windows, będziesz musiał zmienić opóźnienie, zakończy się ono również po powrocie karetki, więc możesz chcieć zmienić 130 na 129, aby uniknąć drukowania go podczas ostatniej iteracji.
Ahemone

Dla mnie ten program wcale się nie kończy i nic nie wypisuje. Musiałem ręcznie ^Cto zatrzymać. (też jestem na
Macu

Uważam, że to problem z buforem wydruku, na razie wycofam swój wpis.
Ahemone

4

JavaScript (ES6), 141 139 131 bajtów

Oszczędność 8B dzięki 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)

Wyjaśnienie

Tworzy to funkcję bez argumentów, która dzieli ciąg hello worldna tablicę znaków i wielką literę d+1zastępuje . djest licznikiem rozpoczynającym się 0i zwiększanym za każdym razem.

Stosowanie

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()

Sprytnie, zaktualizuję to.
Łukasz

Nie widzę też żadnego powodu, aby uczynić tę funkcję funkcją, ponieważ nie wymaga ona żadnych danych wejściowych - wystarczy uruchomić kod, prawda?
apsillers

Pytanie mówi, że to ma być program, ale w takim przypadku możesz również przesłać funkcję. Fragmenty kodu są na ogół niedozwolone.
Łukasz

To miło, gg!
2017

Czy potrafisz odróżnić rozumienie niedozwolonego „fragmentu kodu” od dozwolonego „programu” w tym przypadku? Jeśli po prostu usunąć wiodącym _=>pan zrobić mieć kompletny program (na przykład, jeśli zatrzymany go w pliku, node.js będzie działać poprawnie to do końca). Moje rozumienie zakazu „fragmentów kodu” jest przeciwne pisaniu kodu, który domyślnie przyjmuje pewne dane wejściowe jako zmienną, np. „Jeśli założymy, że ijuż ma dane wejściowe, możemy to zrobić…”, co nie dzieje się tutaj, ponieważ jest to wyraźnie brak wejścia.
apsillers

4

Noodel , 22 bajty

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

Spróbuj:)


Jak to działa

”<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.

Fragment używa 25-bajtowej wersji, która zapętla się w sposób ciągły.

<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>


4

Bash + coreutils, 99 98 bajtów

x=hello\ world
for((;n<11;)){
echo -en "\r${x:0:n}"`tr a-z A-Z<<<"${x:n:1}"`"${x:n+++1}"
sleep 1
}

3

Perl 6 , 65 61 bajtów

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

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

GIF: wprowadź opis zdjęcia tutaj

Jak to działa

Sekwencja ucieczki ANSI \ecczyści ekran.
W każdej iteracji iciąg znaków „na stałe” jest zastępowany wersją pisaną wielkimi literami. Funkcja zawsze powraca , który jest przekazywany do funkcji, która interpretuje ją jako snu sekund.
sayTrue1


3

Rubin, 82 81 bajtów

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

^ H to ascii 8 (backspace) i ma tylko 1 bajt.


3

C, 87 bajtów

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

Kompiluje i działa w systemie Linux.


3

Mathematica, 130 128 123 110 108 bajtów

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]

Objaśnienie: Od i=1do 11, drukuj od 1 do (i-1) znaku „hello world”, wielkie litery "hello world"[i], a następnie drukuj resztę łańcucha, zwiększając ijednocześnie.


3

Java 215 212 204 203 bajtów

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);}}}

Nie golfowany:

 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
Czy nie powinno być interface A(ze spacją)? Dodatkowo możesz usunąć odstęp między ,i Character.toUpperCase.
NoOneIsHere

2
Witamy na stronie!
DJMcMayhem

Wyrazy uznania dla @NoOneIsHere za 3 punkty
DevelopingDeveloper

Dzięki @DJMcMayhem, Zawsze lubiłem czytać wyzwania i wreszcie mogłem odpowiedzieć na jedno!
DevelopingDeveloper

3

R , 106 103 bajtów

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

Po prostu prosta pętla, czyszczenie konsoli cat('\f')wydaje się nieco zależne od systemu, ale nie znam lepszego sposobu.


Próbowałem wygrać z tym golfem utf8ToInt. To nie zadziałało, przestrzeń musi być traktowana jako specjalny przypadek. W trakcie procesu odkryłem, że cat("\014")wydaje się , że działa lepiej niż praca tam, gdzie cat("\f")nie. ale nie w TIO
JayCe

2

C, 122 bajty

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);}}

Krótszy niż C #: D


1
Aby ostatnia klatka była widoczna, musisz zrobić i<11zamiast i<10w pętli
for

2

Perl, 75 bajtów

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

Używa kodu ANSI, ESCcaby wyczyścić konsolę i przesuwać kursor w lewym górnym rogu przy każdej iteracji, ale nadal potrzebuje \nna końcu łańcucha zamiany, aby uniknąć utraty całej animacji w buforze linii.

Pomyślne wywołanie printzwraca wartość 1, którą można przekazać bezpośrednio do sleep.


Możesz użyć $`i $'zaoszczędzić na tym kilka bajtów (.{$_})(.)(.*)(nie będzie działać w terminalu, ale to nie jest problem). Wymaga to modyfikując trochę resztę kodu jednak: "hello world"=~s/./sleep print"\33c$`\U$&\E$'\n"/ger. (Napisałem prawie ten dokładnie kod, a kiedy szukałem, czy ktoś napisał już odpowiedź na perla, znalazłem twój). I mały szczegół na temat liczby bajtów: możesz użyć nowej linii literowej, aby zapisać bajt, a może jakiegoś rodzaju literału \33c(choć nie jestem zbyt pewien tego ostatniego).
Dada

2

SmileBASIC, 90 71 bajtów

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

2

Galaretka , 24 21 bajtów

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

Jest to niladyczne łącze / funkcja, która drukuje do STDOUT. To nie działa jako pełny program.

Kod nie może być testowany na TIO; używa znaków kontrolnych, a TIO nie ma emulatora terminali (jeszcze).

Jak to działa

“½,⁻⁸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.)To przebiegłe!
Erik the Outgolfer

2

C, 122 bajty

Jako ćwiczenie napisałem to, aby zapewnić bardziej optymalny format wyjściowy niż niektóre inne odpowiedzi. Oznacza to również, że kursor znajduje się za ostatnią wielką literą podczas przerw.

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]);
}

(Nowe linie i wcięcia kosmetyczne i nie są częścią liczby bajtów)

Teraz niektórzy czytelnicy mogą zauważyć, że wymaga to trochę masowania, aby uruchomić się na nowoczesnych maszynach (magiczna inkantacja -static -Wl,-N), ale tak właśnie zachowywały się rzeczywiste implementacje języka C, więc myślę, że jest to poprawne. Zakłada również, że zestaw znaków to ASCII i nie drukuje końcowego nowego wiersza.

Bonus: Za EBCDIC wersji, można zastąpić 8z 22i 64z 32, i przełączyć na logikę p[1]i p[2]. Aby przetestować w systemie innym niż EBCDIC, możesz dokonać kompilacji -funsigned-char -fexec-charset=cp037.

Dane wyjściowe to 43 bajty: Hello world«H‹hE‹eL‹lL‹lO‹o ‹ W‹wO‹oR‹rL‹lD


2

Scala, 92 bajty

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

Bez golfa

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 zah(i)toUpper
Zawsze pytający

2

Partia, 184 bajty

@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 %*

Co ciekawe, wiersz polecenia dla timeout/t>nul 1ulega uszkodzeniu, jeśli nie ma końcowego nowego wiersza, więc nie mogę go umieścić na końcu pliku.


2

Rubinowy, 108 bajtów

Pierwszy raz student pierwszego roku. To nie jest orzeł, ale jestem przynajmniej trochę dumny.

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

2

Pascal, 187 152 bajtów

Nie do końca najskuteczniejszy lub najkrótszy, ale działa całkiem dobrze!

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.

Testowane i działa na Free Pascal Compiler 2.6+.

Dzięki @manatwork za oszczędność 35 bajtów!


Użyłem http://www.onlinecompiler.net/pascal do skompilowania pliku i uruchomienia go w systemie Windows.
Jak dotąd nie widziałem z tym żadnego problemu.


UpCaseFunkcja istnieje od dawnych czasów Turbo. (Tam obsługiwane tylko Char, ale w Free Pascal obsługuje również ciągi znaków).
manatwork

Kilka drobnych poprawek: wystarczy, aby zadeklarować X Word(lub Byte); zrób P a, constaby wyprowadzał typ z wartości inicjalizacji; gdy tam jest, uczyń X inicjalizowaną stałą, aby pozbyć się osobnego varsłowa kluczowego (to może nie działać we wszystkich wariantach Pascala, ale na pewno działa w Wolnym Pascalu); użyj, ClrScraby przejść do lewego górnego rogu; zastąpić, że ifz jednym wyrażeniem: X:=X*Ord(X<11)+1. pastebin.com/FfaixkES
manatwork

Naprawdę tego nie wiedziałem const X:Word=1;P='hello world';i to const X:Word=1;P='hello world';było możliwe. Nauczyłem się Pascala na Turbo Pascal 7, który może nie być z tym zgodny. I zupełnie zapomniałem upcase. Dziękuję bardzo!
Ismael Miguel

2

C 120 110 104 96 bajtów

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

Wersja bez golfa

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 Dziękujemy za zapisanie niektórych bajtów, świetny pomysł. :)

@Pakk @KarlNapf Dzięki chłopaki za wasze wkłady.

można jeszcze skrócić !? :)


Użyj -=i +=. Ponadto zmienna wskaźnikowa może zapisać, []ale nie jestem pewien.
Karl Napf

1
char * j; f () {char s [] = "hello world"; for (j = s; * j; j ++) {* j- = 32; printf ("\ r% s", s); * j + = 32; fflush (0); sleep (1);}} (103 znaków)

1
Pomysł na poprzedni komentarz: Zrób ponownie małe litery po printf, wtedy nie musisz sprawdzać, czy j-1 istnieje. I użyj wskaźników, aby zapisać niektóre postacie.

2
char *j,s[]="hello world";aby zaoszczędzić jeszcze kilka znaków.

1
f(){char*j,s[]="\rhello world";for(j=s;*++j;*j-=32,printf(s),*j+=32,fflush(0),sleep(1));}89 bajtów.
Karl Napf

2

Python 2, 220 189 179 bajtów

Rozwiązanie bez użycia łańcuchów i capitalize()liczby bajtów, jak to jest:

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

I nieco dłuższy wariant (191 znaków) bez resetowania wielkości liter:

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="")

Witamy na stronie! Wygląda na to, że zrobiłeś dodatkowe białe znaki. Szczególnie wokół twoich znaków równości
Wheat Wizard

2

C ++, 88 125 bajtów

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

Wersja bez golfa:

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

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

Kompilowany z TDM-GCC na komputerze z systemem Windows 10 z Dev-C ++.

Edycja: Zapomniałem dołączeń w mojej pierwszej wersji.


Hej, jesteś facetem, który pomógł mi z moją odpowiedzią w języku C #! Twoje podejście do C ++ uświadomiło mi, że mogę usunąć ten warunek z mojej forpętli, przenosząc powrót karetki na początek łańcucha. Pomogę ci również: Wykonanie for(int c=1;;c++)pozwoli Ci zaoszczędzić 1 bajt.
Metoniem

Podobnie jak zasugerowałeś w mojej odpowiedzi w języku C #, w połączeniu z moim ostatnim komentarzem możesz wtedy zrobić, for(int c=1;;)a następnie a[c++]-=32;zapisać kolejny bajt.
Metoniem

Ale nawet po powrocie karetki na początku nadal drukuje znak (w moim przypadku) na wyjściu po świecie hello, chociaż nie jestem pewien, dlaczego ...
Snowfire

To ... raczej dziwne. To nie powinno się zdarzyć ?!
Metoniem
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.