«Привіт, світ!» (Кожен інший персонаж, частина 2)


18

Як своєрідна частина 2 Hello, World! (Кожен інший персонаж) , напишіть програму таким чином, щоб усі три програми надрукували "Привіт, світ!": Всю програму, символи 1-ї, 3-ї, 5-ї програми тощо та також 2-й, 4-й, 6-й, тощо.

Якщо ваша програма:

abc
def

Він повинен вивести "Здрастуйте, світ!", Але так і слід

acdf

І

b
e

Немає рішень із вбудованою функцією "Привіт, світ!"


6
Чому б просто не змінити текст з "Привіт, світ!" до чогось іншого?
Conor O'Brien

1
Я думаю, що достатньо уникати лазівки і "Привіт, світ!" є канонічним.
Лев Тененбаум

24
IMO, було б непогано бачити інший рядок, ніж "Привіт, світ!" час від часу (це лише моя думка)
Conor O'Brien

1
Чи пробіли та нові рядки зараховуються до символів?
officialaimm

6
@ ConorO'Brien З приємним побічним ефектом, що дуже мало мов матимуть вбудовані модулі для буквально кожної іншої рядки.
Денніс

Відповіді:


24

машинний код x86, 378 байт

demo

PROG.COM Завантажте та запустіть його в емуляторі MS-DOS , наприклад DOSBox .

B3 B4 B3 02 90 B3 B3 B4 02 B3 B4 B3 02 90 B3 B2
B3 48 90 B3 B3 B2 48 B3 B2 B3 48 90 B3 CD B3 21
90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 65 90 B3
B3 B2 65 B3 B2 B3 65 90 B3 CD B3 21 90 B3 B3 CD
21 B3 CD B3 21 90 B3 B2 B3 6C 90 B3 B3 B2 6C B3
B2 B3 6C 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3
21 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 6F 90 B3 B3 B2 6F B3 B2 B3 6F 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 2C
90 B3 B3 B2 2C B3 B2 B3 2C 90 B3 CD B3 21 90 B3
B3 CD 21 B3 CD B3 21 90 B3 B2 B3 20 90 B3 B3 B2
20 B3 B2 B3 20 90 B3 CD B3 21 90 B3 B3 CD 21 B3
CD B3 21 90 B3 B2 B3 77 90 B3 B3 B2 77 B3 B2 B3
77 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 6F 90 B3 B3 B2 6F B3 B2 B3 6F 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 72
90 B3 B3 B2 72 B3 B2 B3 72 90 B3 CD B3 21 90 B3
B3 CD 21 B3 CD B3 21 90 B3 B2 B3 6C 90 B3 B3 B2
6C B3 B2 B3 6C 90 B3 CD B3 21 90 B3 B3 CD 21 B3
CD B3 21 90 B3 B2 B3 64 90 B3 B3 B2 64 B3 B2 B3
64 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 21 90 B3 B3 B2 21 B3 B2 B3 21 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 CD B3 20
90 B3 B3 CD 20 B3 CD B3 20 90

Також ви можете завантажити LEFT.COM та RIGHT.COM

Як це працює і як працювати

Дивіться відповідь до першої частини

Магія

Якщо ви хочете виконати команду кодування 0xAB з одним параметром 0xCD , ви пишете

Magic

Генератор

Запустити код, отримати шістнадцятковий. Перетворити в бінарне

cat prog.hex | xxd -r -p > PROG.COM


13

Python 3 , 115 байт

print=="partisn't";
"ran" >="partisn't" ;
print((""" "HHeelllloo,,  wwoorrlldd!! """[" ) #2">"1":: 3- 1] [ 1:-1 ]))

Кожен дивний персонаж

pit=print;"a">"ats'";pit(" Hello, world! "[  2>1: -1  :1])

Кожен парний персонаж

rn="ats'"
rn =print 
rn("""Hello, world!""")#""":3 ][1- )

Спробуйте в Інтернеті!

Можливо, це може бути набагато коротшим, але я щасливий, що мені вдалося змусити його працювати на Python. Подібний відповідь vroomfondel в у першій частині.

Нудна відповідь 93 байти

""""""
print("Hello, world!")
""""""#
""""

pprriinntt((""HHeelllloo,,  wwoorrlldd!!""))
#"""

Кожен дивний персонаж

"""pit"el,wrd"
"""
""
print("Hello, world!")#"

Кожен парний персонаж

"""
rn(Hlo ol!)"""#""
print("Hello, world!")
""

Спробуйте в Інтернеті!


9

> <> , 45 байт

! """!!ddllrrooWW  oolllleeHH"!!"" >~o <> o <

Або навіть навіть символи:

 "!dlroW olleH"!">o<  

Або просто непарні символи:

!""!dlroW olleH!" ~ >o<

Спробуйте їх онлайн: оригінал , евенс , шанси .

Оригінальна версія натискає " !!ddllrrooWW oolllleeHH" на стек, тоді риба відскакує між ними >~o <, яка видаляє літеру, друкує дві, видаляє дві, друкує дві, видаляє дві тощо. Дві напівпрограми є досить стандартними програмами струнного друку. Хитра частина полягала в тому, щоб правильно поєднувати "та !виходити зі строкового режиму у всіх трьох програмах.


7

Befunge-98 , 43 байти

120 x""!!ddllrrooWW  ,,oolllleeHH""cckk,,@@

Спробуйте в Інтернеті!

Тільки непарні:

10x"!dlroW ,olleH"ck,@

Спробуйте в Інтернеті!

Тільки парні:

2 "!dlroW ,olleH"ck,@

Спробуйте в Інтернеті!

Пояснення

Повна програма:

120               Push 1, push 2, push 0.
x                 Pop 0 (y) and 2 (x) and set the instruction pointer's movement
                  delta to (x,y). That is, run the remainder of the code
                  by skipping every other cell.
"!dlroW ,olleH"   Push the code points of the output.
ck,               Print 13 characters from the top of the stack.
@                 Terminate the program.

У непарній програмі 2зник, так що 10xнасправді нічого не робить (він встановлює дельту(1,0) якої за замовчуванням). Решта програми тоді така сама.

У рівній програмі ми просто натискаємо 2на початок, яке ми можемо цілком ігнорувати. Решта програми така ж, як і раніше.



5

Mathematica, 65 bytes

PPrriinntt[[""HHeelllloo,,  WWoorrlldd!!""]]Print@"Hello, World!"

It throws some warnings, prints Hello, World!, and returns Null PPrriinntt[["" HHeelllloo, Null, "" WWoorrlldd!!]]. When run as a program (not in the REPL), the return value will not be printed.

After removing the even characters:

Print["Hello, World!"]Pit"el,Wrd"

It prints Hello, World!, and returns "el,Wrd" Null Pit.

After removing the odd characters:

Print["Hello, World!"]rn@Hlo ol!

It prints Hello, World!, and returns Null ol! rn[Hlo].


5

x86 machine code, 73 bytes

Inspired by Евгений Новиков's solution, I thought it should be doable with less tricks, i.e., just jumping around to otherwise "disjoint" codes for all three variants. I'm still trying with a smart variant that uses lodsb; lodsb as central point (so only one string constant is needed for all variants)

EB 14 00 00 8A 8A 17 16 01 01 B4 B4 09 09 CD CD
21 21 CD CD 20 20 8A 1f 01 B4 09 CD 21 CD 20 48
65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 00 48 48 65
65 6c 6c 6c 6c 6f 6f 2c 2c 20 20 57 57 6f 6f 72
72 6c 6c 64 64 21 21 00 00

If I recall correctly from my childhood days, COM's tiny model starts with DS=CS=SS and the code is loaded beginning from CS:0100h. I do not assume it is guaranteed that the code is loaded into a zeroed memory block (if it were guaranteed, I could drop two bytes).

Disassembly of the long code should be

  JMP *+14h
  ; 20 irrelevant bytes
  MOV DX,message
  MOV AH,09h
  INT 21h;  print string pointed to by DS:DX
  INT 20h;  exit program
message:
  DB "Hello, World!\0"
  DB "HHeelllloo,,  WWoorrlldd!!\0\0"

Disassembly of odd code

  JMP *+00h
  MOV DX,message
  MOV AH,09h
  INT 21h;  print string pointed to by DS:DX
  INT 20h;  exit program
  ; some irrelevant bytes
message:
  DB "Hello, World!\0"

Disassembly of even code:

  ADC AL,00h
  MOV DX,message
  MOV AH,09h
  INT 21h;  print string pointed to by DS:DX
  INT 20h;  exit program
  ; some irrelevant bytes
message:
  DB "Hello, World!\0"

Good job! In DOSBox program is not working. I don't know why com file with this code freeze system at start.
Евгений Новиков

Test your code next time. The 8A at 0116 should be BA instead, and strings are terminated by $, not NULL.
NieDzejkob

4

Retina, 48 bytes

G |`

HHeelllloo,,  WWoorrlldd!!
$_&

(.)\1t?
$1

Try it online!

Odd positions:

G|
Hello, World!
_
()1?$

Try it online!

Even positions:

 `
Hello, World!$&
.\t
1

Try it online!

Explanation

The full program:

G |`

This does nothing at all. The | is not an existing configuration option. The G makes this a grep stage, but there is really nothing to be grepped and the regex is empty any, so this doesn't do anything. The purpose of this stage is to have two linefeeds in front of the main "Hello, World!" line so that one of them always survives the reduction. The reason for making this a grep stag is that we need to offset the parity of the lines, and grep stages only require a single line.


HHeelllloo,,  WWoorrlldd!!

This turns the (empty) working string into the required output with each character doubled.

$_&

This does nothing. The regex tries to match a _ and a & after the end of the string which is of course impossible. We'll need those characters in the reduced version though, again to deal with vanishing linefeeds.

(.)\1t?
$1

Finally, we remove the duplicate characters by replacing (.)\1 with $1. The t? is never used but will again be necessary in the reduced versions.

The odd program:

G|
Hello, World!

The G can't match the empty input, but that's why we have the | to allow an alternative empty match. This turns the empty working string into the desired output.

_
()1?$

This replaces underscores with ()1?$, but there are no underscores in the string, so this does nothing.

The even program:

 `
Hello, World!$&

The ` just denotes an empty configuration string, so we again use the empty regex to replace the working string with the output. This time we also insert $& but that's the match itself, which is empty, of course, so it doesn't do anything.

.\t
1

This would replace any character followed by a tab with a 1, but we don't have any tabs, so this is also a no-op.




2

PHP, 70 bytes

"";echo'Hello, World!'.""//pprriinntt''HHeelllloo,,  WWoorrlldd!!''
;;

Odd characters:

";coHlo ol!."/print'Hello, World!';

Even characters:

"eh'el,Wrd'"/print'Hello, World!'
;

2

Haskell, 92 bytes

{---- }

mmaaiinn==ppuuttSSttrr""HHeelllloo,,  WWoorrlldd!!""----}main=putStr"Hello, World!"

Try it online! It looks like the comment abuse is too much for the syntax highlighting to handle. {- ... -} is an inline or multi-line comment, whereas -- starts a line comment.

Odd characters:

{--}
main=putStr"Hello, World!"--mi=uSrHlo ol!

Try it online!

Even characters:

-- 
main=putStr"Hello, World!"--}anptt"el,Wrd"

Try it online!


2

Zsh, 54 bytes

<<<Hello\ world!||eecchhoo  HHeelllloo\\  wwoorrlldd!!

Try it online!

The main program executes the first statement successfully, so the statement after the boolean || is ignored.

For odd/even, the <<<Hello\ world! becomes either an unterminated <<heredoc or a <file provided on stdin. Either way, the || becomes |, and so whatever is output by the first command is piped into and ignored by echo.


1

LOGO, 71 bytes

;;\\
pr[Hello, World!]er "|

pprr[[HHeelllloo,,  WWoorrlldd!!]]
;;\\
|

(the program have a trailing newline)

Two removed versions:

;\p[el,Wrd]r"
pr[Hello, World!]
;\|

and

;\
rHlo ol!e |
pr[Hello, World!];\

(the program have a trailing newline)

For an explanation what pr and er do, see this post. In this case, er is feed with a word determine procedure name.

The \ is escape character in Logo, which will escape the newline after the end of the comment, therefore make the second line (rHlo ol!e |) of second removed program a comment.


1

Javascript,68 bytes

//**
alert`Hello, World`//**//aalleerrtt``HHeelllloo,,  WWoorrlldd``

Odd Characters:

/*aetHlo ol`/*/alert`Hello, World`

Even Characters:

/*
lr`el,Wrd/*/alert`Hello, World`

Modified version of my answer on the other one.


1
Для чого потрібен пробіл на початку?
CalculatorFeline

Здається, це не є синтаксично допустимим, коли ви приймаєте символи 1-го, 3-го і т.д. тощо. Крім того, він не містить lв HHeelllloo.
Арнольд

@ CalculatorFeline, @ Arnauld виправлено
SuperStormer


1

BotEngine , 180 178 bytes

Виходячи з моєї відповіді на це питання.

 vv 
 v < 
 eHH 
 eee 
 ell 
 ell 
 eoo 
 e,, 
 e   
 eWW 
 eoo 
 err 
 ell 
 edd 
 e!! 

>>P          e     e     e     e     e     e     e     e     e     e     e     e     e P

Непарні символи (зверніть увагу на кілька пробілів у останньому рядку):

 v
v<
eH
ee
el
el
eo
e,
e 
eW
eo
er
el
ed
e!
>P                                          

Навіть символи:

v     H  e  l  l  o  ,     W  o  r  l  d  ! 
>     e  e  e  e  e  e  e  e  e  e  e  e  eP  

0

Рунічні чари , 52 байти

 L @""H!edlllroo,W  W,oorlllde!H"" ~@"!dlroW ,olleH"

Спробуйте в Інтернеті!

Рунік, як правило, не дуже добре поводиться з радіацією, оскільки видалення випадкових символів контролю потоку робить простежувальне виконання величезним болем, але передбачуваним випромінюванням, як і всі інші персонажі? Легко, ми просто кодуємо дві програми, які перевернуті один на одного та переплетені, а потім застосуємо третю копію для базового виконання та контролюємо, яка з них виконується одним символом. У програмі 2 третя копія - це сміття, яке ніколи не бачили, а в програмі 3 він зберігає лапки, дозволяючи виводити його без друку.

Програма 1 виконує лише цю частину:

 L                                  @"!dlroW ,olleH"

Програма 2 виконує лише цю частину:

    " H e l l o ,   W o r l d ! "   @               

Подобається це:

  "Hello, World!" @!lo olH

Спробуйте в Інтернеті!

Програма 3 виконує лише цю частину:

 L @ " ! d l r o W   , o l l e H " ~ " d r W , l e "

Подобається це:

L@"!dlroW ,olleH"~"drW,le"

Спробуйте в Інтернеті!

"drW,le"Частина виконана, але~ immediately pops it off the stack, preserving the desired output.

Наївно, здавалося б, що перетворення відповіді> <> призведе до скорочення програми, вагою в 45 байт:

! ```!!ddllrrooWW  oolllleeHH`!!`` R~$ LR $ L

Однак у Runic є одне обмеження, яке> <> не має: максимальний розмір стека 10 + мана IP (що спочатку становить 10). І !!ddllrrooWW oolllleeHHмістить 24 символи, що призводить до того, що IP вимкне ману, поки вона не закінчиться безпосередньо перед виконанням Rкоманди, в результаті чого для базової програми не буде виводу.

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.