Создайте извращенное «Привет, мир!»

31

Ваша работа довольно проста, написать программу, которая печатает Hello, world!, что при скручивании создает программу, которая печатает Twister!.

Как скручиваются струны

Алгоритм скручивания очень прост. Каждый столбец смещен вниз на свой индекс (столбец 0 перемещается вниз на 0, столбец 1 перемещается на 1, ...). Сдвиг столбца переносится наверх. Это выглядит примерно так:

a
ba
cba
----
 cba
  cb
   c

Со всем под линией обертывания наверх. Реальный пример:

Original:
\\\\\\\\\\\\
............
............
............

Twisted:
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\

(Дополнительные примеры и твистеры на вашем любимом языке здесь )

счет

Ваша программа должна быть прямоугольником с отступами. Это код-гольф, поэтому выигрывает меньшее количество байтов!

правила

  • Ваша первая программа должна распечатать Hello, world!. Разрешен только один завершающий перевод строки.
  • Ваша первая и вторая программы должны быть на одном языке.
  • Ваша вторая программа должна распечатать Twister!. Разрешен только один завершающий перевод строки.
  • Ваша программа должна иметь как минимум 2 строки и 2 столбца.
Дж Аткин
источник
3
В кодовой странице Jelly символ, который соответствует (и для всех целей действует как) перевод строки, имеет кодовую точку 127 (ASCII DEL). Символ с кодовой точкой 10 (перевод строки ASCII) имеет глиф ½и получает квадратный корень из числа. Какой из двух должен рассматриваться как новая линия для этого вызова?
Деннис
Черт, я был единственным, кто надеялся, что "Twisted Hello World" использует "Twisted" в извращенном смысле, поэтому вместо этого мы будем выводить что-то вроде "Goodbye Cruel World" ..
DasBeasto
@ Денис Я полагаю, что лучшим вариантом в этом случае была бы новая желе.
Дж Аткин
@JAtkin Хорошо, спасибо за разъяснения. Я обновил свой ответ соответственно.
Деннис

Ответы:

10

Желе , 33 31 29 байт

оригинал

“ɗ⁻%OḶ$“¡¦ḟṠ»Ṫ
“ɗ⁻%OḶ$“¡¦ḟṠ»Ḣ

Попробуйте онлайн.

скрученный

“ɗ⁻%OḶ$“¡¦ḟṠ»Ḣ
“ɗ⁻%OḶ$“¡¦ḟṠ»Ṫ

Попробуйте онлайн!

Как это работает

В каждой программе каждая строка определяет ссылку. Последняя ссылка является основной и выполняется при запуске программы. Поскольку ссылки на первую ссылку отсутствуют, она просто игнорируется.

Для обеих программ “ɗ⁻%OḶ$“¡¦ḟṠ»выдает список ['Hello, world!', 'Twister!'], используя статическое сжатие словаря Jelly .

Единственная разница между оригинальным и витым кодом - это последний символ главной ссылки. выбирает первую строку списка и выбирает последнюю.

Деннис
источник
2
Похоже, это кричит "Holy Sh * t"
фаза
42

Python 2, 59 байт

print "  Hello, world!"[ 2::]
#rint "T w i s t e r !"[ ::2]

Витая:

print "T weils,twerrd!"[ ::2]
#rint "  H l o   o l !"[ 2::]

По сути, помещает Twister!данные в нечетные индексы строки, а затем переходит от удаления первых двух символов (отступов) к удалению всех остальных символов.

PurkkaKoodari
источник
Это намного умнее, чем мой подход
wnnmaw
Это смешно, 40 голосов?
Дж Аткин
@JAtkin Я заметил, что некоторые решения Python имеют тенденцию получать их в огромных количествах. Не то чтобы я жаловался: ~)
PurkkaKoodari
Прохладный путь:print " Hello, world!" [2::]
Эрик Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Работает, но я пока оставлю все как есть.
PurkkaKoodari
17

Деление , 215 162 56 53 50 байт

Вот начало:

D1
\\
""
TH
we
il
sl
to
e,
r 
!w
"o
1r
;l
1d
;!
 "

Попробуйте онлайн!

Когда скручено:

D"
\1
"\
T"
wH
ie
sl
tl
eo
r,
! 
"w
1o
;r
1l
;d
 !

Попробуйте онлайн!

объяснение

Hello, world!Код довольно прост:

  • D порождает один атом, идущий вниз.
  • Два \(зеркала) отклоняют это на второй столбец.
  • "Hello, world!" печатает необходимую строку
  • 1это портал. Он телепортирует атом к следующему 1в порядке чтения, сохраняя свое направление (это то, что рядом с r).
  • Атом все еще движется вниз, в ;который разрушает атом и завершает программу.

Поток управления для Twister!кода немного больше ... витой ...

  • Опять же, Dпорождает атом.
  • \отклоняет его вправо, в 1.
  • Теперь портал отправляет атом на следующий 1. Атом попадает в атом, oкоторый просто меняет свою массу, но мы можем это игнорировать. Код оборачивается так, что атом 1снова попадает в то же самое , пропуская две строки. Опять же, мы можем игнорировать l, атом оборачивается и 1снова попадает в . Теперь 1в коде больше нет ничего, поэтому атом переходит обратно к 1вершине.
  • После повторного обтекания краев атом снова отклоняется \, теперь снова опускаясь.
  • "Twister!" печатает необходимый код
  • 1телепортирует атом еще раз, после первого ;, но есть другой, ;ожидающий его завершения программы.
Мартин Эндер
источник
Вау, очень близко сейчас! :) Я уверен, что есть способ быть короче ...
FryAmTheEggman
Почему вы, ребята, любите деление?
J Аткин
@JAtkin Почему бы и нет? :)
Мартин Эндер
@ MartinBüttner Я специально подумал, почему для этого вызова?
Дж Аткин
1
@JAtkin 2D языки казались подходящими, и Fission казалась особенно простой, потому что вы можете выбрать одну или несколько произвольных точек входа в программу.
Мартин Эндер
15

Деление , 35 байт

Подход деления № 3 (№ 4, считая тот, который я отредактировал из моего первого поста).

R"Hello, " \"tri"
T;L"!dlrow"/"es!w

Попробуйте онлайн!

R;H"ldor w /"er!"
T"Le!ll,o""\"tsiw

Попробуйте онлайн!

объяснение

Это на самом деле самое простое из решений деления. В обеих программах есть две точки входа: Rсоздает правый атом и Lлевый атом. В любом случае, ;уничтожает один из них немедленно.

Теперь в Hello, world!программе атом сначала печатает половину строки "Hello, ", затем \и /(которые являются зеркалами) отклоняют атом на вторую строку, идущую влево. "world!"(читать в направлении движущегося атома) печатает остаток строки. Lтеперь не работает и также ;уничтожает этот атом, завершая программу.

Twister!Программа является по существу такой же , но с поворотом на 180 градусов. На этот раз Lатом выживает и начинает печатать с "Twist". \И /снова отклоняют его на другую линию, теперь ладится. "er!печатает остаток строки, Rне работает и ;завершает программу.

Мартин Эндер
источник
Удивительно! Я думаю, что это настолько мало, насколько это возможно, количество повторного использования впечатляет.
FryAmTheEggman
4

Japt 67 61 57 байт

Сохранено 6 байтов благодаря @JAtkin, 4 байта благодаря @Ian

"Tzwzizsztzezzzzzzrzzzz!"rz;
"Hzezlzlzoz,z zwzorlzdz!"rz;

Витая:

"Hzezlzlzoz,z zwzorlzdz!"rz;
"Tzwzizsztzezzzzzzrzzzz!"rz;

Проверьте это онлайн: оригинал , витая

Как это работает

"Tzwzizsztzezzzzzzrzzzz!"rz;  // Take this string and remove all "z"s.
"Hzezlzlzoz,z zwzorlzdz!"rz;  // Take this string and remove all "z"s.
                              // Implicit: output *last* expression
ETHproductions
источник
Если это работает так, как я думаю, вы можете удалить завершающий пробел после Twister!замены пробелов на ..
J Аткин
@JAtkin Это на самом деле не работает, но я могу таким образом сохранить кучу байтов. Благодарность!
ETHproductions
"T.w.i.s.t.e.r.!. . . . . "k".(newline)"H.e.l.l.o.,. .w.o.r.l.d.!"k".
J Аткин
Может быть намного проще читать с другим персонажем-наполнителем ...
mbomb007
4
@ mbomb007 С каких это пор «легко читаемое» достижение? : D
yo '
4

Python, 398 414 380 456 байт *

Удалось обновить, чтобы оно соответствовало правилам, но я все еще не решаюсь назвать это конкурентоспособным. Поскольку для его запуска необходимы закомментированные строки, я включил их в число байтов

Это решение не следует правилам, так как оно выводит сообщения об ошибках в дополнение к разрешенному выводу.

Я просто хотел посмотреть, можно ли это сделать на python. Может, но это не красиво.

print'Hello, world!'
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     

Когда скрученный становится

print'Twister!'
#rint'Twister!'
#rint'Twister!'
#rint'Twister!'
#rint'Twister!'
#rint'Twister!'
#rint'Hwister!'
#rint'Teister!'
#rint'Twlster!'
#rint'Twilter!'
#rint'Twisoer!'
#rint'Twist,r!'
#rint'Twiste !'
#rint'Twisterw'
#rint'Twister!o
#rint'Twister!'r
#rint'Twister!' l
#rint'Twister!'  d
#rint'Twister!'   !
wnnmaw
источник
Я думаю, что вы можете удалить пробел в каждой строке, а затем удалить последнюю строку в целом.
ETHproductions
Я не думал делать это, так как это противоречило правилам первоначального скручивания, но спасибо!
wnnmaw
Вы забыли обновить код;)
ETHproductions
Я полагал, что это не будет иметь
большого
1
Я думаю, что вы неправильно поняли. Код должен быть прямоугольником с отступом, но вы можете удалить пробел rint 'в каждой строке.
ETHproductions
1

Brainfuck, 467 367 285 байт

раскручивается

 +[  [[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.>>] [[--[<++++>--->+<]>-]<<<<.<<<-.<<+.>-.+.<----.>--.>>---.[-]]]
  [ -[[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.>>]+[[--[<++++>--->+<]>-]<<<<.<<<-.<<+.>-.+.<----.>--.>>---.[-]]]

Попробуйте онлайн!

скрученный

  [  [[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.>>] [[--[<++++>--->+<]>-]<<<<.<<<-.<<+.>-.+.<----.>--.>>---.[-]]]
 +[ -[[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.>>]+[[--[<++++>--->+<]>-]<<<<.<<<-.<<+.>-.+.<----.>--.>>---.[-]]]

Попробуйте онлайн!

orthoplex
источник
1
Вы можете сохранить байты, используя самый короткий известный "Hello, world!" программа
Джо Кинг
@ JoKing Спасибо за предложение! Любые идеи, как найти меньший "Twister!" а программа?
ортоплекс
1
Используя bf-crunch, я могу получить 56 байт "Twister!" программа
Джо Кинг