Anime o texto no seu terminal

46

Anime o texto no seu terminal

O objetivo

O objetivo é "animar" a string "Hello world" em sua saída para que cada caractere fique em maiúscula um após o outro.

Seu programa pode sair após cada letra ser maiúscula.

Por exemplo;

# 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

Ele deve animar a sequência apenas uma vez e, entre cada estado, deve haver um atraso de 1 segundo.

Entrada

Nenhuma entrada é necessária, mas "Hello world" deve ser a sequência que é "animada".

Resultado

A sequência "Hello world" deve ser animada. A saída deve ser de 1 linha para criar uma espécie de animação de onda. Uma nova linha vazia à direita é permitida. Gif de exemplo;

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

Eu vi isso em um vídeo do metasploit no youtube e achei o efeito muito legal, que foi onde eu gravei o gif, então é um pouco lento, mas espero que ilustre bem a saída

Isso é , a menor contagem de bytes será considerada a vencedora.

Sandbox Link

ʰᵈˑ
fonte
Pode sair e parar com um erro?
Stewie Griffin
@ StewieGriffin, desde que a animação seja visível, com certeza.
ʰᵈˑ
Eu não acho que o atraso de 1 segundo aumenta o desafio. Tivemos um monte assim e cada vez que parece que o mesmo padrão é adicionado.
xnor
2
@xnor Você quer dizer que a duração do atraso é de 1 segundo explicitamente ou quer dizer algum atraso? Este último não faria qualquer sentido, uma vez que é uma animação depois de tudo ..
Metoniem
1
@ Metoniem Não, apenas os descritos na meta. A menos que eu tenha entendido errado. Cada letra deve ser maiúscula uma vez da esquerda para a direita apenas uma vez, começando com "H" em "olá" e terminando com "D" no "mundo"
14/02

Respostas:

33

Vim 26 bytes

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

Explicação (ainda não .gif):

Primeiro, devemos inserir o texto 'olá mundo'. Isso é bem direto. É apenas:

ihello world<ESC>

Neste ponto, o cursor está no 'd' no 'mundo'. Próximo:

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

Também existem outras duas versões de 26 bytes:

ihello world<ESC>qq~gsulq011@q
ihello world<ESC>011@='~gsul'<cr>
DJMcMayhem
fonte
Cara que legal! Aqui está a saída: i.gyazo.com/52d0b9268446aed36ce7eb641c40ff6c.gif (metade disso de qualquer maneira, Gyazo parou de gravar)
#
Eu não acho que ~ quebra o ciclo . Eu acredito que é o lque faz o trabalho duro
Kritixi Lithos
@KritixiLithos Ah, depois de testá-lo, parece que você está certo. Bom ponto, eu vou editar isso
DJMcMayhem
1
Pode confirmar - Isso funciona.
SIGSTACKFAULT
15

Python 2, 98 94 90 bytes

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

-9 -4 bytes graças a @ElPedro -4 bytes graças a @JonathanAllan e @Rod

Trelzevir
fonte
3
Bem-vindo ao PPCG, bom primeiro post c:
Rod
2
Bela postagem! Isso parece ter uma letra maiúscula "H" e "W" ao mesmo tempo, embora repl.it/Fhii - Parece não estar em minúscula a letra "H"
>
1
Sobre o problema de impressão, você pode passar -uargumentos e usar print"\t"+s[:x]+s[x:].title(),;(observe a vírgula à direita) . E isso não vai mudar a sua contagem de bytes (porque o argumento acrescentaria +2 bytes)
Rod
2
@Rod O sinalizador contaria como um byte porque é uma chamada aceitável para Python python -c 'code here'. Com o sinalizador, a chamada seria python -uc 'code here', que é um byte diferente.
Mego
1
Praticamente sua versão, mas com 95 bytes e limpa a tela (eu testei com 2.7.8 no Windows 7-64). O Try It Online não fornece a animação, apenas o resultado linha por linha.
Jonathan Allan
12

Commodore 64, 168 162 137 133 bytes BASIC (e tokenizados) usados

 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

Você precisará usar abreviações de palavras-chave BASIC para inserir isso em um C64 ou emulador real (ou inserir o programa em um Commodore 128 e carregá-lo novamente no modo C64, embora isso também funcione no 128). Ele {control+n}só funcionará / será exibido após a cotação de abertura. É uma abreviação de chr$(14)e, portanto, salva alguns bytes e alterna o conjunto de caracteres para o modo comercial ou para caracteres maiúsculos / minúsculos.

Eu adicionei algumas abreviações para você, para você. O {clear home}caractere é criado pressionando Shifte a CLR/HOMEtecla após as aspas de abertura.

Para fins ilustrativos, a listagem não confiável pode ser inserida da seguinte forma:

 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

Ele funciona alternando o conjunto de caracteres PETSCII para o modo de negócios (maiúsculas / minúsculas) e gravando a sequência hello world na linha superior da tela, localizada no local de memória $ 0400, e o valor em cada local para o próximo 11 bytes a partir daí e aumente cada valor em 64 (o equivalente em maiúsculas). Se o contador j for> 0, ele chamará uma rotina na linha 2 para diminuir novamente o local da memória anterior em 64.

A Linha 3 é uma pausa, também grava um espaço no local $ 0405 e $ 040b, que é uma correção de bug (que provavelmente pode ser removida para salvar alguns bytes).

Olá, mundo animado do Commodore C64

Shaun Bebbers
fonte
Devo acrescentar que fori=0to1step0... nextié essencialmente criar um loop infinito (sem goto), como while(true){...}nas linguagens mais modernas.
Shaun Bebbers
1
Por que você simplesmente não usa um goto em vez de um loop infinito? Mesmo com as duas novas linhas que precisariam ser adicionadas, ele ainda salvaria bytes. Além disso, os bytes de RAM não são iguais ao número de bytes no seu código.
precisa
Porque GO TOé proibido, direito ;-) Um pode facilmente trabalhar fora da lista por si só por CLRantes de trabalhar fora o restante bytes livres com o quebrado FRE(0)função
Shaun Bebbers
1
oh desculpe por isso
MilkyWay90
11

C #, 230 215 193 161 135 134 130 bytes

É C #, então está certo! :-( Mas depois de alguma ajuda e pesquisa, eu (e outros, realmente) consegui remover exatamente 100 bytes.

Golfe

()=>{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);
        }
    }
}

Captura de tela

Animação com atraso de 1 segundo Embora pareça muito melhor ao fazer um loop e mais rápido ..

Atualizações

  • Perdi 15 bytes usando o retorno de carro em vez de o Clear()que também me permitiu substituir um uso por System.Consolealgum lugar inline.

  • Programa substituído com lambda economizando 23 bytes graças a @devRicher

  • Tornou-se uma espécie de colaboração com @devRicher neste momento, graças a algumas de suas sugestões, consegui perder mais 32 bytes!
  • Graças a 2 sugestões realmente inteligentes e interessantes do @Kratz, eu consegui substituir new string(b)por be b[i]=char.ToUpper(b[i])com b[i]-=' ', poupando-me mais 26 bytes!
  • 1 byte a menos movendo-se i++graças a @Snowfire
  • 4 bytes a menos movendo o retorno de carro para o início da string e removendo i<11do meu forloop
Metoniem
fonte
1
Mude class P{static void Main(){ ... }}para ()=>{ ... }para cortar alguns bytes. O PPCG aceita funções como respostas, portanto, um lambda funciona bem.
devRicher
@devRicher Ah, eu vejo, eu nunca usei lambas antes, mas isso parece uma melhoria legal. Obrigado!
Metoniem 13/02/2017
Se você não sabe como usá-los (ou não quer), ainda é bom para um simples void g(){ ... }.
devRicher
Você pode acessar seqüências de caracteres com índices de matriz ( char g = string j[x]), para economizar cerca de 50 bytes:()=>{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
Você pode salvar outro byte removendo o incremento da cláusula for e colocando-o no acesso à matriz como b[i++]-=' '. Isso seria útil, porque você também pode remover a condição no loop for e apenas escrever for(int i=0;;). OP apontou nos comentários, que o programa pode sair com um erro, para que você possa permitir um 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])}

insira a descrição da imagem aqui

Revisões (provavelmente haverá muitas):

Mude $s.Lengthpara const 1011

Construtor de strings reestruturado, removido 1 instrução de junção e usada em ++$svez de ($s+1), para salvar alguns bytes graças a @AdmBorkBork

O AdmBorkBork ressalta que o simples uso da string duas vezes é realmente mais curto do que encapsular e depois incluí .ToLower()-la - o que diz muito sobre o quão detalhado é o PowerShell, -3!


basicamente percorre o comprimento da string, forma uma matriz de três partes, pré-capitcal, maiúscula e pós-maiúscula, retira 32 da letra do meio e depois converte novamente em um caractere para obter letras maiúsculas, felizmente isso não transformará o espaço em um personagem visível também, espero que seja aceitável?

colsw
fonte
2
Você pode salvar mais três bytes na frente simplesmente imprimindo a string em vez de salvá-la $se .ToLower()inseri-la. -'Hello world';$s='hello world';
AdmBorkBork
9

Montagem CP-1610 , 50 DECLEs = 63 bytes

Este código deve ser executado em um Intellivision .

Um código de operação CP-1610 é codificado com um valor de 10 bits, conhecido como 'DECLE'. Este programa tem 50 DECLEs, começando em US $ 4800 e terminando em US $ 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

Resultado

insira a descrição da imagem aqui

Arnauld
fonte
7

MATL , 30 bytes

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

Experimente no 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
Luis Mendo
fonte
5

PHP, 76 74 71 bytes

Obrigado @hd pelo atraso de um segundo inteiro e nenhuma fração disso!
Obrigado @ user63956 por 2 bytes e @aross por 3 bytes.

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

Corra com -nr.

Titus
fonte
1
Você pode salvar 2 bytes com sleep(print"$s\r").
user63956
1
Salve 3 bytes com ucfirst
aross
4

C, 97 retirados 106 bytes

com caracteres de escape contados como 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));}

Nota: eu comentei o atraso no TIO desvinculado, porque aguarda a conclusão antes de exibir a saída, também parece não reconhecer retornos de carro e colocar novas linhas. Além disso, se você estiver no Windows, o sono será em milissegundos em vez de segundos, portanto sleep(1)deve se tornar sleep(1000).

Nota 2: Retirei essa entrada no momento até que os erros de saída sejam resolvidos.

Ahemone
fonte
Por alguma razão, este não exibe nenhum output na minha máquina
Kritixi Lithos
Se você estiver no Windows, precisará alterar o atraso, que também terminará em um retorno de carro; portanto, você pode alterar de 130 a 129 para evitar a impressão durante a última iteração.
Ahemone
Para mim, este programa não termina de jeito nenhum e não gera nada. Eu tive que manualmente ^Cpara pará-lo. (também eu estou no mac)
Kritixi Lithos
Acredito que seja um problema no buffer de impressão, retirarei minha inscrição por enquanto.
Ahemone
4

JavaScript (ES6), 141 139 131 bytes

Economizou 8B graças a 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)

Explicação

Isso cria uma função sem argumentos, que divide a string hello worldem um array de caracteres e capitaliza o d+1th personagem. dé um contador que começa como 0e é aumentado a cada vez.

Uso

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()
Lucas
fonte
Inteligente, eu vou atualizá-lo.
13267 Luke
Além disso, não vejo nenhum motivo para tornar isso uma função, já que não requer entrada - basta executar o código, certo?
Apsillers
A pergunta diz que deveria ser um programa, mas nesse caso você também pode enviar uma função. Geralmente, trechos de código não são permitidos.
13267 Luke
Isso é legal, gg!
ʰᵈˑ
Você pode distinguir entre sua compreensão de um "snippet de código" não permitido e um "programa" permitido neste caso? Se você simplesmente remover o líder _=>que você faz tem um programa completo (por exemplo, se você preso em um arquivo, Node.js seria executado com êxito lo até a conclusão). Meu entendimento da proibição contra "trechos de código" é contra a criação de código que implicitamente aceite alguma entrada como variável, como "se assumirmos que ijá tem a entrada, podemos fazer ..." o que não está acontecendo aqui, pois existe explicitamente sem entrada.
Apsillers
4

Noodel , 22 bytes

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

Tente:)


Como funciona

”<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 trecho usa uma versão de 25 bytes que faz loops continuamente.

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

tkellehe
fonte
4

Bash + coreutils, 99 98 bytes

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
}
Mitchell Spector
fonte
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: insira a descrição da imagem aqui

Como funciona

A seqüência de escape ANSI \eclimpa a tela.
A cada iteração, o icaractere da string codificada é substituído por sua versão em maiúscula.
A sayfunção sempre retorna True, que é passada para a função de suspensão que a interpreta como 1segunda.

smls
fonte
3

Ruby, 82 81 bytes

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

^ H é ascii 8 (backspace) e tem apenas 1 byte.

GB
fonte
3

C, 87 bytes

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

Compila e roda no Linux.

Bart Friederichs
fonte
3

Mathematica, 130 128 123 110 108 bytes

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]

Explicação: De i=1até 11, imprima do 1º ao (i-1) caractere de "olá mundo", coloque em maiúscula e "hello world"[i], em seguida, imprima o restante da sequência, incrementando iao mesmo tempo.

numbermaniac
fonte
3

Java 215 212 204 203 bytes

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);
    }
  }
}
DevelopingDeveloper
fonte
1
Não deveria ser interface A(com um espaço)? Além disso, você pode remover o espaço entre ,e Character.toUpperCase.
precisa saber é o seguinte
2
Bem vindo ao site!
DJMcMayhem
Parabéns a @NoOneIsHere pelos 3 pontos
DevelopingDeveloper
Obrigado @DJMcMayhem, sempre gostei de ler os desafios e finalmente consegui responder um!
DevelopingDeveloper
3

R , 106 103 bytes

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

Apenas um loop simples, a limpeza do console cat('\f')parece um pouco dependente do sistema, mas não estou ciente de uma maneira melhor.

Robert Hacken
fonte
Eu tentei superar isso usando utf8ToInt. Isso não funcionou, o espaço precisa ser tratado como um caso especial. No processo, descobri que cat("\014")parecia funcionar melhor do que trabalhar onde cat("\f")não funcionava. mas não no TIO
JayCe 16/07/19
2

C, 122 bytes

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

Menor que C #: D

betseg
fonte
1
Também para que o último quadro seja visível, você deve fazer em i<11vez do i<10loop for
Kritixi Lithos
2

Perl, 75 bytes

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

Usa o código ANSI ESCcpara limpar o console e mover o cursor para o canto superior esquerdo a cada iteração, mas ainda precisa \nno final da cadeia de substituição para evitar que toda a animação seja perdida no buffer de linha.

Uma chamada bem-sucedida para printretorna um valor 1, que pode ser passado diretamente para sleep.

ossifrage melindroso
fonte
Você pode usar $`e $'salvar alguns bytes (.{$_})(.)(.*)(isso não funcionará em um terminal, mas isso não é um problema). Ela exige modificar um pouco o resto do seu código no entanto: "hello world"=~s/./sleep print"\33c$`\U$&\E$'\n"/ger. (Eu escrevi quase exatamente esse código, então, ao procurar se alguém já havia postado uma resposta perl, encontrei a sua). E um pequeno detalhe sobre o número de bytes: você pode usar uma nova linha literária para salvar um byte e talvez algum tipo de literal \33c(embora não tenha muita certeza sobre o último).
Dada
2

SmileBASIC, 90 71 bytes

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

Geléia , 24 21 bytes

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

Este é um link / função niládica que imprime em STDOUT. Não funciona como um programa completo.

O código não pode ser testado no TIO; ele usa caracteres de controle e o TIO ainda não possui um emulador de terminal.

Como funciona

“½,⁻⁸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.)
Dennis
fonte
(Strings are cast to Boolean.)Isso é desonesto!
Erik the Outgolfer
2

C, 122 bytes

Como exercício, escrevi isso para fornecer um formato de saída mais ideal do que algumas das outras respostas. Também significa que o cursor fica após a letra maiúscula mais recente durante as pausas.

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

(Novas linhas e recuos cosméticos e não fazem parte da contagem de bytes)

Agora, alguns leitores podem notar que isso requer alguma massagem para rodar em máquinas modernas (o encantamento mágico é -static -Wl,-N), mas é assim que as implementações reais de C costumavam se comportar, então eu acho que é válido. Ele também assume que o conjunto de caracteres é ASCII e não imprime uma nova linha à direita.

Bônus: Para uma versão EBCDIC, você pode substituir 8por 22e 64com 32e alternar a lógica para p[1]e p[2]. Para testar em um sistema não EBCDIC, você pode compilar com -funsigned-char -fexec-charset=cp037.

A saída é 43 bytes: Hello world«H‹hE‹eL‹lL‹lO‹o ‹ W‹wO‹oR‹rL‹lD

Random832
fonte
2

Scala, 92 bytes

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
}
corvus_192
fonte
1
+1 parah(i)toUpper
Sempre solicitando
2

Lote, 184 bytes

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

Curiosamente, a linha de comando para timeout/t>nul 1fica corrompida se não houver uma nova linha à direita, por isso não posso colocá-la no final do arquivo.

Neil
fonte
2

Ruby, 108 bytes

Primeira vez, estudante do primeiro ano. Não é uma águia, mas tenho pelo menos um pouco de orgulho.

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

Pascal, 187 152 bytes

Não é exatamente o mais eficiente ou o mais curto, mas funciona muito bem!

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.

Testado e funciona no Free Pascal Compiler 2.6+.

Obrigado a @manatwork por salvar 35 bytes!


Eu usei http://www.onlinecompiler.net/pascal para compilar o arquivo e executá-lo no Windows.
Até agora, não vi nenhum problema com isso.

Ismael Miguel
fonte
Existe uma UpCasefunção desde os tempos antigos do Turbo. (Lá tratados somente Char, mas em Free Pascal também lida com cordas.)
manatwork
Alguns pequenos ajustes: basta declarar X Word(ou Byte); faça P a constpara inferir o tipo do valor de inicialização; enquanto estiver lá, torne X uma constante inicializada para se livrar de varpalavras-chave separadas (essa pode não funcionar em todas as variantes do Pascal, mas certamente no Free Pascal); use ClrScrpara pular para o canto superior esquerdo; substituir que ifcom uma única expressão: X:=X*Ord(X<11)+1. pastebin.com/FfaixkES
manatwork 14/02
Eu realmente não sabia disso const X:Word=1;P='hello world';e isso const X:Word=1;P='hello world';era possível. Eu aprendi Pascal no Turbo Pascal 7, que pode não ser compatível com isso. E esqueci completamente upcase. Muito obrigado!
Ismael Miguel
2

C 120 110 104 96 bytes

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

Versão ungolfed

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

}

@ Patk Obrigado por salvar alguns bytes, ótima idéia. :)

@Pakk @KarlNapf Obrigado pessoal por suas contribuições.

ainda pode ser encurtado !? :)

Abel Tom
fonte
Use -=e +=. Além disso, uma variável de ponteiro pode salvar o, []mas não tenho certeza.
Karl Napf
1
char * j; f () {char s [] = "olá mundo"; para (j = s; * j; j ++) {* j- = 32; printf ("\ r% s", s); * j + = 32; fflush (0); sleep (1);}} (103 caracteres)
1
Idéia por trás do comentário anterior: coloque-o em minúsculas novamente após a impressãof, para que você não precise verificar se j-1 existe. E use ponteiros para salvar alguns caracteres.
2
char *j,s[]="hello world";para salvar mais alguns caracteres.
1
f(){char*j,s[]="\rhello world";for(j=s;*++j;*j-=32,printf(s),*j+=32,fflush(0),sleep(1));}89 bytes.
Karl Napf
2

Python 2, 220 189 179 bytes

Solução sem usar strings e capitalize(), byte count como está:

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

E uma variante um pouco mais longa (191 caracteres) sem redefinição de maiúsculas e minúsculas:

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="")
Mikhail V
fonte
Bem vindo ao site! Parece que você fez um espaço em branco extra. Particularmente em torno de seus sinais iguais
Assistente de trigo
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);}}

Versão não destruída:

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

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

Compilado com TDM-GCC em uma máquina Windows 10 com Dev-C ++.

Editar: esqueci as inclusões na minha primeira versão.

Snowfire
fonte
Ei, você é o cara que me ajudou com minha resposta em C #! Sua abordagem C ++ me fez perceber que eu realmente posso remover essa condição do meu forloop, movendo o retorno de carro para o início da string. Eu também ajudarei: O fazer for(int c=1;;c++)poupará 1 byte.
Metoniem 15/02
Também como você sugeriu na minha resposta em C #, em combinação com o meu último comentário, você poderia fazer for(int c=1;;)e a[c++]-=32;salvar outro byte.
Metoniem 15/02
Mas mesmo com o retorno de carro no início, ele ainda imprime um caractere (Ó no meu caso) para a saída após o hello world, mesmo que eu não tenha muita certeza do porquê ... #
15417
Isso é ... bastante estranho. Isso não deveria acontecer ?!
Metoniem 15/02