„Witaj, świecie!” (Każda inna postać, część 2)


18

Jako rodzaj części 2 Hello, World! (Co drugi znak) , napisz program, w którym wszystkie trzy z tych programów wypiszą „Witaj, świecie!”: Cały program, 1., 3., 5. itd. Twojego programu oraz 2., 4., 6., itp.

Jeśli twój program to:

abc
def

Powinien on wypisać „Witaj, świecie!”, Ale tak też powinno być

acdf

I

b
e

Brak rozwiązań z wbudowanymi funkcjami „Hello, World!”.


6
Dlaczego nie zmienić tekstu z „Witaj, świecie!” na coś innego?
Conor O'Brien

1
Myślę, że pozwala to uniknąć luk i „Cześć, świecie!” jest kanoniczny.
Leo Tenenbaum,

24
IMO byłoby miło zobaczyć inny ciąg znaków niż „Witaj, świecie!” raz na jakiś czas (to tylko moja opinia)
Conor O'Brien

1
Czy białe znaki i znaki nowej linii są liczone jako znaki?
officialaimm

6
@ ConorO'Brien Z przyjemnym efektem ubocznym, że niewiele języków ma wbudowane dosłownie co drugi ciąg.
Dennis

Odpowiedzi:


24

kod maszynowy x86, 378 bajtów

demo

PROG.COM Pobierz i uruchom go w emulatorze MS-DOS , na przykład 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

Możesz także pobrać LEFT.COM i RIGHT.COM

Jak to działa i jak uruchomić

Zobacz odpowiedź do pierwszej części

magia

Jeśli chcesz wykonać polecenie opcode 0xAB z jednym parametrem 0xCD , piszesz

Magic

Generator

Uruchom kod, uzyskaj hex. Konwertuj na binarny

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


13

Python 3 , 115 bajtów

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

Każda dziwna postać

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

Każda parzysta postać

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

Wypróbuj online!

Prawdopodobnie może to być znacznie krótsze, ale cieszę się, że udało mi się go uruchomić w Pythonie. Podobne do odpowiedzi vroomfondel w pierwszej części.

Nudna 93 bajtowa odpowiedź

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

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

Każda dziwna postać

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

Każda parzysta postać

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

Wypróbuj online!


9

> <> , 45 bajtów

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

Lub tylko postacie:

 "!dlroW olleH"!">o<  

Lub po prostu dziwne postacie:

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

Wypróbuj je online: oryginalne , wyrównane , kursy .

Oryginalna wersja wypycha „ !!ddllrrooWW oolllleeHH” na stos, a następnie ryba odbija się między >~o <, co usuwa literę, drukuje dwa, usuwa dwa, drukuje dwa, usuwa dwa itd. Dwa półprogramy są dość standardowymi programami do drukowania ciągów. Trudną częścią było prawidłowe łączenie "i !przełączanie trybu ciągów we wszystkich trzech programach.


7

Befunge-98 , 43 bajty

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

Wypróbuj online!

Tylko dziwne:

10x"!dlroW ,olleH"ck,@

Wypróbuj online!

Tylko parzyste:

2 "!dlroW ,olleH"ck,@

Wypróbuj online!

Wyjaśnienie

Pełny program:

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.

W programie nieparzystym 2zniknął, więc tak 10xnaprawdę w ogóle nic nie robi (i tak ustawia deltę, (1,0)która jest domyślna). Pozostała część programu jest wtedy taka sama.

W programie parzystym przesuwamy tylko 2na początku, co możemy całkowicie zignorować. Pozostała część programu jest taka sama jak poprzednio.



5

Mathematica, 65 bajtów

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

Zgłasza ostrzeżenia, odciski Hello, World!i zwraca Null PPrriinntt[["" HHeelllloo, Null, "" WWoorrlldd!!]]. Gdy zostanie uruchomiony jako program (nie w REPL), zwracana wartość nie zostanie wydrukowana.

Po usunięciu parzystych znaków:

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

Drukuje Hello, World!i zwraca "el,Wrd" Null Pit.

Po usunięciu nieparzystych znaków:

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

Drukuje Hello, World!i zwraca Null ol! rn[Hlo].


5

kod maszynowy x86, 73 bajty

Zainspirowany rozwiązaniem Евгений Новиков , pomyślałem, że powinno być wykonalne przy mniejszej liczbie sztuczek, tj. Po prostu przeskakując, by w przeciwnym razie „rozdzielić” kody dla wszystkich trzech wariantów. Nadal próbuję z inteligentnym wariantem, który wykorzystuje lodsb; lodsbjako punkt centralny (więc dla wszystkich wariantów potrzebna jest tylko jedna stała łańcucha)

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

Jeśli dobrze pamiętam z dzieciństwa, zaczyna się od małego modelu COM DS=CS=SS a kod jest ładowany od początku CS:0100h. Nie zakładam, że jest gwarantowane, że kod jest ładowany do wyzerowanego bloku pamięci (gdyby to było zagwarantowane, mogłem upuścić dwa bajty).

Demontaż długiego kodu powinien być

  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"

Demontaż nieparzystego kodu

  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"

Demontaż parzystego kodu:

  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"

Dobra robota! W DOSBox program nie działa. Nie wiem, dlaczego plik com z tym systemem zamrażania kodu na początku.
Евгений Новиков

Przetestuj swój kod następnym razem. 8AW 0116 powinno być BAzamiast, a łańcuchy są zakończone $, nie jest pusta.
NieDzejkob,

4

Siatkówka , 48 bajtów

G |`

HHeelllloo,,  WWoorrlldd!!
$_&

(.)\1t?
$1

Wypróbuj online!

Dziwne pozycje:

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

Wypróbuj online!

Równe pozycje:

 `
Hello, World!$&
.\t
1

Wypróbuj online!

Wyjaśnienie

Pełny program:

G |`

To nic nie robi. To |nie jest istniejąca opcja konfiguracji. To Gsprawia, że ​​jest to etap grep, ale tak naprawdę nie ma nic do grepowania, a wyrażenie regularne jest puste, więc to nic nie robi. Celem tego etapu jest ustawienie dwóch kanałów przed głównym „Witaj, świecie!” tak, aby jeden z nich zawsze przetrwał redukcję. Powodem, dla którego jest to jeleń grep, jest to, że musimy zrównoważyć parzystość linii, a etapy grep wymagają tylko jednej linii.


HHeelllloo,,  WWoorrlldd!!

Powoduje to przekształcenie (pustego) ciągu roboczego w wymagany wynik z podwojeniem każdego znaku.

$_&

To nic nie robi. Wyrażenie regularne próbuje dopasować a _i a &po końcu łańcucha, co jest oczywiście niemożliwe. Będziemy jednak potrzebować tych postaci w zmniejszonej wersji, ponownie, aby poradzić sobie z znikającymi liniami.

(.)\1t?
$1

Na koniec usuwamy zduplikowane znaki, zastępując (.)\1je $1. Thet?Nigdy nie jest używany, ale znów będzie to konieczne w obniżonej wersji.

Program nieparzysty:

G|
Hello, World!

Nie Gmożna dopasować pustego wejścia, ale dlatego musimy |zezwolić na alternatywne puste dopasowanie. To zamienia pusty ciąg roboczy w pożądane wyjście.

_
()1?$

Zastępuje to podkreślenia ()1?$ , ale w ciągu nie ma żadnych podkreślników, więc to nic nie robi.

Program parzysty:

 `
Hello, World!$&

Po `prostu oznacza pusty ciąg konfiguracji, więc ponownie używamy pustego wyrażenia regularnego, aby zastąpić ciąg roboczy wyjściem. Tym razem również wstawiamy, $&ale to samo dopasowanie, które jest oczywiście puste, więc nic nie robi.

.\t
1

Zastąpiłoby to dowolny znak, a po nim tabulację 1, ale nie mamy żadnych tabulatorów, więc nie można tego zrobić.




2

PHP, 70 bajtów

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

Dziwne znaki:

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

Parzyste postacie:

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

2

Haskell , 92 bajty

{---- }

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

Wypróbuj online! Wygląda na to, że nadużywanie komentarzy jest zbyt duże, aby podświetlić składnię. {- ... -}jest komentarzem liniowym lub wieloliniowym, natomiast-- rozpoczyna komentarz liniowy.

Dziwne znaki:

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

Wypróbuj online!

Parzyste postacie:

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

Wypróbuj online!


2

Zsh , 54 bajty

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

Wypróbuj online!

Program główny wykonuje pierwszą instrukcję z powodzeniem, więc instrukcja po wartości logicznej || jest ignorowana.

Dla nieparzystych / parzystych <<<Hello\ world!staje się albo nieskończony, <<heredocalbo <filepodany na standardowym wejściu. Tak czy inaczej, ||staje się |, a więc wszystko, co wyprowadza pierwsze polecenie, jest przesyłane do i ignorowane przez echo.


1

LOGO , 71 bajtów

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

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

(program ma końcowy znak nowej linii)

Dwie usunięte wersje:

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

i

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

(program ma końcowy znak nowej linii)

Wyjaśnienie, co pri jak erzrobić, zobacz ten post . W tym przypadku erjest podawany kanał ze słowem określającym nazwę procedury.

Znak \ucieczki w Logo, który ucieka od nowego wiersza po zakończeniu komentarza, dlatego drugi wiersz ( rHlo ol!e |) drugiego usuniętego programu jest komentarzem.


1

JavaScript, 68 bajtów

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

Dziwne postacie:

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

Parzyste postacie:

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

Zmodyfikowana wersja mojej odpowiedzi na drugiej.


1
Dlaczego potrzebujesz miejsca na starcie?
CalculatorFeline

Wydaje się, że nie jest to poprawne składniowo, jeśli weźmiesz 1, 3 itd. Znaki. Ponadto brakuje lw nim HHeelllloo.
Arnauld

@ CalculatorFeline, @ Arnauld naprawiono
SuperStormer


1

BotEngine , 180 178 bajtów

Na podstawie mojej odpowiedzi na to pytanie.

 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

Dziwne znaki (zwróć uwagę na wiele końcowych spacji w ostatnim wierszu):

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

Parzyste postacie:

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

Runiczne Zaklęcia , 52 bajty

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

Wypróbuj online!

Runiczna zwykle nie jest bardzo dobra w radzeniu sobie z promieniowaniem, ponieważ losowe usuwanie znaków kontroli przepływu sprawia, że ​​wykonywanie śledzenia jest ogromnym bólem, ale przewidywalne promieniowanie jak każda inna postać? Łatwo, po prostu kodujemy dwa programy, które są odwrócone od siebie i przeplecione, a następnie dołączamy trzecią kopię do wykonania podstawowego i kontrolowania, która jest wykonywana za pomocą jednego znaku. W programie 2 trzecia kopia jest śmieciem, którego nigdy nie widziano, aw programie 3 zachowuje cudzysłowy, pozwalając na wyskakiwanie bez drukowania.

Program 1 wykonuje tylko tę część:

 L                                  @"!dlroW ,olleH"

Program 2 wykonuje tylko tę część:

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

Lubię to:

  "Hello, World!" @!lo olH

Wypróbuj online!

Program 3 wykonuje tylko tę część:

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

Lubię to:

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

Wypróbuj online!

"drW,le"Część jest wykonana, ale~ natychmiast pojawia się ze stosu z zachowaniem pożądanej wydajności.

Naiwnie wydaje się, że konwersja odpowiedzi> <> spowoduje krótszy program ważący 45 bajtów:

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

Jednak Runic ma jedno ograniczenie, którego nie ma>>>: maksymalny rozmiar stosu wynoszący 10 + many (początkowo 10). I !!ddllrrooWW oolllleeHHzawiera 24 znaki, co powoduje, że IP upuszcza manę, dopóki nie wygaśnie tuż przed wykonaniem Rpolecenia, co powoduje brak wyjścia dla programu podstawowego.

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.