ทำให้ข้อความในเทอร์มินัลของคุณเคลื่อนไหว


46

ทำให้ข้อความในเทอร์มินัลของคุณเคลื่อนไหว

เป้าหมาย

เป้าหมายคือ "เคลื่อนไหว" สตริง "Hello world" ในผลลัพธ์ของคุณเพื่อให้ตัวละครแต่ละตัวได้รับตัวพิมพ์ใหญ่หลังจากกัน

โปรแกรมของคุณสามารถออกได้หลังจากตัวอักษรตัวใหญ่ทุกตัว

ตัวอย่างเช่น;

# 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 metasploit และคิดว่าเอฟเฟกต์นั้นยอดเยี่ยมมากซึ่งเป็นที่ที่ฉันบันทึก gif จากดังนั้นมันจึงล้าหลังเล็กน้อย แต่ฉันหวังว่ามันจะแสดงผลลัพธ์ได้ดี

นี่คือไบต์ต่ำสุดจะถือเป็นผู้ชนะ

ลิงก์ Sandbox


มันสามารถออกและหยุดโดยมีข้อผิดพลาดหรือไม่?
Stewie Griffin

@StewieGriffin ตราบใดที่ภาพเคลื่อนไหวสามารถดูได้
2560

ฉันไม่คิดว่าการหน่วงเวลา 1 วินาทีจะเพิ่มความท้าทาย เรามีพวงแบบนั้นและทุกครั้งที่ดูเหมือนว่าจะมีการเพิ่มแผ่นเหล็กแผ่นเดียวกัน
xnor

2
@xnor คุณหมายถึงระยะเวลาของการล่าช้าเป็น 1 วินาทีอย่างชัดเจนหรือคุณหมายถึงการหน่วงเวลาใด ๆ เลยหรือไม่? Latter จะไม่เข้าท่าใด ๆ เนื่องจากเป็นอนิเมชั่น ..
Metoniem

1
@Metoniem ไม่เฉพาะสิ่งที่อธิบายไว้ในเป้าหมาย ถ้าฉันไม่เข้าใจผิด แต่ละตัวอักษรต้องเป็นตัวพิมพ์ใหญ่หนึ่งครั้งจากซ้ายไปขวาเพียงครั้งเดียวเริ่มต้นด้วย "H" ใน "สวัสดี" และลงท้ายด้วย "D" ใน "โลก"
ʰᵈˑ

คำตอบ:


33

เป็นกลุ่ม 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 Ah หลังจากทดสอบแล้วดูเหมือนว่าคุณพูดถูก จุดดีฉันจะแก้ไขมันออกมา
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, โพสต์แรกที่ดี c:
Rod

2
โพสต์ดี! ดูเหมือนว่าจะมีทุน "H" และ "W" ในเวลาเดียวกันแม้ว่าrepl.it/Fhii - ดูเหมือนว่าจะไม่ใช้ตัวพิมพ์เล็ก "H"
ʰᵈˑ

1
เกี่ยวกับปัญหาการพิมพ์คุณสามารถส่ง-uข้อโต้แย้งและการใช้งานprint"\t"+s[:x]+s[x:].title(),; (หมายเหตุจุลภาคต่อท้าย) และสิ่งนี้จะไม่เปลี่ยนแปลงนับไบต์ของคุณ (เพราะอาร์กิวเมนต์จะเพิ่ม 2 bytes)
ร็อด

2
@Rod python -c 'code here'ธงจะนับเป็นหนึ่งไบต์เพราะการภาวนาที่ยอมรับได้สำหรับงูหลามเป็น ด้วยแฟล็กการร้องขอจะเป็นpython -uc 'code here'ซึ่งเป็นหนึ่งไบต์ที่แตกต่างกัน
Mego

1
ค่อนข้างรุ่นของคุณ แต่ 95 ไบต์และล้างหน้าจอ (ฉันทดสอบกับ 2.7.8 บน Windows 7-64) ทดลองใช้ออนไลน์ไม่ได้ให้ภาพเคลื่อนไหวเพียงแค่ผลทีละบรรทัด
Jonathan Allan

13

พลเรือจัตวา 64, 168 162 137 133 ไบต์พื้นฐาน (และโทเค็น) ที่ใช้

 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

คุณจะต้องใช้ตัวย่อคำหลักพื้นฐานเพื่อป้อนสิ่งนี้ลงใน 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 ซึ่งเป็นการแก้ไขข้อบกพร่อง (ซึ่งอาจถูกลบออกเพื่อบันทึกไบต์บางส่วน)

พลเรือจัตวา C64 เคลื่อนไหวสวัสดีชาวโลก


ฉันควรจะเพิ่มว่าfori=0to1step0... nextiโดยพื้นฐานแล้วการสร้างลูปแบบไม่มีที่สิ้นสุด (goto-less) เป็นwhile(true){...}ภาษาที่ทันสมัยกว่า
Shaun Bebbers

1
ทำไมคุณไม่ใช้ goto แทนการวนซ้ำแบบไม่สิ้นสุด? แม้ว่าจะมีการขึ้นบรรทัดใหม่ 2 บรรทัดที่จะต้องเพิ่ม แต่ก็ยังคงบันทึกไบต์ ไบต์ RAM ก็ไม่เหมือนกันกับจำนวนไบต์ในรหัสของคุณ
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);}}

Ungolfed

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 อ่าฉันรู้ว่าฉันไม่เคยใช้ lambas มาก่อน แต่ดูเหมือนว่าจะเป็นการปรับปรุงที่ยอดเยี่ยม ขอบคุณ!
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
คุณสามารถบันทึกไบต์อื่นโดยการเอา incrementation b[i++]-=' 'จากสำหรับข้อและวางไว้ในการเข้าถึงอาร์เรย์เช่น นั่นจะเป็นประโยชน์เพราะคุณสามารถลบเงื่อนไขในลูป for และเขียนfor(int i=0;;)ได้ OP ชี้ให้เห็นในความคิดเห็นว่าโปรแกรมอาจออกโดยมีข้อผิดพลาดดังนั้นคุณสามารถอนุญาตให้ 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])}

ป้อนคำอธิบายรูปภาพที่นี่

การแก้ไข (น่าจะมีจำนวนมาก):

เปลี่ยน$s.Lengthเป็น const 1011

เครื่องมือสร้างสตริงที่ปรับโครงสร้างใหม่ได้ลบคำสั่งการเข้าร่วม 1 รายการและใช้++$sแทน($s+1)เพื่อบันทึกบางไบต์ด้วย@AdmBorkBork

AdmBorkBork ชี้ให้เห็นว่าการใช้สตริงสองครั้งจริง ๆ แล้วสั้นกว่าการห่อหุ้มและจากนั้นจึงนำ.ToLower()ไปใช้ซึ่งบอกได้มากมายเกี่ยวกับความสามารถของ verbose, -3!


โดยทั่วไปวนรอบความยาวของสตริงสร้างอาร์เรย์ของสามส่วน pre-capitcal เมืองหลวงและ post-capital เอา 32 ห่างจากตัวอักษรกลางแล้วแปลงกลับเป็น char เพื่อรับตัวพิมพ์ใหญ่โชคดีที่นี่ไม่ได้ ฉันจะเปลี่ยนที่ว่างให้กลายเป็นตัวละครที่มองเห็นได้ฉันหวังว่าสิ่งนี้จะเป็นที่ยอมรับได้หรือไม่


2
คุณสามารถบันทึกสามไบต์มากขึ้นปิดหน้าโดยเพียงแค่พิมพ์สตริงมากกว่าการบันทึกลงใน$sและ.ToLower()ไอเอ็นจีมัน -'Hello world';$s='hello world';
AdmBorkBork


9

ชุดประกอบCP-1610 , 50 DECLEs = 63 ไบต์

รหัสนี้มีวัตถุประสงค์ที่จะทำงานบนIntellivision

CP-1610 opcode ถูกเข้ารหัสด้วยค่า 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
aross

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 ที่ไม่ได้เชื่อมโยงเนื่องจากมันรอให้เสร็จก่อนที่จะแสดงผลลัพธ์มันก็ดูเหมือนจะไม่รู้จักการรับคืนของ carriage และใส่บรรทัดใหม่ นอกจากนี้หากคุณใช้ Windows การนอนหลับจะใช้เวลาเป็นมิลลิวินาทีแทนที่จะเป็นวินาทีดังนั้นsleep(1)ควรเป็นsleep(1000)เช่นนั้น

หมายเหตุ 2: ฉันได้ถอนรายการนี้ในขณะนี้จนกว่าข้อบกพร่องของเอาต์พุตจะถูกรีดออก


ด้วยเหตุผลบางอย่างสิ่งนี้จะไม่ส่งผลอะไรกับเครื่องของฉัน
Kritixi Lithos

หากคุณอยู่บนหน้าต่างที่คุณจะต้องเปลี่ยนความล่าช้ามันจะเสร็จสิ้นในการรับคืนรถดังนั้นคุณอาจต้องการเปลี่ยน 130 ถึง 129 เพื่อหลีกเลี่ยงการพิมพ์ในช่วงการทำซ้ำครั้งล่าสุด
Ahemone

สำหรับฉันโปรแกรมนี้ไม่ได้จบเลยและจะไม่ส่งออกอะไร ฉันต้อง^Cหยุดมันเอง (เช่นฉันใช้ mac)
Kritixi Lithos

ฉันเชื่อว่ามันเป็นปัญหาบัฟเฟอร์การพิมพ์ฉันจะถอนรายการของฉันในตอนนี้
Ahemone

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เป็น array ของตัวอักษรและใช้ประโยชน์d+1THตัวอักษร 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()

ฉลาดฉันจะอัปเดต
ลุค

นอกจากนี้ฉันไม่เห็นเหตุผลที่จะทำให้ฟังก์ชั่นนี้เพราะมันไม่มีการป้อนข้อมูล - เพียงแค่เรียกใช้รหัสใช่มั้ย
apsillers

คำถามบอกว่ามันควรจะเป็นโปรแกรม แต่ในกรณีนั้นคุณสามารถส่งฟังก์ชั่น โดยทั่วไปไม่อนุญาตให้ใช้ข้อมูลโค้ด
ลุค

นี่เป็นสิ่งที่ดี, gg!
2560

คุณสามารถแยกแยะระหว่างความเข้าใจของคุณเกี่ยวกับ "โค้ดขนาดสั้น" ที่ไม่ได้รับอนุญาตเมื่อเทียบกับ "โปรแกรม" ที่ได้รับอนุญาตในกรณีนี้ได้หรือไม่? หากคุณเพียงแค่เอาชั้นนำ_=>ที่คุณทำมีโปรแกรมที่สมบูรณ์ (เช่นหากคุณติดอยู่ในแฟ้ม Node.js จะทำงานได้สำเร็จก็จะเสร็จสิ้น) ความเข้าใจของฉันเกี่ยวกับข้อห้ามต่อ "โค้ดขนาดสั้น" นั้นขัดกับการเขียนโค้ดที่ยอมรับอินพุตโดยปริยายบางอย่างในรูปแบบของตัวแปรเช่น "ถ้าเราสมมติว่าiมีอินพุตอยู่แล้วเราสามารถทำได้ ... " ซึ่งไม่ได้เกิดขึ้นที่นี่ ไม่มีการป้อนข้อมูล
apsillers

4

Noodel ขนาด 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 bytes

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อักขระ 'th ของสตริงฮาร์ดโค้ดถูกแทนที่ด้วยเวอร์ชันตัวพิมพ์ใหญ่ ฟังก์ชั่นผลตอบแทนเสมอซึ่งจะส่งให้กับฟังก์ชั่นการนอนหลับที่ตีความว่าเป็นครั้งที่สอง
sayTrue1


3

Ruby, 82 81 ไบต์

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

^ H คือ ascii 8 (backspace) และมีเพียง 1 ไบต์


3

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 ขอบคุณพวกสำหรับอินพุตของคุณ

ยังสามารถย่อให้สั้นลง! :)


การใช้งานและ-= +=นอกจากนี้ตัวแปรตัวชี้อาจบันทึก[]แต่ฉันไม่แน่ใจ
Karl Napf

1
ถ่าน * j; f () {ถ่าน s [] = "สวัสดีโลก" สำหรับ (j = s; * j; j ++) {* j- = 32; printf ("\ r% s", s); * j + = 32; fflush (0); sleep (1);}} (103 chars)
PA71

1
แนวคิดเบื้องหลังความคิดเห็นก่อนหน้า: ทำให้เป็นตัวพิมพ์เล็กอีกครั้งหลังจาก printf แล้วคุณไม่ต้องตรวจสอบว่ามี j-1 อยู่หรือไม่ และใช้ตัวชี้เพื่อบันทึกอักขระบางตัว
PA71

2
char *j,s[]="hello world";เพื่อประหยัดตัวอักษรอีกสองสามตัว
PA71

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


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=1ถึง 11 ให้พิมพ์จากอักขระที่ 1 ถึง (i-1) th ของ "hello world" ให้เป็นตัวพิมพ์ใหญ่"hello world"[i]แล้วพิมพ์ส่วนที่เหลือของสตริงเพิ่มขึ้นiพร้อมกัน


3

Java 215 212 204 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);}}}

Ungolfed:

 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

ความรุ่งโรจน์ถึง @NoOneIsHere ที่นี่ 3 คะแนน
กำลังพัฒนาผู้พัฒนา

ขอบคุณ @DJMcMayhem ชอบอ่านความท้าทายเสมอและในที่สุดก็ต้องตอบคำถามนี้เสมอ!
กำลังพัฒนาผู้พัฒนา

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')ดูเหมือนว่าขึ้นอยู่กับระบบ แต่ฉันไม่รู้วิธีที่ดีกว่า


ฉันพยายาม outgolfing 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<10for-loop ของคุณ
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ซึ่งสามารถส่งโดยตรงไปยัง


คุณสามารถใช้$`และ$'บันทึกสองสามไบต์ในนั้น(.{$_})(.)(.*)(มันจะไม่ทำงานใน terminal แต่นั่นไม่ใช่ปัญหา) "hello world"=~s/./sleep print"\33c$`\U$&\E$'\n"/gerมันต้องมีการปรับเปลี่ยนเล็กน้อยส่วนที่เหลือของรหัสของคุณแม้ว่า: (ฉันเขียนโค้ดที่ถูกต้องเกือบนี้แล้วเมื่อดูว่ามีใครโพสต์คำตอบ perl ฉันก็พบว่าคุณ) และรายละเอียดเล็ก ๆ น้อย ๆ เกี่ยวกับ bytecount นี้คุณสามารถใช้การขึ้นบรรทัดใหม่ litteral บันทึกไบต์และอาจชนิดของ litteral บาง\33c(ไม่มากเกินไปแน่ใจเกี่ยวกับว่าคนสุดท้ายแม้ว่า)
Dada


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.)นั่นคดเคี้ยว!
Erik the Outgolfer

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

สกาลา, 92 ไบต์

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

Ungolfed

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

Ruby, 108 ไบต์

ครั้งแรกนักเรียนปีแรก มันไม่ใช่นกอินทรี แต่อย่างน้อยฉันก็รู้สึกภูมิใจ

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

2

Pascal, 187 152 bytes

ไม่ได้มีประสิทธิภาพมากที่สุดหรือสั้นที่สุด แต่ทำงานได้ดีทีเดียว!

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 จัดการกับสายอักขระด้วย)
manatwork

การปรับแต่งเล็กน้อย: เพียงพอที่จะประกาศ X Word(หรือByte); ทำให้ P a constดังนั้นมัน infers พิมพ์จากค่าเริ่มต้น; ในขณะนั้นให้ X เป็นค่าคงที่เริ่มต้นเพื่อกำจัดvarคำหลักแยกต่างหาก(อันนี้อาจไม่ทำงานในตัวแปร Pascal ทั้งหมด แต่แน่นอนใน Free Pascal); ใช้ClrScrเพื่อข้ามไปที่มุมซ้ายบน แทนที่ด้วยการแสดงออกเดียว:if pastebin.com/FfaixkESX:=X*Ord(X<11)+1
จัดการ

ฉันไม่รู้จริงๆconst X:Word=1;P='hello world';และนั่นconst X:Word=1;P='hello world';ก็เป็นไปได้ ฉันเรียน Pascal เกี่ยวกับ Turbo Pascal 7 ซึ่งอาจเข้ากันไม่ได้กับสิ่งนั้น upcaseและลืมสมบูรณ์เกี่ยวกับ ขอบคุณมาก!
Ismael Miguel

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

ยินดีต้อนรับสู่เว็บไซต์! ดูเหมือนว่าคุณได้ทำช่องว่างพิเศษ โดยเฉพาะรอบสัญญาณที่เท่ากันของคุณ
Wheat Wizard

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

แต่ถึงแม้จะมี carriage return ในตอนแรกมันก็ยังพิมพ์ตัวอักษร (case ในกรณีของฉัน) ไปยังเอาท์พุทหลังจากสวัสดีชาวโลกแม้ว่าฉันจะไม่แน่ใจว่าทำไม ...
Snowfire

นั่น ... ค่อนข้างแปลก นั่นไม่ควรเกิดขึ้น!
Metoniem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.