Làm sinh động văn bản trong thiết bị đầu cuối của bạn


46

Làm sinh động văn bản trong thiết bị đầu cuối của bạn

Mục đích

Mục tiêu là "làm động" chuỗi "Hello world" trong đầu ra của bạn để mỗi ký tự được viết hoa sau nhau.

Chương trình của bạn có thể thoát sau khi mỗi chữ cái được viết hoa.

Ví dụ;

# 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

Nó chỉ nên làm động chuỗi một lần và giữa mỗi trạng thái nên có độ trễ 1 giây.

Đầu vào

Không yêu cầu đầu vào, nhưng "Hello world" phải là chuỗi "hoạt hình".

Đầu ra

Chuỗi "Hello world" phải được làm động. Đầu ra phải là 1 dòng để tạo ra một loại hoạt hình sóng. Một dòng mới trống rỗng được cho phép. Ví dụ gif;

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

Tôi đã thấy điều này trên một video youtube metasploit và nghĩ rằng hiệu ứng này khá tuyệt, đó là nơi tôi đã ghi lại ảnh gif từ đó, vì vậy nó hơi lag, nhưng tôi hy vọng nó minh họa đầu ra tốt

Đây là , số byte thấp nhất sẽ được coi là người chiến thắng.

Liên kết hộp cát


Nó có thể thoát ra và dừng lại với một lỗi không?
Stewie Griffin

@StewieGriffin miễn là hình ảnh động có thể xem được, chắc chắn.
ʰᵈˑ

Tôi không nghĩ độ trễ 1 giây làm tăng thêm thách thức. Chúng tôi đã có một bó như thế và mỗi lần nó có vẻ giống như cái nồi hơi được thêm vào.
xnor

2
@xnor Bạn có nghĩa là thời gian trì hoãn là 1 giây rõ ràng, hoặc bạn có nghĩa là có bất kỳ độ trễ nào không? Latter sẽ không có ý nghĩa gì vì nó là một hình ảnh động ..
Metoniem

1
@Metoniem Không, chỉ những người được mô tả trong mục tiêu. Trừ khi tôi hiểu lầm. Mỗi lá thư phải được viết hoa một lần từ trái sang phải một lần duy nhất, bắt đầu với "H" trong "hello" và kết thúc bằng "D" trong "thế giới"
ʰᵈˑ

Câu trả lời:


33

Vim 26 byte

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

Giải thích (chưa có .gif):

Đầu tiên, chúng ta phải nhập văn bản 'xin chào thế giới'. Việc này thật thẳng thắn. Nó chỉ:

ihello world<ESC>

Tại thời điểm này, con trỏ nằm trên 'd' trong 'thế giới'. Kế tiếp:

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

Ngoài ra còn có hai phiên bản 26 byte khác mà tôi tìm thấy:

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

Người đàn ông thật tuyệt! Đây là đầu ra: i.gyazo.com/52d0b9268446aed36ce7eb641c40ff6c.gif (dù sao thì một nửa, Gyazo đã dừng ghi âm)
ʰᵈˑ

Tôi không nghĩ ~ phá vỡ vòng lặp . Tôi tin rằng đó là lcông việc khó khăn
Kritixi Lithos

@KritixiLithos Ah, sau khi thử nó, có vẻ như bạn đúng. Điểm hay, tôi sẽ chỉnh sửa nó ra
DJMcMayhem

1
Có thể xác nhận - Điều này hoạt động.
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 byte nhờ @ElPedro -4 byte nhờ @Jonathan ALLan và @Rod


3
Chào mừng bạn đến với PPCG, bài đăng đầu tiên tuyệt vời c:
Rod

2
Bài đăng hay! Điều này dường như có một chữ "H" và "W" cùng một lúc mặc dù repl.it/Fhii - Nó dường như không viết thường chữ "H"
ʰᵈˑ

1
Về vấn đề in, bạn có thể truyền -uđối sốsử dụng print"\t"+s[:x]+s[x:].title(),;(lưu ý dấu phẩy) . Và điều này sẽ không thay đổi số byte của bạn (vì đối số sẽ thêm +2 byte)
Rod

2
@Rod Cờ sẽ được tính là một byte vì một lệnh gọi chấp nhận được cho Python là python -c 'code here'. Với cờ, lời gọi sẽ là python -uc 'code here', một byte khác nhau.
Mego

1
Khá nhiều phiên bản của bạn, nhưng 95 byte và xóa màn hình (Tôi đã thử nghiệm với 2.7.8 trên Windows 7-64). Dùng thử trực tuyến không cung cấp cho hình ảnh động, chỉ là kết quả từng dòng.
Jonathan Allan

12

Hàng hóa 64, 168 162 137 133 byte BASIC (và mã thông báo) được sử dụng

 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ạn sẽ cần sử dụng các từ viết tắt BASIC để nhập từ này vào C64 hoặc trình giả lập thực (hoặc nhập chương trình vào Hàng hóa 128 và tải lại ở chế độ C64, mặc dù điều này cũng hoạt động trên 128). Các {control+n}sẽ chỉ làm việc / hiển thị sau khi trích dẫn khai mạc. Nó là viết tắt chr$(14)và do đó lưu một số byte và chuyển ký tự được đặt thành chế độ nghiệp vụ hoặc ký tự chữ hoa / thường.

Tôi đã thêm vào một số chữ viết tắt cho bạn để bạn. Ký {clear home}tự được tạo bằng cách nhấn ShiftCLR/HOMEphím sau dấu ngoặc kép mở.

Đối với mục đích minh họa, danh sách không được chứng minh có thể được nhập như sau:

 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

Nó hoạt động bằng cách chuyển bộ ký tự PETSCII sang chế độ kinh doanh (chữ hoa / chữ thường) và viết chuỗi hello world lên dòng trên cùng của màn hình được đặt tại vị trí bộ nhớ $ 0400, sau đó nó sẽ lấy giá trị ở mỗi vị trí cho lần tiếp theo 11 byte từ đó và tăng mỗi giá trị lên 64 (tương đương chữ hoa). Nếu bộ đếm j> 0, nó sẽ gọi một thường trình ở dòng 2 để giảm vị trí bộ nhớ trước đó xuống 64 lần nữa.

Dòng 3 là tạm dừng, nó cũng ghi một khoảng trắng đến vị trí $ 0405 và $ 040b, đây là một sửa lỗi (có thể được gỡ bỏ để lưu một số byte).

Phim hoạt hình Core thế giới xin chào


Tôi nên nói thêm rằng fori=0to1step0... nextivề cơ bản là tạo ra một vòng lặp vô hạn (không có goto), giống như while(true){...}trong các ngôn ngữ hiện đại hơn.
Shaun Bebbers

1
Tại sao bạn không sử dụng goto thay vì vòng lặp vô hạn? Ngay cả với 2 dòng mới sẽ được thêm vào, nó vẫn sẽ lưu byte. Ngoài ra, byte RAM không giống với số byte trong mã của bạn.
MilkyWay90

Bởi vì GO TObị cấm, phải ;-) Người ta có thể dễ dàng tự mình liệt kê danh sách CLRtrước khi xử lý các byte miễn phí còn lại với FRE(0)chức năng bị hỏng
Shaun Bebbers

1
oh xin lỗi về điều đó
MilkyWay90

11

C #, 230 215 193 161 135 134 130 byte

Đó là C # nên nó dài đúng! :-( Nhưng sau một số trợ giúp và tìm kiếm, tôi (và những người khác, thực sự) đã xoay sở để xóa chính xác 100 byte.

Chơi gôn

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

Ung dung

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

Ảnh chụp màn hình

Hoạt hình với độ trễ 1 giây Mặc dù có vẻ tốt hơn rất nhiều khi lặp và nhanh hơn ..

Cập nhật

  • Mất 15 byte bằng cách sử dụng trả lại vận chuyển thay vì Clear()điều đó cũng cho phép tôi thay thế việc sử dụng bằng System.Consolemột dòng nội tuyến.

  • Chương trình thay thế bằng lambda tiết kiệm 23 byte nhờ @devR Rich

  • Nó đã trở thành một sự hợp tác với @devR Rich vào thời điểm này, nhờ một số đề xuất của anh ấy, tôi đã mất thêm 32 byte!
  • Nhờ có 2 lời đề nghị thực sự thông minh và thú vị bằng cách @Kratz tôi quản lý để thay thế new string(b)với bb[i]=char.ToUpper(b[i])với b[i]-=' ', cứu tôi khác 26 byte!
  • Giảm 1 byte bằng cách di chuyển i++nhờ @Snowfire
  • Giảm 4 byte bằng cách di chuyển trở lại đầu chuỗi và xóa i<11khỏi forvòng lặp của tôi

1
Thay đổi class P{static void Main(){ ... }}để ()=>{ ... }cắt một vài byte. PPCG chấp nhận các chức năng như câu trả lời, vì vậy lambda hoạt động tốt.
devR Rich

@devR Rich Ah Tôi thấy, tôi chưa bao giờ sử dụng lambas trước đây, nhưng đó có vẻ là một cải tiến tuyệt vời. Cảm ơn!
Metoniem

Nếu bạn không biết cách sử dụng chúng (hoặc không muốn), thì vẫn đơn giản void g(){ ... }.
devR Rich

Bạn có thể truy cập các chuỗi có chỉ số mảng ( char g = string j[x]), để lưu khoảng 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);}}
devR Rich

1
Bạn có thể lưu một byte khác bằng cách loại bỏ gia số từ mệnh đề for và đưa nó vào truy cập mảng như thế nào b[i++]-=' '. Điều đó sẽ có ích, bởi vì sau đó bạn cũng có thể loại bỏ điều kiện trong vòng lặp for và chỉ cần viết for(int i=0;;). OP đã chỉ ra trong các ý kiến, rằng chương trình có thể thoát với một lỗi, vì vậy bạn có thể cho phép IndexOutOfRangeException
Snowfire

10

Powershell, 126 119 107 104 Byte

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

nhập mô tả hình ảnh ở đây

Sửa đổi (có thể sẽ có nhiều):

Thay đổi $s.Lengththành const 1011

Trình tạo chuỗi được cấu trúc lại, xóa 1 câu lệnh nối và được sử dụng ++$sthay thế ($s+1), để lưu một số byte nhờ @AdmBorkBork

AdmBorkBork chỉ ra rằng chỉ cần sử dụng chuỗi hai lần thực sự ngắn hơn đóng gói và sau đó là .ToLower()'nó - điều này nói lên rất nhiều về cách các quyền hạn dài dòng, -3!


về cơ bản lặp qua chiều dài của chuỗi, tạo thành một mảng gồm ba phần, tiền vốn, vốn và sau vốn, lấy 32 từ chữ cái giữa, sau đó chuyển đổi lại thành char để lấy chữ hoa, may mắn là điều này không Tôi cũng sẽ biến không gian thành một nhân vật hữu hình, tôi hy vọng điều này có thể chấp nhận được?


2
Bạn có thể lưu thêm ba byte ở phía trước bằng cách in chuỗi thay vì lưu vào $svà nhập chuỗi .ToLower(). -'Hello world';$s='hello world';
admBorkBork


9

Lắp ráp CP-1610 , 50 DECLE = 63 byte

Mã này được dự định để chạy trên Intellivision .

Mã op CP-1610 được mã hóa với giá trị 10 bit, được gọi là 'DECLE'. Chương trình này dài 50 DECLE, bắt đầu từ $ 4800 và kết thúc ở mức $ 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

Đầu ra

nhập mô tả hình ảnh ở đây


7

MATL , 30 byte

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

Hãy thử nó tại 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

Cảm ơn bạn @hd vì sự chậm trễ là một giây đầy đủ và không có phần nào trong số đó!
Cảm ơn @ user63956 cho 2 byte và @aross cho 3 byte.

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

Chạy với -nr.


1
Bạn có thể lưu 2 byte với sleep(print"$s\r").
dùng63956

1
Lưu 3 byte với ucfirst
vào

4

C, 97 đã rút 106 byte

với các ký tự thoát được tính là 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));}

Lưu ý: Tôi đã nhận xét về độ trễ thời gian trên TIO không được liên kết vì nó chờ hoàn thành trước khi hiển thị đầu ra, dường như nó cũng không nhận ra trả về vận chuyển và đặt các dòng mới. Ngoài ra, nếu bạn đang ở trên Windows, giấc ngủ sẽ tính bằng mili giây thay vì giây, vì vậy sleep(1)sẽ trở thành sleep(1000).

Lưu ý 2: Tôi đã rút mục này trong thời điểm này cho đến khi các lỗi đầu ra đã được giải quyết.


Vì một số lý do, điều này không xuất ra bất cứ thứ gì trên máy của tôi
Kritixi Lithos

Nếu bạn đang ở trên cửa sổ, bạn sẽ phải thay đổi độ trễ, nó cũng sẽ kết thúc khi trả về xe ngựa để bạn có thể muốn thay đổi 130 thành 129 để tránh in nó trong lần lặp cuối cùng.
Ahemone

Đối với tôi chương trình này hoàn toàn không kết thúc, và nó không tạo ra bất cứ điều gì. Tôi đã phải tự làm ^Cnó để ngăn chặn nó. (cũng là tôi trên mac)
Kritixi Lithos

Tôi tin rằng đây là sự cố bộ đệm in, tôi sẽ rút mục nhập của mình ngay bây giờ.
Ahemone

4

JavaScript (ES6), 141 139 131 byte

Đã lưu 8B nhờ 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)

Giải trình

Điều này tạo ra một hàm không có đối số, phân tách chuỗi hello worldthành một mảng các ký tự và viết hoa ký tự d+1thứ . dlà một bộ đếm bắt đầu như 0và được tăng lên mỗi lần.

Sử dụng

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

Thông minh, tôi sẽ cập nhật nó.
Lu-ca

Ngoài ra, tôi không thấy bất kỳ lý do nào để làm cho chức năng này, vì nó không có đầu vào - chỉ cần chạy mã, phải không?
apsillers

Câu hỏi nói rằng nó được coi là một chương trình, nhưng trong trường hợp đó bạn cũng có thể gửi một chức năng. Đoạn mã thường không được phép.
Lu-ca

Điều này thật tuyệt, gg!
ʰᵈˑ

Bạn có thể phân biệt giữa sự hiểu biết của bạn về "đoạn mã" không được phép so với "chương trình" được phép trong trường hợp này không? Nếu bạn chỉ cần loại bỏ các hàng đầu _=>bạn làm có một chương trình đầy đủ (ví dụ, nếu bạn bị mắc kẹt trong một tập tin, Node.js sẽ chạy thành công nó để hoàn thành). Sự hiểu biết của tôi về việc cấm "đoạn mã" là chống lại việc viết mã ngầm chấp nhận một số đầu vào là một biến, như "nếu chúng ta giả sử iđã có đầu vào, chúng ta có thể làm ..." điều này không xảy ra ở đây, vì rõ ràng là có không có đầu vào.
apsillers

4

Noodel , 22 byte

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

Thử nó:)


Làm thế nào nó hoạt động

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

Đoạn mã sử dụng phiên bản 25 byte lặp lại liên tục.

<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

ẢNH ĐỘNG: nhập mô tả hình ảnh ở đây

Làm thế nào nó hoạt động

Trình tự thoát ANSI \ecxóa màn hình.
Mỗi lần lặp, iký tự thứ nhất của chuỗi mã hóa cứng được thay thế bằng phiên bản chữ hoa của nó.
Các saychức năng luôn lợi nhuận True, được truyền lại cho các chức năng ngủ mà diễn giải nó như là 1thứ hai.


3

Ruby, 82 81 byte

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

^ H là ascii 8 (backspace) và chỉ có 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)));}

Biên dịch và chạy trên Linux.


3

Toán học, 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]

Giải thích: Từ i=111 đến 11, in từ ký tự thứ 1 đến ký tự (i-1) của "hello world", viết hoa "hello world"[i], sau đó in phần còn lại của chuỗi, tăng dần icùng một lúc.


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

Ung dung:

 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
Không nên interface A(có một không gian)? Thêm vào đó bạn có thể loại bỏ khoảng trống giữa ,Character.toUpperCase.
NoOneIsHere 7/12/17

2
Chào mừng đến với trang web!
DJMcMayhem

Kudos để @NoOneIsHere cho 3 điểm
DevelopingDeveloper

Cảm ơn @DJMcMayhem, Luôn thích đọc qua các thử thách và cuối cùng phải trả lời một!
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)}

Chỉ là một vòng lặp đơn giản, xóa bảng điều khiển có cat('\f')vẻ hơi phụ thuộc vào hệ thống nhưng tôi không biết cách nào tốt hơn.


Tôi đã cố gắng vượt qua điều này bằng cách sử dụng utf8ToInt. Điều này đã không làm việc, không gian cần phải được xử lý như một trường hợp đặc biệt. Trong quá trình tôi phát hiện ra rằng cat("\014")dường như làm việc tốt hơn sau đó làm việc cat("\f")không. nhưng không phải trên 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);}}

Ngắn hơn C #: D


1
Ngoài ra, để khung hình cuối cùng hiển thị, bạn phải thực hiện i<11thay vì i<10trong vòng lặp for của bạn
Kritixi Lithos

2

Perl, 75 byte

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

Sử dụng mã ANSI ESCcđể xóa bàn điều khiển và di chuyển con trỏ lên trên cùng bên trái ở mỗi lần lặp, nhưng vẫn cần \nở cuối chuỗi thay thế để tránh mất toàn bộ hoạt ảnh trong bộ đệm dòng.

Một cuộc gọi thành công để printtrả về giá trị 1, có thể được chuyển trực tiếp đến sleep.


Bạn có thể sử dụng $`$'lưu một vài byte trên đó (.{$_})(.)(.*)(nó sẽ không hoạt động trong một thiết bị đầu cuối, nhưng đó không phải là vấn đề). Nó yêu cầu sửa đổi một chút phần còn lại của mã của bạn : "hello world"=~s/./sleep print"\33c$`\U$&\E$'\n"/ger. (Tôi đã viết gần như mã chính xác này, sau đó khi tìm kiếm nếu ai đó đã đăng câu trả lời perl chưa, tôi đã tìm thấy mã của bạn). Và một chi tiết nhỏ về bytecount: bạn có thể sử dụng một dòng mới rác để lưu một byte và có thể một số loại rác \33c(mặc dù không chắc chắn về cái cuối cùng đó).
Dada

2

SmileBASIC, 90 71 byte

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

2

Thạch , 24 21 byte

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

Đây là một liên kết / chức năng niladic in ra STDOUT. Nó không hoạt động như một chương trình đầy đủ.

Mã không thể được kiểm tra trên TIO; nó sử dụng các ký tự điều khiển và TIO không có trình giả lập thiết bị đầu cuối (chưa).

Làm thế nào nó hoạt động

“½,⁻⁸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.)Thật là quỷ quyệt!
Erik the Outgolfer

2

C, 122 byte

Như một bài tập, tôi đã viết điều này để cung cấp một định dạng đầu ra tối ưu hơn so với một số câu trả lời khác. Ngoài ra, nó có nghĩa là con trỏ nằm sau chữ cái viết hoa gần đây nhất trong thời gian tạm dừng.

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

(Dòng mới và thụt lề mỹ phẩm và không phải là một phần của số byte)

Bây giờ, một số độc giả có thể lưu ý rằng điều này đòi hỏi một số thao tác xoa bóp để chạy trên các máy hiện đại (câu thần chú là -static -Wl,-N), nhưng đây là cách triển khai thực sự của C được sử dụng để hành xử, vì vậy tôi nghĩ rằng nó hợp lệ. Nó cũng giả sử bộ ký tự là ASCII và nó không in một dòng mới.

Phần thưởng: Đối với phiên bản EBCDIC, bạn có thể thay thế 8bằng 2264bằng 32, và chuyển đổi logic cho p[1]p[2]. Để kiểm tra trên hệ thống không phải EBCDIC, bạn có thể biên dịch với -funsigned-char -fexec-charset=cp037.

Đầu ra là 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}

Ung dung

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 choh(i)toUpper
Luôn hỏi

2

Mẻ, 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 %*

Thật kỳ lạ, dòng lệnh timeout/t>nul 1bị hỏng nếu không có dòng mới, vì vậy tôi không thể đặt nó ở cuối tập tin.


2

Ruby, 108 byte

Lần đầu tiên, sinh viên năm nhất. Đó không phải là đại bàng nhưng tôi ít nhất là một chút tự hào.

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

Không chính xác là hiệu quả nhất hoặc ngắn nhất, nhưng hoạt động khá tốt!

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.

Đã thử nghiệm và hoạt động trên Trình biên dịch Pascal miễn phí 2.6+.

Cảm ơn @manatwork vì đã tiết kiệm 35 byte!


Tôi đã sử dụng http://www.onlinecompiler.net/pascal để biên dịch tệp và chạy nó trên Windows.
Cho đến nay vẫn chưa thấy có vấn đề gì với nó.


Một UpCasechức năng tồn tại từ thời Turbo cũ. (Ở đó, nó chỉ xử lý Char, nhưng trong Free Pascal cũng xử lý các chuỗi.)
manatwork 14/2/2017

Một vài điều chỉnh nhỏ: là đủ để khai báo X Word(hoặc Byte); làm cho P a constđể nó nhập loại từ giá trị khởi tạo; trong khi đó, tạo X thành hằng số khởi tạo để loại bỏ vartừ khóa riêng biệt (từ này có thể không hoạt động trong tất cả các biến thể Pascal, nhưng chắc chắn là có trong Free Pascal); sử dụng ClrScrđể nhảy lên góc trên bên trái; thay thế ifbằng một biểu thức duy nhất : X:=X*Ord(X<11)+1. pastebin.com/FfaixkES
manatwork

Tôi thực sự không biết điều đó const X:Word=1;P='hello world';và điều đó const X:Word=1;P='hello world';là có thể. Tôi đã học Pascal trên Turbo Pascal 7, có thể không tương thích với điều đó. Và hoàn toàn quên mất upcase. Cảm ơn bạn rất nhiều!
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));}

Phiên bản ung dung

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 Cảm ơn bạn đã lưu một số byte, ý tưởng tuyệt vời. :)

@Pakk @KarlNapf Cảm ơn mọi người cho đầu vào của bạn.

vẫn có thể rút ngắn!? :)


Sử dụng -=+=. Ngoài ra, một biến con trỏ có thể lưu []nhưng tôi không chắc chắn.
Karl Napf

1
char * j; f () {char s [] = "xin chào thế giới"; for (j = s; * j; j ++) {* j- = 32; printf ("\ r% s", s); * j + = 32; fflush (0); ngủ (1);}} (103 ký tự)

1
Ý tưởng đằng sau nhận xét trước: Đặt lại chữ thường sau printf, sau đó bạn không phải kiểm tra xem j-1 có tồn tại không. Và sử dụng con trỏ để lưu một số ký tự.

2
char *j,s[]="hello world";để tiết kiệm thêm một vài ký tự.

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

Giải pháp mà không sử dụng chuỗi và capitalize(), đếm byte như sau:

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

Và một biến thể dài hơn một chút (191 ký tự) mà không cần đặt lại trường hợp:

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

Chào mừng đến với trang web! Có vẻ như bạn đã thực hiện thêm khoảng trắng. Đặc biệt xung quanh các dấu bằng của bạn
Wheat Wizard

2

C ++ 88 125 byte

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

Phiên bản bị đánh cắp:

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

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

Được biên dịch với TDM-GCC trên máy Windows 10 với Dev-C ++.

Chỉnh sửa: Tôi quên bao gồm trong phiên bản đầu tiên của tôi.


Này, bạn là người đã giúp tôi trả lời C # của tôi! Cách tiếp cận C ++ của bạn khiến tôi nhận ra rằng tôi thực sự có thể loại bỏ tình trạng đó khỏi forvòng lặp của mình bằng cách di chuyển trở lại vận chuyển về đầu chuỗi .. Tôi cũng sẽ giúp bạn: Làm for(int c=1;;c++)sẽ giúp bạn tiết kiệm 1 byte.
Metoniem

Cũng giống như bạn đã đề xuất trong câu trả lời C # của tôi, kết hợp với nhận xét cuối cùng của tôi, bạn có thể thực hiện for(int c=1;;)và sau đó a[c++]-=32;để lưu một byte khác.
Metoniem

Nhưng ngay cả khi trở về xe ngựa lúc ban đầu, nó vẫn in một ký tự (Ó trong trường hợp của tôi) ra đầu ra sau thế giới xin chào mặc dù tôi không thực sự chắc chắn tại sao ...
Snowfire

Điều đó ... khá lạ. Điều đó không nên xảy ra?!
Metoniem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.