ターミナルでテキストをアニメートする


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回だけアニメーション化し、各状態の間に1秒の遅延が必要です。

入力

入力は不要ですが、「Hello world」は「アニメーション化された」文字列でなければなりません。

出力

文字列「Hello world」はアニメーション化する必要があります。ある種の波形アニメーションを作成するには、出力を1行にする必要があります。空の末尾の改行が許可されます。gifの例;

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

これをmetasploitのyoutubeビデオで見ましたが、エフェクトはかなりクールだと思いました。そこからgifを記録したので、少しラグがありますが、出力がうまくいくことを願っています

これは、最小バイト数が勝者と見なされます。

サンドボックスリンク


終了してエラーで停止できますか?
スティーヴィーグリフィン

@StewieGriffinアニメーションが表示される限り、確かに。
ʰᵈˑ

1秒の遅延が課題に追加されるとは思わない。そのような束があり、そのたびに同じ定型文が追加されているように見えます。
XNOR

2
@xnor遅延の期間が明示的に1秒であることを意味しますか、それとも遅延を意味しますか?それはすべての後にアニメーションだから、後者は...どんな意味がありません
Metoniem

1
@Metoniemいいえ、目標で説明されているものだけです。誤解しない限り。各文字は、「hello」の「H」で始まり、「world」の「D」で終わる、左から右に1回だけ大文字にする必要があります
17:06

回答:


33

Vim 26バイト

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

説明(.gifはまだありません):

まず、「hello world」テキストを入力する必要があります。これは非常に簡単です。それはただ:

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

私が見つけた他の2つの26バイトバージョンもあります。

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

かっこいい!出力は次のとおりです。i.gyazo.com/52d0b9268446aed36ce7eb641c40ff6c.gif(それの半分はとにかく、Gyazoが記録停止)
ʰᵈˑ

ループを~ 壊すとは思わない。私はそれがだと信じてハードワークをしているl
KritixiのLithos

@KritixiLithosああ、テストした後、あなたは正しいようです。良い点、私はそれを編集します
DJMcMayhem

1
確認できます-これは動作します。
SIGSTACKFAULT

15

Python 2、98 94 90バイト

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

-9 -4バイトは@ElPedroに感謝-4バイトは@JonathanAllanと@Rodに感謝


3
PPCGへようこそ、最初の投稿c:
ロッド

2
いい投稿です!これは、しかし、同時に資本「H」と「W」を持っているようだrepl.it/Fhii「H」を小文字ではないようだ-
ʰᵈˑ

1
印刷の問題については、-u引数を渡して使用print"\t"+s[:x]+s[x:].title(),;できます(末尾のコンマに注意してください)。(引数は2つのバイトを追加しているため)そして、これはあなたのバイト数を変更しません
ロッド

2
@Rod Pythonの受け入れ可能な呼び出しはであるため、フラグは1バイトとしてカウントされますpython -c 'code here'。フラグを使用すると、呼び出しpython -uc 'code here'は1バイト異なります。
メゴ

1
ほぼあなたのバージョンですが、95バイトで画面をクリアします(Windows 7-64で2.7.8でテストしました)。Try It Onlineは、アニメーションではなく、行ごとの結果を提供します。
ジョナサンアラン

12

Commodore 64、168 162 137 133 BASIC(およびトークン化)バイト使用

 0s=1024:?"{control+n}{clear home}hello world":fOi=.to1:fOj=.to11:x=pE(s+j):pokes+j,x+64
 1x=pE(1023+j):pO1023+j,abs(x-64):pO1029,32:pO1035,32:fOz=.to99:i=.:nEz,j,i

BASICキーワード略語を使用して、これを実際のC64またはエミュレーターに入力する必要があります(または、Commodore 128にプログラムを入力し、C64モードでロードし直しますが、128でも機能するはずです)。{control+n}開口部のみの引用符の後に/ディスプレイを動作します。これは短縮形であるためchr$(14)、いくつかのバイトを節約し、文字セットをビジネスモードまたは大文字/小文字に切り替えます

あなたのためにいくつかの略語を追加しました。{clear home}文字は、最初の引用符の後にキーShiftCLR/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にある画面の一番上の行にhello world文字列を書き込むことで動作し、次の各場所で値を取得します。そこから11バイト、各値を64ずつ増やします(大文字に相当)。jカウンタが> 0の場合、2行目でルーチンを呼び出して、以前のメモリ位置を64減らします。

3行目は一時停止です。また、$ 0405と$ 040bの場所にスペースを書き込みます。これはバグ修正です(おそらくいくつかのバイトを節約するために削除できます)。

コモドールC64アニメーションHello World


私はそれを追加する必要がありfori=0to1step0ます... nexti本質的にはwhile(true){...}、より近代的な言語のような無限(ゴートレス)ループを作成しています。
ショーンビバーズ

1
無限ループの代わりに単にgotoを使用してみませんか?追加する必要のある2つの改行があっても、バイトを節約できます。また、RAMバイトはコードのバイト数と同じではありません。
MilkyWay90

のでGO TO禁止されている、右;-)一つは簡単で、それ自体でリストを考え出すことがCLR壊れて空きバイトのままでワークアウトの前にFRE(0)機能
ショーンBebbers

1
ああごめんなさい
MilkyWay90

11

C位、230 215 193 161 135 134 130のバイト

それはC#なので、長い間正しい!:-(しかし、いくつかのヘルプと検索の後、私(および他の人は本当に)既に100バイトを正確に削除することができました。

ゴルフ

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

非ゴルフ

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

スクリーンショット

1秒の遅延を伴うアニメーション ループするときはずっと良く見えますが、高速です。

更新情報

  • 代わりにキャリッジリターンを使用して15バイトを失っClear()たため、usingをSystem.Consoleインラインのどこかに置き換えることができました。

  • @devRicherのおかげでプログラムを23バイトを節約するラムダに置き換えました

  • この時点で@devRicherとのコラボレーションのようなものになりました。彼の提案のいくつかのおかげで、私はもう32バイトを失うことになりました!
  • @Kratzによる2つの非常にスマートで興味深い提案のおかげで、に置き換えnew string(b)られbb[i]=char.ToUpper(b[i])で置き換えられ、b[i]-=' 'さらに26バイト節約されました!
  • @Snowfireのi++おかげで移動により1バイト
  • キャリッジリターンを文字列の先頭に移動i<11してforループから削除することにより、4バイト短縮

1
に変更class P{static void Main(){ ... }}()=>{ ... }て、数バイトを切り取ります。PPCGは関数を答えとして受け入れるため、ラムダは正常に機能します。
devRicher

@devRicherああ、私は前にランバを使ったことがありませんが、それはクールな改善のようです。ありがとう!
メトニエム

それらの使用方法がわからない(または使いたくない)場合でも、単純なにはまだ問題ありません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
for句からインクリメントを削除し、配列アクセスにを入れることで、別のバイトを保存できますb[i++]-=' '。それは、forループ内の条件を削除して、単に書き込むことができるため、便利ですfor(int i=0;;)。OPはコメントで指摘しており、プログラムがエラーで終了する可能性があるため、IndexOutOfRangeException
Snowfire

10

PowerShellの、126 119 107 104のバイト

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

ここに画像の説明を入力してください

改訂(多くの場合あります):

$s.Lengthconst 1011 への変更

再構築された文字列ビルダー、1つの結合ステートメントを削除し、@の++$s代わりに使用($s+1)して、@ AdmBorkBorkのおかげでいくつかのバイトを節約

AdmBorkBorkは、文字列を2回使用するだけで、実際にカプセル化してからそれよりも短くなることを指摘しています.ToLower()


基本的に、文字列の長さをループし、3つの部分、pre-capitcal、capital、post-capitalの配列を形成し、中間文字から32を取り出し、大文字に戻すために文字に変換します。スペースも目に見えるキャラクターに変えないでください、これが受け入れられることを望みますか?


2
あなたは、単に文字列を印刷するのではなくにそれを保存することにより、フロントオフ3つの以上のバイトを保存することができます$sし、.ToLower()それをINGの。-'Hello world';$s='hello world';
AdmBorkBork


9

CP-1610アセンブリ、50 DECLE = 63バイト

このコードは、Intellivisionで実行することを目的としています。

CP-1610オペコードは、「DECLE」として知られる10ビット値でエンコードされます。このプログラムは50ドルで、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に感謝します。遅延は1秒であり、その端数はありません!
2バイトの@ user63956と3バイトの@arossに感謝します。

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

で実行し-nrます。


1
で2バイト節約できますsleep(print"$s\r")
user63956


4

C、97は 106バイトを撤回

エスケープ文字が1バイトとしてカウントされる

char*a="HELLO\0WORLD\xED";b,c;m(){for(b=0;b<156;putchar(a[c]+32*(b/12^c||c==5)))(c=b++%12)||fflush(sleep(1));}

注:リンクされていないTIOは、出力を表示する前に完了を待機し、キャリッジリターンを認識せず、新しい行を追加するため、遅延コメントアウトしました。また、Windowsを使用している場合、スリープは秒ではなくミリ秒単位であるため、にsleep(1)なりsleep(1000)ます。

注2:出力のバグが解決されるまで、このエントリを取り下げました。


何らかの理由で、これは私のマシンで何も出力しません
KritixiのLithos

Windowsを使用している場合は、遅延を変更する必要があります。また、キャリッジリターンで終了するため、130から129に変更して、最後の反復中に印刷しないようにすることができます。
アヘモネ

私にとって、このプログラムはまったく終わらないし、何も出力しません。手動^Cで停止する必要がありました。(私もMacを使用しています)
Kritixi Lithos

これは印刷バッファの問題だと思うので、とりあえずエントリーを取り下げます。
アヘモネ

4

JavaScript(ES6)、141 139 131バイト

Apsillersのおかげで8B節約

_=>a=setInterval("b=[...`hello world`],c.clear(b[d]=b[d].toUpperCase(++d>10&&clearInterval(a))),c.log(b.join``)",1e3,c=console,d=0)

説明

これにより、引数なしの関数が作成hello worldされ、文字列が文字の配列に分割され、d+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!
ʰᵈˑ

この場合、許可されていない「コードスニペット」と許可されている「プログラム」の理解を区別できますか?あなただけの有力削除した場合_=>、あなたが行う完全なプログラムを持っている(あなたはそれをファイルに立ち往生している場合など、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バイト

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

ルビー、82 81バイト

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

^ Hはascii 8(バックスペース)であり、1バイトのみです。



3

Mathematicaの、130の 128 123 110 108バイト

Dynamic@o
s="hello world";i=1;t=StringTake;Do[o=t[s,{1,i-1}]<>Capitalize@t[s,{i}]<>t[s,{++i,11}];Pause@1,11]

説明:i=111から11まで、「hello world」の1番目から(i-1)番目の文字"hello world"[i]までを印刷し、大文字にしてから、残りの文字列をi同時にインクリメントしながら印刷します。


3

ジャワ215 212 204 203バイト

interface A{static void main(String z[])throws Exception{for(int i=0;i<10;i++){char[]b="helloworld".toCharArray();b[i]=Character.toUpperCase(b[i]);System.out.println(new String(b));Thread.sleep(1000);}}}

ゴルフをしていない:

 interface A {
 static void main(String z[]) throws Exception {
    for (int i = 0; i < 10; i++) {
        char[] b = "helloworld".toCharArray();
        b[i] = Character.toUpperCase(b[i]);
        System.out.println(new String(b));
        Thread.sleep(1000);
    }
  }
}

1
interface A(スペースで)あるべきではありませんか?さらに、,との間のスペースを削除できますCharacter.toUpperCase
NoOneIsHere

2
サイトへようこそ!
DJMcMayhem

3点について@NoOneIsHereに賞賛
DevelopingDeveloper

@DJMcMayhemに感謝します。常に課題を読むのが好きで、最終的に課題に答えました!
DevelopingDeveloper

3

R106103バイト

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

コンソールをクリアするだけの単純なループは、cat('\f')システムにある程度依存しているように見えますが、より良い方法を知りません。


を使用してこれをアウトゴルフしようとしましたutf8ToInt。これは機能しませんでした。スペースは特別なケースとして処理する必要があります。私が発見したプロセスcat("\014")cat("\f")は、それがうまくいかなかった場所よりもうまくいくように見えました。TIOではありません
JayCe

2

C、122バイト

i;f(){char s[]="Hello world\r";for(i=0;i<11;i++){s[i]=toupper(s[i]);s[i-1]=tolower(s[i-1]);printf(s);fflush(0);sleep(1);}}

C#より短い:D


1
最後のフレームが表示されるようにまたのために、あなたがしなければならないi<11代わりにi<10、あなたのforループで
KritixiのLithos

2

Perl、75バイト

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

ANSIコードESCcを使用して、コンソールをクリアし、カーソルを各反復で左上に移動します\nが、ラインバッファーでアニメーション全体が失われないようにするために、置換文字列の最後に必要です。

の呼び出しに成功するとprint、値1が返されます。この値はに直接渡すことができますsleep


とを使用$`$'て、その上に数バイトを保存できます(.{$_})(.)(.*)(ターミナルでは機能しませんが、それは問題ではありません)。ただし、残りのコードを少し変更する必要があります"hello world"=~s/./sleep print"\33c$`\U$&\E$'\n"/ger。(私はこの正確なコードをほぼ書いたので、誰かがperlの回答をまだ投稿していないかどうかを調べたところ、あなたのものを見つけました)。そして、バイトカウントについての少しの詳細:あなたは、リターラル改行を使用してバイトを保存することができます\33c
ダダ

2

SmileBASIC、90 71バイト

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

2

ゼリー24 21バイト

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

これは、STDOUTに出力されるニラディックリンク/関数です。完全なプログラムとしては機能しません。

TIOでコードをテストすることはできません。制御文字を使用し、TIOにはターミナルエミュレータが(まだ)ありません。

使い方

“½,⁻⁸3»Jç€  Niladic link. No arguments.

“½,⁻⁸3»     Index into Jelly's dictionary to yield "hello world".
       J    Indices; yield [1, ..., 11].
        ç€  Apply the helper link to each index, with right arg. "hello world".


”Æ⁹Œu⁸¦ȮœS  Dyadic helper link. Left argument: i. Right argument: "hello world"

Ӯ          Set the return value to '\r'.
  ⁹         Set the return value to "hello world". Implicitly prints '\r'.
   Œu⁸¦     Uppercase the i-th letter.
       Ȯ    Print.
        œS  Sleep "hello world" seconds. (Strings are cast to Boolean.)

(Strings are cast to Boolean.)それは不正です!
エリックアウトゴルファー

2

C、122バイト

演習として、他のいくつかの回答よりも最適な出力形式を提供するためにこれを書きました。また、一時停止中にカーソルが最後に大文字になった文字の後に置かれます。

main(){
    char*p=".Hello world\rH";
    write(1,p+1,13);
    do{
        sleep(1);
        *p=8;
        p[1]|=32;
        p[2]^=(p[2]>32)*32;
        write(1,p++,3);
    }while(p[4]);
}

(改行とインデントは表面的なものであり、バイトカウントの一部ではありません)

現在、一部の読者は、これには現代のマシンで実行するにはマッサージが必要であることに注意するかもしれません(魔法の呪文はそうです-static -Wl,-N)が、これはCの実際の実装が振る舞う方法であったため、有効だと思います。また、文字セットがASCIIであると想定し、末尾の改行を出力しません。

ボーナス:EBCDICバージョンの場合、あなたは置き換えることができる82264して32、そしてためのロジックを切り替えるp[1]p[2]。非EBCDICシステムでテストするには、でコンパイルできます-funsigned-char -fexec-charset=cp037

出力は43バイトです。 Hello world«H‹hE‹eL‹lL‹lO‹o ‹ W‹wO‹oR‹rL‹lD


2

Scala、92バイト

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

非ゴルフ

val h="hello world"    //declare a variable h with the string "hello world"
0 to 10                //create a range from 0 to 10
map { i=>              //loop with index i
  print(                 //print
    "\b" * 99              //99 backspace chars
    + h.updated(           //and h with
      i,                     //the i-th char
      h(i).toUpper           //replaced with the i-th char in uppercase
    )     
  )
  Thread sleep 999       //sleep 999 ms
}

1
+1h(i)toUpper
常に尋ねる

2

バッチ、184バイト

@echo off
for %%h in (Hello hEllo heLlo helLo hellO hello)do call:c %%h world
for %%w in (World wOrld woRld worLd worlD)do call:c hello %%w
exit/b
:c
timeout/t>nul 1
cls
echo %*

奇妙なことに、timeout/t>nul 1末尾の改行がない場合、コマンドラインが破損するため、ファイルの最後に配置できません。


2

ルビー、108バイト

初めて、一年生。それはワシではありませんが、私は少なくとも少し誇りに思っています。

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

2

パスカル、187 152バイト

正確に最も効率的でも最短でもありませんが、非常にうまく機能します!

uses crt,sysutils;label R;const X:Word=1;P='hello world';begin
R:clrscr;write(P);gotoxy(X,1);write(upcase(P[X]));sleep(999);X:=X*Ord(X<11)+1;goto R
end.

Free Pascal Compiler 2.6+でテストおよび動作します。

35バイトを節約してくれた@manatworkに感謝します!


http://www.onlinecompiler.net/pascalを使用してファイルをコンパイルし、Windowsで実行しました。
今のところ問題はありません。


UpCaseこの関数は古いターボ時代から存在しています。(そこでのみChar処理しますが、Free Pascalでは文字列も処理します。)
manatwork

いくつかの小さな調整:X Word(またはByte)を宣言するには十分です。const初期化値から型を推測するようにPを作成します。そこにいる間に、Xを初期化された定数にして、個別のvarキーワードを取り除きます(これはすべてのPascalバリアントで機能するわけではありませんが、Free Pascalでは確かに機能します)。ClrScr左上隅にジャンプするために使用します。それifを単一の式に置き換えますX:=X*Ord(X<11)+1pastebin.com/FfaixkES
manatwork

私は本当にそれを知りませんでした、const X:Word=1;P='hello world';そして、それconst X:Word=1;P='hello world';は可能でした。Turbo Pascal 7でPascalを学びましたが、これは互換性がない可能性があります。そして、完全に忘れていましたupcase。本当にありがとうございます!
イスマエルミゲル

2

C 120 110 104 96バイト

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

ゴルフされていないバージョン

void f()
{
  char *j;
  char s[]="hello world";
  j=s; 

   for (;*j;j++)
   {
      *j-=32;  
       printf(s); // print the string and right after change the same char to lower case
       *j+=32;
      fflush(0);
      sleep(1);
   }

}

@Pakkいくつかのバイトを保存してくれてありがとう、素晴らしいアイデア。:)

@Pakk @KarlNapfご意見ありがとうございます。

それでも短縮できます!?:)


とを使用-=+=ます。また、ポインター変数が保存される可能性がありますが[]、わかりません。
カールナップ

1
char * j; f(){char s [] = "hello world"; for(j = s; * j; j ++){* j- = 32; printf( "\ r%s"、s); * j + = 32; fflushは(0);睡眠(1);}}(103文字)

1
前のコメントの背後にあるアイデア:printfの後に再度小文字にすることで、j-1が存在するかどうかを確認する必要がなくなります。また、ポインターを使用して一部の文字を保存します。

2
char *j,s[]="hello world";さらにいくつかの文字を保存します。

1
f(){char*j,s[]="\rhello world";for(j=s;*++j;*j-=32,printf(s),*j+=32,fflush(0),sleep(1));}89バイト。
カールナップ

2

Python 2、220 189 179バイト

文字列とを使用しないソリューションcapitalize()、バイトカウントはそのまま:

import time,sys
from numpy import *
F=fromstring("\rhello world",int8)
for i in range(1,12):
    time.sleep(1)
    F[i]-=32
    savetxt(sys.stdout,F,fmt="%c",newline="")
    F[i]+=32

そして、大文字と小文字をリセットせずに少し長い亜種(191文字):

import time,sys
from numpy import *
a=arange(11)
F=tile(fromstring("\rhello world",int8),(11,1))
F[a,a+1]-=32
for i in a:
    time.sleep(1)
    savetxt(sys.stdout,F[i],fmt="%c",newline="")

サイトへようこそ!余分な空白を追加したようです。特に等号の周辺
ウィートウィザード

2

C ++、88の 125バイト

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

ゴルフされていないバージョン:

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

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

Dev-C ++を搭載したWindows 10マシンでTDM-GCCでコンパイルされています。

編集:最初のバージョンでインクルードを忘れていました。


ねえ、あなたは私のC#答えで私を助けた男です!あなたのC ++のアプローチは、キャリッジリターンを文字列の先頭に移動することで、ループからその状態を実際に削除できることに気づきました。forfor(int c=1;;c++)
メトニエム

また、私のC#の回答で提案したように、最後のコメントと組み合わせて、for(int c=1;;)その後a[c++]-=32;、別のバイトを保存することができます。
メトニエム

しかし、最初にキャリッジリターンがあったとしても、なぜそうなのかよくわからないにもかかわらず、hello worldの後の出力に文字(私の場合はÓ)を出力します。
Snowfire

それは...かなり奇妙です。それは起こらないはずです!?
メトニエム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.