Eu tenho um desafio para você:
- Imprima "Hello World" usando qualquer idioma.
- Cada caractere deve ser impresso a partir de seu próprio e exclusivo thread
É isso aí. Obviamente, como não há garantia de que os encadeamentos operem na ordem em que você os inicia, você deve tornar o encadeamento do programa seguro para garantir que a saída seja impressa na ordem correta.
E, como se trata de código de golfe, o programa mais curto vence.
Atualizar:
O vencedor é a inscrição de Marinus na APL , com 34 caracteres. Ele também ganha o prêmio pela entrada menos legível.
HelolW rdlo
Respostas:
APL (Dyalog) (
44433934)Explicação:
2 11⍴'Hello World',⍳11
cria uma matriz: (H, 1), (e, 2), ...&⌿
significa: para cada coluna da matriz, faça em um thread separado:⍺
agora é o personagem e⍵
agora é a hora⎕DL⊃⍵
espera por⍵
segundos.⍞←⍺
gera o caractere.fonte
C,
6162 caracteresTodas as funções da biblioteca pthread têm nomes demais; portanto, iniciei um processo separado inteiro para cada personagem.
fork()
é muito mais curto.Era necessário usar em
write()
vez de,putchar()
porque as funções de buffer stdio não são seguras para threads.Editado : faça backup de 62 caracteres. No meu zelo, cair para 61 caracteres também diminuiu a segurança dos fios.
fonte
write(1,"Hello World\n",!!++i)
para 2 bytes. Solução agradável caso contrário.!!++i
!!i++
, mas o editei alguns segundos depois, porque percebi que ele seria avaliado0
na primeira iteração. Presumi que você tivesse visto a versão não editada. Não consigo testar seu código, porque ele imprime apenas o primeiro caractere, uma vez . Existem muitas alternativas;i++<13
, using!!i
, or evenwrite(1,"Hello World\n",i++>13||fork()||main())
Ruby, 46 caracteres
Ele é sincronizado devido ao fato de o programa aguardar o término do thread antes de iniciar o próximo thread e continuar com o próximo caractere.
fonte
Pythonect (35 caracteres)
http://www.pythonect.org
fonte
Python (
1019398)Esta é a solução de Peter Taylor. Funciona atrasando a impressão do N-ésimo caractere por N segundos. Ver comentários.
Este é o original:
Funcionou porque o tempo que leva para imprimir um único caractere é menor que o tempo que o Python leva para inicializar um novo encadeamento; portanto, o N-ésimo segmento terminaria antes que o N-1-ésimo segmento fosse criado. Aparentemente, é contra as regras confiar nisso.
fonte
import sys,threading
paraimport sys,threading as t
e você pode salvar mais 2, passando os argumentos para Thread como argumentos posicionais, em vez de argumentos de palavras-chave.threading.Timer
vez dethreading.Thread
. Passex
como o parâmetro sleep.for x in range(11):t.Timer(x,sys.stdout.write,"Hello World"[x]).start()
C # 73
fonte
APL (Dyalog Unicode) , SBCS de 28 bytes
Programa completo. Imprime em stderr. Inspirado pela solução de marinus .
Experimente online!
⍳11
primeiros 11 inteiros'Hello World'{
…}&¨
Para cada número inteiro como argumento da direita (⍵
), gera a seguinte função com o caractere correspondente como argumento da esquerda (⍺
):⎕DL⍵
d e l ay segundos argumento direita⍺⊣
descartar que (o atraso efetivo) em favor do caractere de argumento à esquerda⍞←
imprima isso no stdout sem quebras de linha à direitafonte
⍞∘←&¨'dlroW olleH'
? - Eu não sei se ele está garantida, teoricamente, mas parece sempre imprimi-los na ordem correta⍞∘←
não é interrompível (ou é? Talvez você possa perguntar a um desenvolvedor de C?). O Dyalog implementa threads verdes - 1 thread real que finge ser muitos; portanto, se uma opção de thread (verde) não puder ocorrer, a ordem é previsível.Java (160 caracteres)
Sim, eu sei que esse é o idioma errado para o código de golfe, eu faço isso por diversão.
fonte
class A{public static void main(String[]args){new B(0).start();}}class B extends Thread{int i;B(int j){i=j;}public void run(){System.out.print("Hello World".charAt(i));if(i<10)new B(i+1).start();}}
-197 caracteresclass A extends Thread{static int i;public static void main(String[]args){System.out.print("Hello World".charAt(i++));if(i<11)new A().start();}public void run(){main(null);}}
- 174 caracteresclass A{static int i;public static void main(String...a){new Thread(){public void run(){System.out.print("Hello World".charAt(i++));if(i<11)main();}}.start();}}
- 160 caracteresFestança (64)
fonte
:()([ "$1" ]&&(printf "${1:0:1}"&: "${1:1}"));: Hello\ World
Haskell (
120118)Eu não tenho tanta certeza de multiplicar por 9999 - eu tenho um Xeon de 2Ghz no qual funcionará bem, mesmo que você não o faça, mas também tenho um Pentium 4 que precisa dele (999 deu saída ilegível e 99 não) não faça nada.)
fonte
(*5^6)
vez de(*9999)
e não usando aspas paramapM_
.(((mapM_ (\(x,y) ... )) zip) [0..]) ...
não desejado.999
, pode estar sendo truncado para 0 devido a limitações do sistema operacional, mas posso estar errado. Qual sistema operacional você está usando?scala (
8179 caracteres)fonte
Groovy, 51 caracteres
fonte
D (135 caracteres)
Só inicio o próximo segmento quando já imprimi o caractere atual
editar +2 caracteres para uma melhor verificação vinculada
fonte
[email protected](6): Range violation
erro.Scala 74
Testes:
fonte
scala> "Hello World".zipWithIndex.par.foreach(x=>{Thread.sleep(x._2*99);print(x._1)}) Hel lWrolod
- Eu entendi issoprintln(Thread.currentThread.getName)
mostra que os threads não são exclusivos.map
vez deforeach
. você pode salvar 4 caracteres.Javascript (72)
fonte
scala (45)
Solução baseada em junção do thread #
ou
fonte
Esta é minha tentativa de F #. Meu primeiro programa sério de F #. Por favor seja gentil.
fonte
Vai
fonte
Erlang (90)
Compilar
erlc +export_all h.erl
fonte
Nimrod, 121
fonte
Python: muitos caracteres, mas funciona.
fonte
C #
9084Versão em execução: http://ideone.com/0dXNw
fonte
Objective-C (183 caracteres)
fonte
Haskell 99 Personagens
Como ele funciona é que cada thread começa no próximo depois de exibir seu caractere, de modo que coisas realmente úteis não podem acontecer fora de sequência.
fonte
Bash , 43 bytes
Experimente online!
xargs
bifurca umprintf
processo separado para cada caractere (e aguarda sua saída).Bash , 45 bytes, sem utilitários externos
Experimente online!
Expande para
(printf H); (printf e); (printf l); (printf l); (printf o); (printf \ ); (printf W); (printf o); (printf r); (printf l); (printf d);
antes da avaliação. Os parênteses tornam o Bash bifurcar um subshell para cada letra (e aguarde a saída), mas desta vezprintf
é o Bash embutido.fonte