“Merhaba Dünya!” (Diğer her karakter, Bölüm 2)


18

Merhaba, Dünya için bölüm 2 bir tür olarak ! (Diğer tüm karakter) , böyle bir programı yazmak her üç Bu programların yazdırmak "Merhaba, Dünya!": Tüm programı, 1., 3., 5., vb programının karakterler ve 2, 4, 6, vb.

Programınız:

abc
def

Çıktı almalı "Merhaba, Dünya!"

acdf

Ve

b
e

Yerleşik "Merhaba, Dünya!" İle çözüm yok.


6
Neden metni sadece "Merhaba Dünya!" başka bir şeye?
Conor O'Brien

1
Bence boşluklardan yeterince uzak durur ve "Merhaba Dünya!" kanoniktir.
Leo Tenenbaum

24
IMO "Merhaba, Dünya!" Dan farklı bir dize görmek güzel olurdu arada bir (bu sadece benim düşüncem)
Conor O'Brien

1
Beyaz alanlar ve yeni satırlar karakter olarak sayılıyor mu?
officialaimm

6
@ ConorO'Brien Çok az dilin kelimenin tam anlamıyla diğer tüm dizeler için yerleşik olacağı hoş yan etkisi ile.
Dennis

Yanıtlar:


24

x86 makine kodu, 378 bayt

demo

PROG.COM MS-DOS öykünücüsü, DOSBox , örneğin indirin ve çalıştırın .

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

Ayrıca LEFT.COM ve RIGHT.COM indirebilirsiniz

Nasıl çalışır ve nasıl çalıştırılır

Birinci bölümün cevabına bakınız

sihirli

Bir parametre 0xCD ile 0xAB opcode komutunu yürütmek istiyorsanız ,

Magic

Jeneratör

Kodu çalıştırın, hex alın. İkili dosyaya dönüştür

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


13

Python 3 , 115 bayt

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

Her garip karakter

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

Her çift karakter

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

Çevrimiçi deneyin!

Bu muhtemelen çok daha kısa olabilir, ancak Python'da çalışmayı başardığım için mutluyum. Vroomfondel'in ilk kısımdaki cevabına benzer .

Sıkıcı 93 bayt cevap

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

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

Her garip karakter

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

Her çift karakter

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

Çevrimiçi deneyin!


9

> <> , 45 bayt

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

Ya da sadece karakterler:

 "!dlroW olleH"!">o<  

Veya sadece garip karakterler:

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

Onları çevrimiçi deneyin: orijinal , eşitler , oranlar .

Orijinal sürüm !!ddllrrooWW oolllleeHHyığına " " iter , daha sonra balık arasında >~o <bir harf siler, iki tane yazdırır, iki tane siler, iki tane basar, iki tane siler, vb. Arasında sıçrar . Zor kısım birleştirildi "ve !her üç programda da dize moduna girip çıkmak için doğru şekilde.


7

Befunge-98 , 43 bayt

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

Çevrimiçi deneyin!

Sadece garip olanlar:

10x"!dlroW ,olleH"ck,@

Çevrimiçi deneyin!

Sadece çift olanlar:

2 "!dlroW ,olleH"ck,@

Çevrimiçi deneyin!

açıklama

Tam 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.

Tek programda, 2gitti, bu yüzden 10xgerçekten hiçbir şey yapmaz ( (1,0)zaten varsayılan olan deltayı ayarlar ). Programın geri kalanı da aynıdır.

Eşit programda, sadece 2görmezden gelebileceğimiz başlangıcını itiyoruz. Programın geri kalanı öncekiyle aynıdır.



5

Mathematica, 65 bayt

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

Bazı uyarılar, baskılar Hello, World!ve dönüşler atar Null PPrriinntt[["" HHeelllloo, Null, "" WWoorrlldd!!]]. Bir program olarak çalıştırıldığında (REPL'de değil), dönüş değeri yazdırılmaz.

Çift karakterleri kaldırdıktan sonra:

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

Yazdırır Hello, World!ve geri döner "el,Wrd" Null Pit.

Tek karakterleri kaldırdıktan sonra:

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

Yazdırır Hello, World!ve geri döner Null ol! rn[Hlo].


5

x86 makine kodu, 73 bayt

Евгений Новиков'ın çözümünden esinlenerek , daha az hile ile yapılabileceğini düşündüm, yani sadece üç varyant için "ayrık" kodlara atlamak. Hala lodsb; lodsbmerkezi nokta olarak kullanan akıllı bir değişken ile çalışıyorum (böylece tüm değişkenler için sadece bir dize sabiti gerekli)

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

Çocukluk günlerimden doğru bir şekilde hatırlarsam, COM'un küçük modeli ile başlar DS=CS=SSve kod başlangıçtan itibaren yüklenir CS:0100h. Kodun sıfırlanmış bir bellek bloğuna yüklendiğini garanti etmiyorum (eğer garanti edilmişse, iki bayt bırakabilirim).

Uzun kodun sökülmesi

  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"

Tek kodun sökülmesi

  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"

Çift kodun sökülmesi:

  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"

Aferin! DOSBox programında çalışmıyor. Neden bu kod dondurma sistemi ile com dosyası başlangıçta bilmiyorum.
Евгений Новиков

Bir dahaki sefere kodunuzu test edin. Bunun yerine 8Aat 0116 olmalıdır BAve dizeler $NULL ile sonlandırılır .
NieDzejkob

4

Retina , 48 bayt

G |`

HHeelllloo,,  WWoorrlldd!!
$_&

(.)\1t?
$1

Çevrimiçi deneyin!

Tek pozisyonlar:

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

Çevrimiçi deneyin!

Eşit konumlar:

 `
Hello, World!$&
.\t
1

Çevrimiçi deneyin!

açıklama

Tam program:

G |`

Bu hiçbir şey yapmaz. |Varolan yapılandırma seçeneği değildir. Bunu Gbir grep aşaması yapar, ancak gerçekten de açılmak için hiçbir şey yoktur ve normal ifade boştur, bu yüzden hiçbir şey yapmaz. Bu aşamanın amacı ana "Merhaba Dünya!" Önünde iki satır besleme yapmaktır. böylece onlardan biri her zaman azalmadan kurtulabilir. Bunu grep stag yapmanın nedeni, çizgilerin paritesini dengelememiz gerektiğidir ve grep aşamaları sadece tek bir çizgi gerektirir.


HHeelllloo,,  WWoorrlldd!!

Bu, (boş) çalışma dizesini, her karakter iki katına çıkarak gerekli çıktıya dönüştürür.

$_&

Bu hiçbir şey yapmaz. Normal ifade a _ve a& ifade elbette imkansız olan dizenin sonunda . Yine de yok olan satır beslemeleriyle başa çıkmak için bu karakterlere indirgenmiş versiyonda ihtiyacımız olacak.

(.)\1t?
$1

Son olarak, yinelenen karakterleri değiştirerek (.)\1 ile $1. t?Hiç kullanılmamış ama yine azaltılmış sürümleri gerekli olacaktır.

Garip program:

G|
Hello, World!

GBoş giriş maç olamaz, ama elimizdeki bu yüzden| , alternatif bir boş eşleşmeyi izin vermek. Bu, boş çalışma dizesini istenen çıktıya dönüştürür.

_
()1?$

Bu alt ()1?$çizgilerin yerini alır , ancak dizede alt çizgi yoktur, bu nedenle hiçbir şey yapmaz.

Eşit program:

 `
Hello, World!$&

`Tekrar çıkışı ile çalışan dize yerine boş normal ifadeler kullanabilirsiniz yüzden sadece boş bir yapılandırma dize belirtir. Bu sefer de ekliyoruz, $&ancak boş olan maçın kendisi, bu yüzden hiçbir şey yapmıyor.

.\t
1

Bu, herhangi bir karakterin ardından gelen sekmeyi a ile değiştirir 1, ancak herhangi bir sekmemize sahip olmadığımız için bu da işlem yapılmaz.




2

PHP, 70 bayt

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

Garip karakterler:

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

Çift karakterler:

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

2

Haskell , 92 bayt

{---- }

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

Çevrimiçi deneyin! Yorum kötüye kullanımı sözdizimi vurgulaması için çok fazla. {- ... -}bir satır içi veya çok satırlı yorumdur, oysa --bir satır açıklaması başlatır.

Garip karakterler:

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

Çevrimiçi deneyin!

Çift karakterler:

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

Çevrimiçi deneyin!


2

Zsh , 54 bayt

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

Çevrimiçi deneyin!

Ana program ilk ifadeyi başarıyla yürütür, bu nedenle boole'den sonraki ifade || yok sayılır.

Tek / çift için <<<Hello\ world!, ya sonlandırılmamış <<heredocveya <filestdin'de sağlanmış olur . Her iki durumda da, ||olur |ve bu nedenle ilk komutla çıkan her şey içine konur ve tarafından yoksayılır echo.


1

LOGO , 71 bayt

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

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

(programın sondaki bir yeni satırı vardır)

Kaldırılan iki sürüm:

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

ve

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

(programın sondaki bir yeni satırı vardır)

Ne prve ne eryapacağına dair bir açıklama için bu gönderiye bakın . Bu durumda,er bir kelime belirleme prosedürü adı ile beslenir.

\Bu nedenle, açıklama sonunda yeni satır kaçış ikinci hat (yapacak Logo çıkış karakteri, bir rHlo ol!e |ikinci kaldırıldı programı bir yorum).


1

Javascript, 68 bayt

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

Tek Karakterler:

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

Çift Karakterler:

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

Diğer yanıtımda değiştirilmiş sürüm.


1
Neden başlangıçta alana ihtiyacınız var?
CalculatorFeline

1., 3. vb. Karakterleri aldığınızda bu sözdizimsel olarak geçerli görünmüyor. Ayrıca, bir eksik lin HHeelllloo.
Arnauld

@ CalculatorFeline, @ Arnauld sabit
SuperStormer


1

BotEngine , 180 178 bayt

Bu soruya verdiğim cevaba dayanarak .

 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

Tek karakterler (son satırdaki birden fazla arka boşluğa dikkat edin):

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

Çift karakterler:

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

Runik Efsunlar , 52 bayt

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

Çevrimiçi deneyin!

Runik, radyasyonla başa çıkmada genellikle çok iyi değildir, çünkü akış kontrol karakterlerinin rastgele kaldırılması, izlemeyi yürütmeyi büyük bir acı haline getirir, ancak diğer her karakter gibi tahmin edilebilir radyasyon? Kolay, sadece birbirinin tersine çevrilmiş ve serpiştirilmiş iki programı kodlarız, sonra temel yürütme için üçüncü bir kopyaya yapışır ve hangisinin tek bir karakterle yürütüleceğini kontrol ederiz. Program 2'de, üçüncü kopya hiç görülmemiş bir çöptür ve program 3'te tırnak işaretlerini tutarak yazdırmadan patlatmasına izin verir.

Program 1 sadece bu bölümü yürütür:

 L                                  @"!dlroW ,olleH"

Program 2 yalnızca bu bölümü yürütür:

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

Bunun gibi:

  "Hello, World!" @!lo olH

Çevrimiçi deneyin!

Program 3 yalnızca bu bölümü yürütür:

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

Bunun gibi:

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

Çevrimiçi deneyin!

"drW,le"Kısım yürütülür, ancak ~hemen istenen çıkış koruyarak, yığın kapama çıkar.

Saf olarak,> <> cevabının dönüştürülmesinin 45 bayt ağırlığında olan daha kısa bir programla sonuçlanacağı görülecektir:

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

Bununla birlikte, Runik'in> <> sahip olmadığı bir sınırlaması vardır: maksimum yığın boyutu 10 + IP mana (başlangıçta 10). Ve !!ddllrrooWW oolllleeHH24 karakter içerir, IP'nin Rkomutu çalıştırmadan hemen önce sona erene kadar mana kanamasına neden olur ve bu da temel program için çıkış olmaz.

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.