Buat animasi teks di terminal Anda


46

Buat animasi teks di terminal Anda

Target

Tujuannya adalah untuk "menghidupkan" string "Halo dunia" di output Anda sehingga setiap karakter dikapitalisasi satu sama lain.

Program Anda dapat keluar setelah setiap huruf dikapitalisasi.

Sebagai contoh;

# 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

Seharusnya hanya menghidupkan string sekali dan antara setiap negara harus ada penundaan 1 detik.

Memasukkan

Tidak diperlukan input, tetapi "Halo dunia" harus berupa string yang "animasi".

Keluaran

String "Hello world" harus dianimasikan. Output harus berupa 1 baris untuk membuat semacam animasi gelombang. Baris baru trailing kosong diperbolehkan. Contoh gif;

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

Saya melihat ini di video youtube metasploit dan berpikir efeknya cukup keren, dari sanalah saya merekam gif, jadi agak lamban, tapi saya harap ini menggambarkan output yang bagus

Ini adalah , byte-count terendah akan dianggap sebagai pemenang.

Tautan Kotak Pasir


Bisakah itu keluar dan berhenti dengan kesalahan?
Stewie Griffin

@StewieGriffin selama animasinya dapat dilihat, tentu saja.
ʰᵈˑ

Saya tidak berpikir penundaan 1 detik menambah tantangan. Kami sudah memiliki banyak seperti itu dan setiap kali sepertinya boilerplate yang sama ditambahkan.
xnor

2
@ xnor Apakah maksud Anda durasi penundaan adalah 1 detik secara eksplisit, atau apakah Anda maksud penundaan sama sekali? Belakangan tidak masuk akal karena ini adalah animasi setelah semua ..
Metoniem

1
@Metoniem Tidak, hanya yang dijelaskan di tujuan. Kecuali saya salah paham. Setiap huruf harus dikapitalisasi sekali dari kiri ke kanan satu kali saja, dimulai dengan "H" di "halo" dan berakhir dengan "D" di "dunia"
ʰᵈˑ

Jawaban:


33

Vim 26 byte

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

Penjelasan (belum .gif):

Pertama, kita harus memasukkan teks 'hello world'. Ini sangat mudah. Hanya saja:

ihello world<ESC>

Pada titik ini, kursor berada di 'd' di 'dunia'. Lanjut:

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

Ada juga dua versi 26 byte lain yang saya temukan:

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

Man itu keren! Inilah hasilnya: i.gyazo.com/52d0b9268446aed36ce7eb641c40ff6c.gif (bagaimanapun juga, setengahnya, Gyazo berhenti merekam)
ʰᵈˑ

Saya tidak berpikir ~ istirahat loop . Saya percaya itu lyang melakukan kerja keras
Kritixi Lithos

@ KritixiLithos Ah, setelah mengujinya, sepertinya Anda benar. Poin
baiknya

1
Dapat mengkonfirmasi - Ini berfungsi.
SIGSTACKFAULT

15

Python 2, 98 94 90 byte

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

-9 -4 bytes berkat @ElPedro -4 bytes berkat @JonathanAllan dan @Rod


3
Selamat datang di PPCG, posting pertama yang bagus c:
Rod

2
Pos yang bagus! Ini tampaknya memiliki modal "H" dan "W" pada saat yang sama meskipun repl.it/Fhii - Tampaknya tidak mengurangi huruf "H"
ʰᵈˑ

1
Tentang masalah pencetakan, Anda dapat memberikan -uargumen dan menggunakan print"\t"+s[:x]+s[x:].title(),;(perhatikan koma yang tertinggal) . Dan ini tidak akan mengubah jumlah byte Anda (karena argumennya akan menambah +2 byte)
Rod

2
@Rod Bendera akan dihitung sebagai satu byte karena doa yang dapat diterima untuk Python adalah python -c 'code here'. Dengan bendera, doa akan menjadi python -uc 'code here', yang berbeda satu byte.
Mego

1
Cukup banyak versi Anda, tetapi 95 byte dan membersihkan layar (saya diuji dengan 2.7.8 pada Windows 7-64). Try It Online tidak memberikan animasi, hanya hasil baris demi baris.
Jonathan Allan

12

Commodore 64, 168 162 137 133 BASIC (dan tokenized) byte yang digunakan

 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

Anda perlu menggunakan singkatan kata kunci BASIC untuk memasukkan ini ke dalam C64 atau emulator yang sebenarnya (atau memasukkan program ke Commodore 128 dan memuatnya kembali dalam mode C64, meskipun ini juga bisa berfungsi pada 128). Hanya {control+n}akan bekerja / ditampilkan setelah kutipan pembukaan. Ini adalah singkatan untuk chr$(14)dan karenanya menyimpan beberapa byte dan mengalihkan karakter yang diatur ke mode bisnis atau karakter huruf besar / kecil.

Saya telah menambahkan beberapa singkatan untuk Anda juga untuk Anda. The {clear home}karakter dibuat dengan menekan Shiftdan CLR/HOMEkunci setelah tanda pembukaan kutip.

Untuk tujuan ilustrasi, daftar yang tidak diobservasi dapat dimasukkan sebagai berikut:

 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

Ia bekerja dengan mengubah charset PETSCII ke mode bisnis (huruf besar / kecil), dan menulis string hello world ke baris atas layar yang terletak di lokasi memori $ 0400, kemudian akan mengambil nilai di setiap lokasi untuk selanjutnya 11 byte dari sana dan meningkatkan masing-masing nilai sebesar 64 (setara dengan huruf besar). Jika penghitung j adalah> 0, ia memanggil rutin di saluran 2 untuk mengurangi lokasi memori sebelumnya sebanyak 64 lagi.

Baris 3 adalah jeda, ia juga menulis spasi ke lokasi $ 0405 dan $ 040b, yang merupakan perbaikan bug (yang mungkin bisa dihapus untuk menghemat beberapa byte).

Commodore C64 animasi hello world


Saya harus menambahkan bahwa fori=0to1step0... nextipada dasarnya membuat loop tak terbatas (kurang-goto), seperti while(true){...}dalam bahasa yang lebih modern.
Shaun Bebbers

1
Mengapa Anda tidak menggunakan goto saja sebagai ganti infinite loop? Bahkan dengan 2 baris baru yang harus ditambahkan, tetap akan menghemat byte. Juga byte RAM tidak sama dengan jumlah byte dalam kode Anda.
MilkyWay90

Karena GO TOdiblokir, kan ;-) Seseorang dapat dengan mudah mengerjakan daftar dengan sendirinya dengan CLRsebelum mengerjakan byte gratis yang tetap dengan FRE(0)fungsi yang rusak
Shaun Bebbers

1
oh maaf soal itu
MilkyWay90

11

C #, 230 215 193 161 135 134 130 byte

Ini C # jadi panjang kan! :-( Tapi setelah bantuan dan pencarian, saya (dan yang lainnya, benar-benar) berhasil menghapus 100 byte.

Golf

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

Tidak disatukan

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

Tangkapan layar

Animasi dengan penundaan 1 detik Meskipun terlihat jauh lebih baik saat perulangan dan lebih cepat ..

Pembaruan

  • Kehilangan 15 byte dengan menggunakan carriage return selain Clear()itu juga memungkinkan saya untuk mengganti penggunaan dengan System.Consolesuatu tempat inline.

  • Program yang diganti dengan lambda menghemat 23 byte berkat @devRicher

  • Ini menjadi semacam kolaborasi dengan @devRicher pada saat ini, berkat beberapa sarannya saya berhasil kehilangan 32 byte lagi!
  • Berkat 2 saran yang sangat cerdas dan menarik dari @Kratz saya berhasil mengganti new string(b)dengan bdan b[i]=char.ToUpper(b[i])dengan b[i]-=' ', menyelamatkan saya 26 byte lagi!
  • 1 byte lebih sedikit dengan memindahkan i++berkat @Snowfire
  • 4 byte lebih sedikit dengan menggerakkan carriage kembali ke awal string dan menghapus i<11dari forloop saya

1
Ubah class P{static void Main(){ ... }}ke ()=>{ ... }untuk memotong beberapa byte. PPCG menerima fungsi sebagai jawaban, sehingga lambda berfungsi dengan baik.
devRicher

@devRicher Ah saya mengerti, saya tidak pernah menggunakan lambas sebelumnya, tapi itu sepertinya perbaikan yang keren. Terima kasih!
Metoniem

Jika Anda tidak tahu cara menggunakannya (atau tidak mau), itu masih bagus untuk yang sederhana void g(){ ... }.
devRicher

Anda dapat mengakses string dengan indeks array ( char g = string j[x]), untuk menghemat sekitar 50 byte:()=>{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
Anda dapat menyimpan byte lain dengan menghapus kenaikan dari untuk klausa dan meletakkannya di akses array seperti b[i++]-=' '. Itu akan berguna, karena Anda juga dapat menghapus kondisi dalam for for dan hanya menulis for(int i=0;;). OP menunjukkan dalam komentar, bahwa program dapat keluar dengan kesalahan, sehingga Anda dapat mengizinkan IndexOutOfRangeException
Snowfire

10

Powershell, 126 119 107 104 Bytes

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

masukkan deskripsi gambar di sini

Revisi (kemungkinan akan ada banyak):

Ubah $s.Lengthke const 1011

Pembuat string yang direstrukturisasi, menghapus 1 pernyataan bergabung dan digunakan ++$ssebagai ganti ($s+1), untuk menyimpan beberapa byte berkat @AdmBorkBork

AdmBorkBork menunjukkan hanya menggunakan string dua kali sebenarnya lebih pendek dari enkapsulasi dan kemudian .ToLower()- yang mengatakan banyak tentang bagaimana verbose PowerShell, -3!


pada dasarnya loop melalui panjang string, membentuk array dari tiga bagian, pra-kapital, modal, dan pasca-kapital, mengambil 32 dari huruf tengah, kemudian mengkonversi kembali ke char untuk mendapatkan huruf besar, untungnya ini tidak mengubah ruang menjadi karakter yang terlihat baik, saya harap ini dapat diterima?


2
Anda dapat menyimpan tiga byte lebih banyak dari bagian depan hanya dengan mencetak string daripada menyimpannya $sdan .ToLower()memasangnya. -'Hello world';$s='hello world';
AdmBorkBork


9

Perakitan CP-1610 , 50 DECLEs = 63 byte

Kode ini dimaksudkan untuk dijalankan pada Intellivision .

Sebuah opcode CP-1610 dikodekan dengan nilai 10-bit, yang dikenal sebagai 'DECLE'. Program ini panjangnya 50 DECLE, mulai dari $ 4800 dan berakhir pada $ 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

Keluaran

masukkan deskripsi gambar di sini


7

MATL , 30 byte

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

Cobalah di 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 byte

Terima kasih @ hd atas keterlambatan satu detik penuh dan tanpa fraksi!
Terima kasih @ user63956 untuk 2 byte dan @aross selama 3 byte.

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

Jalankan dengan -nr.


1
Anda dapat menyimpan 2 byte dengan sleep(print"$s\r").
user63956

1
Hemat 3 byte dengan ucfirst
aross

4

C, 97 ditarik 106 byte

dengan karakter yang lolos dihitung sebagai 1 byte

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

Catatan: Saya telah berkomentar tentang keterlambatan waktu pada TIO yang tidak terhubung karena menunggu penyelesaian sebelum menampilkan output, juga sepertinya tidak mengenali carriage return dan menempatkan baris baru. Juga, jika Anda menggunakan Windows, tidur dalam milidetik alih-alih detik, jadisleep(1) seharusnya sleep(1000).

Catatan 2: Saya telah menarik entri ini untuk saat ini sampai bug keluaran telah disetrika.


Untuk beberapa alasan, ini tidak menghasilkan apa-apa di komputer saya
Kritixi Lithos

Jika Anda berada di windows, Anda harus mengubah penundaannya, itu juga akan selesai pada carriage return sehingga Anda mungkin ingin mengubah 130 hingga 129 sehingga ia menghindari mencetaknya selama iterasi terakhir.
Ahemone

Bagi saya program ini tidak berakhir sama sekali, dan tidak menghasilkan apa-apa. Saya harus secara manual ^Cuntuk menghentikannya. (juga saya di mac)
Kritixi Lithos

Saya percaya ini adalah masalah buffer cetak, saya akan menarik entri saya untuk saat ini.
Ahemone

4

JavaScript (ES6), 141 139 131 byte

8B tersimpan berkat 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)

Penjelasan

Ini menciptakan fungsi tanpa argumen, yang memisahkan string hello worldmenjadi array karakter dan huruf kapital d+1ke karakter th . dadalah penghitung yang dimulai dengan0 dan meningkat setiap kali.

Pemakaian

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

Pintar, saya akan memperbaruinya.
Luke

Juga, saya tidak melihat alasan untuk membuat fungsi ini, karena tidak memerlukan input - jalankan saja kode, kan?
apsillers

Pertanyaannya mengatakan itu seharusnya sebuah program, tetapi dalam hal ini Anda juga dapat mengirimkan fungsi. Cuplikan kode umumnya tidak diizinkan.
Luke

Ini bagus, gg!
ʰᵈˑ

Bisakah Anda membedakan antara pemahaman Anda tentang "cuplikan kode" yang tidak diizinkan dengan "program" yang diizinkan dalam kasus ini? Jika Anda hanya menghapus terkemuka _=>Anda lakukan memiliki program yang lengkap (misalnya, jika Anda terjebak dalam sebuah file, Node.js akan berjalan dengan sukses itu sampai selesai). Pemahaman saya tentang larangan "cuplikan kode" bertentangan dengan penulisan kode yang secara implisit menerima beberapa input sebagai variabel, seperti "jika kita menganggap isudah memiliki input, kita dapat melakukan ..." yang tidak terjadi di sini, karena ada secara eksplisit tidak ada input.
apsillers

4

Noodel , 22 byte

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

Cobalah:)


Bagaimana itu bekerja

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

Cuplikan menggunakan versi 25 byte yang loop terus menerus.

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

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 byte

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

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

GIF: masukkan deskripsi gambar di sini

Bagaimana itu bekerja

Urutan melarikan diri ANSI \ecmembersihkan layar.
Setiap iterasi, ikarakter th dari string hard-coded diganti dengan versi huruf besar.
The sayFungsi selalu kembali True, yang diteruskan ke fungsi tidur yang menafsirkan sebagai 1kedua.


3

Ruby, 82 81 byte

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

^ H adalah ascii 8 (backspace), dan hanya 1 byte.


3

C, 87 byte

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

Kompilasi dan berjalan di Linux.


3

Mathematica, 130 128 123 110 108 byte

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]

Penjelasan: Dari i=1ke 11, cetak dari karakter ke-1 ke (i-1) "hello world", gunakan huruf besar "hello world"[i], lalu cetak sisa string, tambahkan ipada saat yang sama.


3

Java 215 212 204 203 byte

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

Tidak Disatukan:

 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
Bukankah seharusnya interface A(dengan spasi)? Plus Anda dapat menghapus ruang antara ,dan Character.toUpperCase.
NoOneIsHere

2
Selamat datang di situs ini!
DJMcMayhem

Kudos to @NoOneIsHere untuk 3 poin
DevelopingDeveloper

Terima kasih @DJMcMayhem, Selalu suka membaca tantangan dan akhirnya harus menjawab satu!
DevelopingDeveloper

3

R , 106 103 byte

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

Hanya loop sederhana, membersihkan konsol dengan cat('\f')tampaknya agak tergantung pada sistem tetapi saya tidak mengetahui cara yang lebih baik.


Saya mencoba mengungguli ini menggunakan utf8ToInt. Ini tidak berhasil, ruang perlu ditangani sebagai kasus khusus. Dalam proses saya menemukan yang cat("\014")tampaknya bekerja lebih baik daripada bekerja di tempat yang cat("\f")tidak. tetapi tidak pada TIO
JayCe

2

C, 122 byte

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

Lebih pendek dari C #: D


1
Juga agar frame terakhir menjadi terlihat, Anda harus melakukan i<11alih - alih i<10dalam for-loop Anda
Kritixi Lithos

2

Perl, 75 byte

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

Menggunakan kode ANSI ESCcuntuk menghapus konsol dan memindahkan kursor ke kiri atas di setiap iterasi, tetapi masih perlu \ndi akhir string ganti untuk menghindari seluruh animasi hilang di buffer baris.

Panggilan yang berhasil untuk printmengembalikan nilai 1, yang dapat diteruskan langsung ke sleep.


Anda dapat menggunakan $`dan $'menyimpan beberapa byte pada itu (.{$_})(.)(.*)(itu tidak akan bekerja di terminal, tapi itu tidak masalah). Hal ini membutuhkan memodifikasi sedikit yang menggigit sisa kode Anda meskipun: "hello world"=~s/./sleep print"\33c$`\U$&\E$'\n"/ger. (Saya menulis hampir kode persis ini, lalu ketika mencari apakah ada yang telah memposting jawaban perl, saya menemukan milik Anda). Dan sedikit detail tentang bytecount: Anda dapat menggunakan baris baru litteral untuk menyimpan byte, dan mungkin beberapa jenis litteral \33c(tidak terlalu yakin tentang yang terakhir).
Dada

2

SmileBASIC, 90 71 byte

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

2

Jelly , 24 21 byte

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

Ini adalah tautan / fungsi niladik yang mencetak ke STDOUT. Itu tidak berfungsi sebagai program lengkap.

Kode tidak dapat diuji pada TIO; menggunakan karakter kontrol dan TIO tidak memiliki terminal emulator (belum).

Bagaimana itu bekerja

“½,⁻⁸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.)Itu licik!
Erik the Outgolfer

2

C, 122 byte

Sebagai latihan, saya menulis ini untuk memberikan format output yang lebih optimal daripada beberapa jawaban lainnya. Itu juga berarti kursor duduk setelah huruf besar terakhir selama jeda.

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

(Baris baru dan lekukan kosmetik dan bukan bagian dari jumlah byte)

Sekarang, beberapa pembaca mungkin mencatat bahwa ini memerlukan beberapa pemijatan untuk bisa dijalankan pada mesin modern (mantra ajaib -static -Wl,-N), tetapi ini adalah bagaimana implementasi nyata dari C dulu berperilaku, jadi saya pikir itu valid. Itu juga mengasumsikan set karakter adalah ASCII, dan itu tidak mencetak baris tambahan.

Bonus: Untuk versi EBCDIC, Anda dapat mengganti 8dengan 22dan 64dengan 32, dan mengganti logika untuk p[1]dan p[2]. Untuk menguji pada sistem non-EBCDIC, Anda dapat mengompilasinya -funsigned-char -fexec-charset=cp037.

Output adalah 43 byte: Hello world«H‹hE‹eL‹lL‹lO‹o ‹ W‹wO‹oR‹rL‹lD


2

Scala, 92 byte

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

Tidak disatukan

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 untukh(i)toUpper
Selalu Bertanya

2

Batch, 184 byte

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

Anehnya baris perintah untuk timeout/t>nul 1menjadi rusak jika tidak ada baris baru, jadi saya tidak bisa meletakkannya di akhir file.


2

Ruby, 108 byte

Pertama kali, siswa tahun pertama. Bukan elang, tapi setidaknya aku sedikit bangga.

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

2

Pascal, 187 152 byte

Bukan yang paling efisien atau yang terpendek, tetapi bekerja dengan sangat baik!

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.

Diuji dan bekerja pada Free Pascal Compiler 2.6+.

Terima kasih kepada @manatwork karena telah menghemat 35 byte!


Saya telah menggunakan http://www.onlinecompiler.net/pascal untuk mengkompilasi file dan menjalankannya di Windows.
Belum melihat masalah dengan itu, sejauh ini.


Suatu UpCasefungsi ada sejak zaman Turbo yang lama. (Di sana hanya ditangani Char, tetapi dalam Free Pascal juga menangani string.)
manatwork

Beberapa perubahan kecil: cukup untuk menyatakan X Word(atau Byte); membuat P constjadi tipe ini dari nilai inisialisasi; sementara di sana, jadikan X konstanta yang diinisialisasi untuk menghilangkan varkata kunci yang terpisah (yang ini mungkin tidak berfungsi di semua varian Pascal, tetapi tentu saja dalam Free Pascal); gunakan ClrScruntuk melompat ke sudut kiri atas; mengganti ifdengan ekspresi tunggal: X:=X*Ord(X<11)+1. pastebin.com/FfaixkES
manatwork

Saya benar-benar tidak tahu itu const X:Word=1;P='hello world';dan itu const X:Word=1;P='hello world';mungkin. Saya belajar Pascal di Turbo Pascal 7, yang mungkin tidak kompatibel dengan itu. Dan benar-benar lupa upcase. Terima kasih banyak!
Ismael Miguel

2

C 120 110 104 96 byte

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

Versi tidak disatukan

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 Terima kasih telah menyimpan beberapa byte, ide bagus. :)

@Pakk @KarlNapf Terima kasih kawan atas masukan Anda.

masih bisa dipersingkat !? :)


Gunakan -=dan +=. Juga, variabel pointer mungkin menyimpan []tetapi saya tidak yakin.
Karl Napf

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

1
Gagasan di balik komentar sebelumnya: Buat huruf kecil lagi setelah printf, maka Anda tidak perlu memeriksa apakah j-1 ada. Dan gunakan pointer untuk menyimpan beberapa karakter.

2
char *j,s[]="hello world";untuk menyimpan beberapa karakter lagi.

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

2

Python 2, 220 189 179 byte

Solusi tanpa menggunakan string dan capitalize(), jumlah byte seperti:

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

Dan varian yang sedikit lebih lama (191 karakter) tanpa pengaturan ulang case:

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

Selamat datang di situs ini! Sepertinya Anda telah melakukan spasi ekstra. Khususnya di sekitar tanda sama Anda
Wheat Wizard

2

C ++, 88 125 Bytes

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

Versi tidak disatukan:

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

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

Dikompilasi dengan TDM-GCC pada mesin Windows 10 dengan Dev-C ++.

Sunting: Saya lupa menyertakan dalam versi pertama saya.


Hei, kaulah pria yang membantuku dengan jawaban C #! Pendekatan C ++ Anda membuat saya sadar bahwa saya benar - benar dapat menghapus kondisi itu dari forloop saya dengan memindahkan carriage return ke awal string .. Saya juga akan membantu Anda: Melakukannya for(int c=1;;c++)akan menghemat 1 byte.
Metoniem

Juga seperti yang Anda sarankan dalam jawaban C # saya, dikombinasikan dengan komentar terakhir saya yang dapat Anda lakukan for(int c=1;;)kemudian a[c++]-=32;menyimpan byte lain.
Metoniem

Tetapi bahkan dengan kereta kembali di awal, masih mencetak karakter (case dalam kasus saya) ke output setelah hello world meskipun saya tidak benar-benar yakin mengapa ...
Snowfire

Itu ... agak aneh. Itu seharusnya tidak terjadi ?!
Metoniem
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.