У меня есть вызов для вас:
- Напечатайте «Hello World» на любом языке.
- Каждый символ должен быть напечатан из его собственной, уникальной нити
Вот и все. Очевидно, что поскольку нет никакой гарантии, что потоки будут работать в том порядке, в котором вы их запускаете, вы должны сделать поток вашей программы безопасным, чтобы вывод печатался в правильном порядке.
И, поскольку это кодовый гольф, выигрывает самая короткая программа.
Обновить:
Победителем является запись APL Маринуса , в 34 символов. Он также выигрывает приз за наименее читаемую запись.
HelolW rdlo
Ответы:
APL (Dyalog) (
44433934)Объяснение:
2 11⍴'Hello World',⍳11
создает матрицу: (H, 1), (e, 2), ...&⌿
означает: для каждого столбца матрицы сделать в отдельном потоке:⍺
теперь персонаж и⍵
сейчас время⎕DL⊃⍵
ждет⍵
секунд.⍞←⍺
выводит символ.источник
C
6162 символаВсе функции библиотеки pthread имеют более чем одинаковые имена, поэтому вместо этого я запустил отдельный процесс для каждого символа.
fork()
намного короче.Пришлось использовать
write()
вместо того,putchar()
потому что функции буферизации stdio не являются поточно-ориентированными.Отредактировано : резервное копирование до 62 символов. В моем рвении снижение до 61 символа также понизило безопасность потока.
источник
write(1,"Hello World\n",!!++i)
на 2 байта. Хорошее решение в противном случае.!!++i
!!i++
, но отредактировал его несколько секунд спустя, потому что я понял, что он будет оценен0
на первой итерации. Я предположил, что вы видели неотредактированную версию. Я не могу проверить ваш код, потому что он печатает только самый первый символ, один раз . Есть много альтернатив, хотя;i++<13
, используя!!i
или дажеwrite(1,"Hello World\n",i++>13||fork()||main())
Рубин, 46 знаков
Он синхронизируется из-за того, что программа ожидает окончания потока, прежде чем запустить следующий поток и продолжить со следующим символом.
источник
Pythonect (35 символов)
http://www.pythonect.org
источник
Питон (
1019398)Это решение Питера Тейлора. Это работает, задерживая печать N-го символа на N секунд. Смотрите комментарии.
Это оригинал:
Это сработало, потому что время, которое требуется для печати одного символа, меньше, чем время, которое требуется Python для инициализации нового потока, поэтому N-й поток завершит работу до того, как будет создан N + 1-й поток. Очевидно, что на это нельзя полагаться.
источник
import sys,threading
на,import sys,threading as t
и вы можете сохранить еще 2, передав аргументы Thread как позиционные аргументы, а не как аргументы с ключевыми словами.threading.Timer
вместоthreading.Thread
. Передайтеx
как параметр сна.for x in range(11):t.Timer(x,sys.stdout.write,"Hello World"[x]).start()
C # 73
источник
APL (Dyalog Unicode) , 28 байтов SBCS
Полная программа. Печать в stderr. Вдохновленный решением Маринус .
Попробуйте онлайн!
⍳11
первые 11 целых'Hello World'{
…}&¨
Для каждого целого числа в качестве правого аргумента (⍵
), создайте следующую функцию с соответствующим символом в качестве левого аргумента (⍺
):⎕DL⍵
д е л ау правой аргумент секунды⍺⊣
отменить это (эффективная задержка) в пользу символа левого аргумента⍞←
выведите это на стандартный вывод без завершающего переноса строкиисточник
⍞∘←&¨'dlroW olleH'
? - Я не знаю, гарантировано ли это теоретически, но, кажется, он всегда печатает их в правильном порядке⍞∘←
не прерывается (или это? Может быть, вы можете спросить разработчика C?). Dyalog реализует зеленые потоки - 1 реальный поток претендует на множество, поэтому, если (зеленый) переключение потоков не может произойти, порядок будет предсказуемым.Ява (160 символов)
Да, я знаю, что это неправильный язык для гольф-кода, я делаю это для удовольствия.
источник
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 символовclass 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);}}
- 174class 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 символовБаш (64)
источник
:()([ "$1" ]&&(printf "${1:0:1}"&: "${1:1}"));: Hello\ World
Хаскелл (
120118)Я не совсем уверен в умножении на 9999 - у меня есть 2 ГГц Xeon, на котором он будет работать нормально, даже если вы этого не делаете, но у меня также есть Pentium 4, который нуждается в этом (999 дал искаженный вывод и 99 не сделал ') вообще ничего не делать.)
источник
(*5^6)
вместо(*9999)
и не используя обратные кавычки дляmapM_
.(((mapM_ (\(x,y) ... )) zip) [0..]) ...
что вам не нужно.999
, это может быть обрезано до 0 из-за ограничений операционной системы, но я могу ошибаться. Какую ОС вы используете?Скала (
8179 символов)источник
Groovy, 51 символов
источник
D (135 символов)
Я начинаю следующий поток, только когда уже напечатал текущий символ
отредактируйте +2 символа для лучшей проверки
источник
core.exception.RangeError@test.d(6): Range violation
ошибку.Скала 74
тесты:
источник
scala> "Hello World".zipWithIndex.par.foreach(x=>{Thread.sleep(x._2*99);print(x._1)}) Hel lWrolod
- Я получил этоprintln(Thread.currentThread.getName)
показывает, что темы не являются уникальными.map
вместоforeach
. Вы можете сохранить 4 символа.Javascript (72)
источник
Scala (45)
Решение на основе # # соединения
или
источник
Это моя попытка F #. Моя первая серьезная F # программа. Пожалуйста, будь добр.
источник
Идти
источник
Эрланг (90)
Compile
erlc +export_all h.erl
источник
Нимрод, 121
источник
Python: слишком много символов, но это работает.
источник
C #
9084Рабочая версия: http://ideone.com/0dXNw
источник
Objective-C (183 символа)
источник
Haskell 99 персонажей
Как это работает, каждый поток начинает следующий после отображения своего символа, поэтому они действительно полезные вещи не могут произойти из последовательности.
источник
Баш , 43 байта
Попробуйте онлайн!
xargs
разветвляется отдельныйprintf
процесс для каждого персонажа (и ожидает его выхода).Bash , 45 байт, никаких внешних утилит
Попробуйте онлайн!
Расширяется
(printf H); (printf e); (printf l); (printf l); (printf o); (printf \ ); (printf W); (printf o); (printf r); (printf l); (printf d);
до оценки. Скобки делают Bash форком для каждой буквы (и ждут его выхода), но на этот разprintf
встроена Bash.источник