เขียนล่าม“ สวัสดี”
พื้นหลัง
สวัสดีเป็นภาษา "เขียน" โดยAnne Velingซึ่งเกิดข้อผิดพลาดหากโปรแกรมไม่ได้มีเพียงอย่างเดียวhและจะพิมพ์Hello Worldสำหรับทุกๆh
งาน
คุณต้องเขียนล่าม / คอมไพเลอร์สวัสดี
ตัวอย่างใน Python
import os
i = input("Program: ")
for a in i:
if a != 'h':
print("err")
quit()
else:
print("Hello World")
รายละเอียด
- หากโปรแกรมไม่เพียง แต่
hต้องพิมพ์errหรือerror(ไม่คำนึงถึงขนาดตัวพิมพ์) - เป็นเรื่องปกติถ้าคุณพิมพ์ "Hello World" ก่อนที่โปรแกรมของคุณจะพบว่าไม่มี
hอักขระและข้อผิดพลาดอย่างไรก็ตามโปรแกรมจะต้องหยุดหากไม่มีh - คุณอาจเกิดข้อผิดพลาดได้ตราบเท่าที่คุณพิมพ์
err/errorก่อนโยนหรือโดยใช้ข้อผิดพลาดที่สร้างขึ้นเองเช่นraise SyntaxError('err')ใน python (โดยพื้นฐานแล้วคุณต้องมีข้อผิดพลาดโดยเจตนากับerr/error - สมมติโปรแกรมจะไม่ว่างเปล่า
- เอาต์พุตสามารถมีการขึ้นบรรทัดใหม่ช่องว่างหรือไม่มีอะไรเพื่อแยก
Hello Worlds - หากโปรแกรมมีหลายบรรทัดควรมีข้อผิดพลาด (เนื่องจาก
\nไม่ใช่h) - คุณสามารถสมมติว่าอินพุตจะเป็น ASCII 33-126 และ 10 (ทศนิยม) เสมอ
- พบคำสั่ง
hs เป็นตัวพิมพ์เล็ก (ดังนั้นHไม่ใช่โปรแกรมที่ถูกต้อง) - นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดชนะ
กรณีทดสอบ
Input:
h
Output:
Hello World
Input:
hhhhhh
Output:
Hello WorldHello WorldHello WorldHello WorldHello WorldHello World
(again, it doesn't matter whether it's spaces, newlines, or nothing to separate `Hello World`s
Input:
rubbish
Output:
err
Input:
huh
Output:
Hello Worlderr
Or
err
ความท้าทายแรกดังนั้นโปรดเมตตา
คำตอบ
ความยาว , \$1.42 \times 10^{122}\$ ไบต์
ลบไบต์จำนวนมากขอบคุณ Kevin Cruijssen และ Bubbler
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh...
นี่คือ 142099843608359281286315447494338058415442968773543757980908246691462388164856076679905341690709953072132211450166077106439 hs ซึ่งทำให้เป็นโปรแกรม Hello ที่ถูกต้องแม้ว่าจะไม่ใช่โปรแกรมที่คุณต้องการเรียกใช้ก็ตาม รหัส brainfuck เดิมคือ140 135 ไบต์:
,[>-[<-->-----]+<--[>]>[[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++.>>.>.<<<.+++.------.<<-.[>]>>>>,>]<]<[[>++<+++++]>-.+++++++++++++..>]
ลองออนไลน์!
สิ่งนี้จะพิมพ์ Hello World ทุกครั้งที่เห็นhผ่านการปรับเปลี่ยนHello, World ที่สั้นที่สุดที่รู้จักกันดี โปรแกรมหยุดห่วงและการพิมพ์ถ้าเห็นอะไรอื่นนอกจากerrh
Python 3 , 49 ไบต์
lambda s:{*s}-{'h'}and'err'or'Hello World'*len(s)
ลองออนไลน์!
Python 2, 51 ไบต์
lambda s:s.strip('h')and'err'or'Hello World'*len(s)
ลองออนไลน์!
Python 2, 51 ไบต์
lambda s:['err','Hello World'*len(s)]['h'+s==s+'h']
ลองออนไลน์!
APL (Dyalog Unicode) , 32 ไบต์ ( SBCS )
ฟังก์ชันคำนำหน้าโดยปริยายแบบไม่ระบุชื่อ
{'h'=⍵:'Hello World'⋄-⎕←'err'}⍤0
ลองออนไลน์!
{... }⍤0 แทนที่อักขระแต่ละตัว ( ⍵) ด้วยผลลัพธ์ของการใช้แลมด้าต่อไปนี้กับมัน:
'h'=⍵: ถ้าตัวละครคือh:
'Hello World' ส่งคืนวลีที่ต้องการ
⋄ อื่น:
⎕←'err' พิมพ์err
- ลบ (ทำให้เกิดข้อผิดพลาดและยุติ)
R , 76 ไบต์
function(p,n=nchar(p))ifelse(p==strrep('h',n),strrep("Hello World",n),'err')
ลองออนไลน์!
ควรเป็นความคิดเห็นเกี่ยวกับ https://codegolf.stackexchange.com/a/210520/98085- ฉันไม่รู้เลยว่าคุณจะทำหน้าที่แบบนั้นได้! การเปลี่ยนแปลงเล็กน้อยเพื่อให้มีประสิทธิภาพมากขึ้นเมื่อ n = 0 และใช้การเปรียบเทียบโดยตรงแทน regex -1 ไบต์ขอบคุณhttps://codegolf.stackexchange.com/users/90265/zippymagician.
รุ่นโบนัสพร้อมเอฟเฟกต์ข้างเคียง (เช่นการกำหนดค่าการลบใหม่) ต้องขอบคุณ https://codegolf.stackexchange.com/users/92901/dingus.
R , 71 ไบต์
{`-`=strrep;function(p,n=nchar(p))`if`(p=='h'-n,'Hello world'-n,'err')}
ลองออนไลน์!
Gema 23 ตัวอักษร
h=Hello World
?=err@end
ตัวอย่างการรัน:
bash-5.0$ echo -n 'hohoho' | gema 'h=Hello World;?=err@end'
Hello Worlderr
Gema (เวอร์ชันเก่าที่มีข้อผิดพลาดในรหัสว่างเปล่า), 32 อักขระ
\A\Z=err
h=Hello World
?=err@end
ลองออนไลน์! / ลองทดสอบทุกกรณีทางออนไลน์!
รหัสเครื่อง x86-16, IBM PC DOS, 41 40 ไบต์
ไบนารี่:
00000000: be82 00ba 1801 b409 ac3c 0d74 0a3c 6874 .........<.t.<ht
00000010: 02b2 24cd 2174 f1c3 4865 6c6c 6f20 576f ..$.!t..Hello Wo 00000020: 726c 6424 6572 7224 rld$err$
รายชื่อ:
BE 0082 MOV SI, 82H ; SI to DOS PSP
BA 0118 MOV DX, OFFSET HW ; point to 'Hello World' string
B4 09 MOV AH, 9 ; DOS write string function
CHAR_LOOP:
AC LODSB ; AL = next input byte
3C 0D CMP AL, 0DH ; is a CR (end of input string)?
74 0A JZ DONE ; if so, end
3C 68 CMP AL, 'h' ; is an 'h'?
74 02 JZ WRITE_STR ; if so, write Hello(s)
B2 24 MOV DL, LOW OFFSET ER ; otherwise, point to 'err' string
WRITE_STR:
CD 21 INT 21H ; write string to stdout
74 F1 JZ CHAR_LOOP ; if 'h', keep looping
DONE:
C3 RET ; return to DOS
HW DB 'Hello World$'
ER DB 'err$'
โปรแกรม COM ที่ทำงานได้บน PC DOS แบบสแตนด์อโลน ป้อนข้อมูลผ่านบรรทัดคำสั่ง เวอร์ชันนี้จะพิมพ์ออกมาHello Worlderrหากมีข้อผิดพลาดในรหัสอินพุต
และเพื่อความสนุกสนาน (และเนื่องจากฉันทำครั้งแรก) เวอร์ชันนี้จะพิมพ์เฉพาะerrเมื่อมีข้อผิดพลาดในโค้ดเท่านั้น
รหัสเครื่อง x86-16, IBM PC DOS, 47 45 44 ไบต์
ไบนารี่:
00000000: bf80 00ba 1c01 8a0d 4951 abb8 6809 f3ae ........IQ..h...
00000010: 5974 04b2 28b1 01cd 21e2 fcc3 4865 6c6c Yt..(...!...Hell
00000020: 6f20 576f 726c 6424 6572 7224 o World$err$
รายชื่อ:
BF 0080 MOV DI, 80H ; DI to DOS PSP
BA 011C MOV DX, OFFSET HW ; point to 'Hello World' string
8A 0D MOV CL, BYTE PTR[DI] ; CL = input length
49 DEC CX ; remove leading space from length
51 PUSH CX ; save length for later
AB STOSW ; DI to start of command line input
B8 0968 MOV AX, 0968H ; AL = 'h', AH = 9
F3/ AE REPZ SCASB ; search input for 'h': ZF if Hello, NZ if error
59 POP CX ; restore input length
74 04 JZ HELLO_LOOP ; if no error, write Hello(s)
B2 28 MOV DL, LOW OFFSET ER ; otherwise, point to 'err' string
B1 01 MOV CL, 1 ; only show 'err' once
WRITE_LOOP:
CD 21 INT 21H ; write string to stdout
E2 FC LOOP WRITE_LOOP ; loop until done
C3 RET ; return to DOS
HW DB 'Hello World$'
ER DB 'err$'
อุปกรณ์ประกอบฉาก:
- -1 ไบต์สำหรับทั้งสองขอบคุณ @MatteoItalia สำหรับคำแนะนำในการเปลี่ยนเฉพาะไบต์ต่ำบนตัวชี้สตริงข้อผิดพลาด
Ruby -0p , 42 ... 35 33 ไบต์
แนวคิดในการใช้-0pแฟล็ก (แทนที่จะเป็น-nแบบที่ฉันมี) มาจากคำตอบ Perl ของ @ DomHastingsซึ่งประหยัดได้ 4 ไบต์
$_=/[^h]/?:err:'Hello World'*~/$/
ลองออนไลน์!
อ่านโปรแกรมจาก STDIN regex ใช้เพื่อตรวจสอบว่าโปรแกรมมีอักขระอื่นนอกเหนือhจาก ถ้าเป็นเช่นนั้นพิมพ์err; มิฉะนั้นให้พิมพ์Hello Worldหลาย ๆ ครั้งตามจำนวนอักขระในโปรแกรม (กำหนดโดย~/$/)
การใช้ลิเทอรัล regex แบบเปลือยเป็นบูลีนคือ Perlism ที่เลิกใช้แล้วซึ่ง (ตั้งแต่ Ruby 1.9) ใช้งานได้กับแฟล็ก-nหรือ-pเท่านั้น
05AB1E , 17 ไบต์
'hÃQig”Ÿ™‚ï”×ë'‰ë
ลองออนไลน์!
ขอบคุณมากที่ @Kevin สำหรับเครื่องมือบีบอัดพจนานุกรมของคุณ!
และเป็นอีกครั้งที่เควินได้โจมตีและจัดการเพื่อโกน 3 ไบต์จากคำตอบของฉัน! ดังนั้นคำขอบคุณดังกล่าวจะต้องคูณด้วยขนาดใหญ่
อธิบาย (เก่า)
Ð'hÃQig”Ÿ™‚ï”и»ë"err
Ð # Triplicate the input. STACK = [input, input, input]
'h # Push the letter 'h'. STACK = [input, input, input, 'h']
à # Keep _only_ the letter h in the input. STACK = [input, input, input.keep('h')]
Q # Compare this with the original input. STACK = [input, 1 OR 0]
i # If the comparison is truthy (i.e. it's only h's):
g # Push the length of the input. STACK = [len(input)]
”Ÿ™‚ï” # Push the compressed string "Hello World". STACK = [len(input), "Hello World"]
и» # Repeat that string length of input times and join upon newlines. STACK = ["\n".join("Hello World" * len(input))]
ë # Else:
"err # Push the string "err" to the stack. STACK = [input, "err"]
# Implicitly output the top of the stack
Haskell (Hugs 2006), 31 ไบต์
mapM(\'h'->putStr"Hello World")
รอคำถามเกี่ยวกับ OP re "error" ในข้อความแสดงข้อผิดพลาดที่ใหญ่กว่า ข้อมูลจำเพาะระบุว่า "ต้องพิมพ์ผิดพลาดหรือผิดพลาด" ซึ่งทำใน Hugs 2006 โดยเฉพาะRaskell 1.0.13 interpreter based on Hugs 2006:
> mapM(\'h'->putStr"Hello World") "huh"
Hello World
Program error: pattern match
failure: ww_v4136 'u'
Arn , 24 ไบต์
ùÝ└ån<⁼aLw$■v&Z(#▄╗└·I╔║
ลองมัน!
อธิบาย
ไม่ได้บรรจุ: (${="h"})#=#&&'yt bs'^#||"err
และนี่คือสาเหตุที่ฉันต้องเพิ่ม if else ...
( Begin expression
$ Filter
{ Block with index of _
_ Implicit
= Equals
"h" String
} End block
_ Variable initialized to STDIN; implied
) End expression
# Length
= Equals
_ Implied
#
&& Boolean AND
'yt bs' Compressed string equal to "Hello World"
^ Repeated
_ Implied
#
|| Boolean OR
"err
Excel, 63 ไบต์
=IF(SUBSTITUTE(A1,"h","")="",REPT("Hello World",LEN(A1)),"err")
SUBSTITUTE(A1,"h","")=""ส่งคืนTRUEiff A1ไม่มีอะไรเลยนอกจากh.
REPT("Hello World",LEN(A1))A1ซ้ำสตริงสำหรับตัวอักษรอย่างไรก็ดีหลายคนที่อยู่ใน
=If(Substitute(~)="",REPT(~),"err")ส่งคืนสตริงที่ซ้ำถ้าA1มีเท่านั้นhและerrหากมีสิ่งอื่น
SNOBOL4 (CSNOBOL4) , 94 ไบต์
I =INPUT
I NOTANY('h') :S(E)
OUTPUT =DUPL('Hello World',SIZE(I)) :(END)
E OUTPUT ='err'
END
ลองออนไลน์!
I =INPUT ;* Read input
I NOTANY('h') :S(E) ;* If there is a character that's not 'h' in the input, goto E
OUTPUT =DUPL('Hello World',SIZE(I)) :(END) ;* else print "Hello World" repeatedly and goto END
E OUTPUT ='err' ;* print 'err'
END
เยลลี่ 17 ไบต์
14 ถ้าเราสามารถพิมพ์Errเป็นสตริงย่อยของเอาต์พุต (เช่น“½,⁾ẇṭ»€!fƑ?”h TIO )
“½,⁾ẇṭ»€“¹ṫ»fƑ?”h
ลองออนไลน์!
อย่างไร?
“½,⁾ẇṭ»€“¹ṫ»fƑ?”h - Main Link: program
”h - set right argument to 'h'
? - if...
Ƒ - ...condition: is (program) invariant under?:
f - keep only ('h's)
€ - ...then: for each (c in program):
“½,⁾ẇṭ» - "Hello World"
“¹ṫ» - ...else: "error"
- implicit, smashing print
เฟล็กซ์ , 76 \$\cdots\$ 55 52 ไบต์
%%
h puts("Hello World");
[^h] puts("err");exit(1);
ใส่รหัสด้านบนในไฟล์ที่เรียกhello.lและสร้างล่ามด้วย:
flex hello.l && gcc lex.yy.c -o hello -lfl
ลองใช้เครื่องปลายทางของฉัน:
> echo -n hhh|./hello.exe
Hello World
Hello World
Hello World
ด้วยการขึ้นบรรทัดใหม่:
> echo hhh|./hello.exe
Hello World
Hello World
Hello World
err
สังเกตว่าerrเนื่องจากการขึ้นบรรทัดใหม่echoตามปกติจะส่ง
ด้วยhอักขระที่ไม่ใช่:
> echo -n hhhehhh|./hello.exe
Hello World
Hello World
Hello World
err
C (gcc) , 71 65 ไบต์
f(char*p){p=*p-'h'?*p&&puts("err"):f(p+1)||!puts("Hello World");}
ลองออนไลน์!
- ขอบคุณ @rtpax สำหรับการประหยัด 6!
f(char*p){p=- ฟังก์ชั่นการตรึงprogramและกลับมาพร้อมกับเคล็ดลับ EAX pที่นำ
เรียกตัวเองซ้ำ
การเรียกซ้ำเกิดขึ้นก่อนprogramการดำเนินการดังนั้นหากขั้นตอนทั้งหมดถูกต้องfalseจะส่งคืนค่าและprogramดำเนินการ
หากมีข้อผิดพลาดtruthyค่าจะถูกส่งกลับและprogramไม่ได้ดำเนินการเลยข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น
* p-'h '? `... `: f (p + 1) ||! puts ("สวัสดีชาวโลก");
- ตรวจสอบอักขระแต่ละตัวในโปรแกรม : ถ้าh ยังคงเรียกซ้ำและ
หากผลลัพธ์เป็นโปรแกรมเท็จก็ทำงานได้
pเป็นจริง หากมีข้อผิดพลาดเป็นเท็จแทน
- ถ้าไม่hหยุดการเรียกซ้ำและ:
p * - ถ้าในตอนท้ายของโปรแกรม
P เป็นเท็จ
&& ทำให้ ( "ผิดพลาด") - ถ้าไม่สิ้นสุดของโปรแกรมข้อผิดพลาดการแสดงผล
หน้า เป็นจริง
61 58 bytesทางเลือกอื่นที่น่าสนใจน้อยกว่าซึ่งรันโปรแกรมและหยุดเมื่อเกิดข้อผิดพลาด
f(char*p){*p&&puts(*p-'h'?"err":"Hello World")>4&&f(p+1);}
- บันทึก 3 ขอบคุณ @rtpax!
Python 3 , 52 ไบต์
lambda x:(x=='h'*len(x))*len(x)*'Hello World'or'err'
ลองออนไลน์!
Python 3 , 58 ไบต์
lambda s:s and s=="h"*len(s)and"Hello World"*len(s)or"err"
ลองออนไลน์!
JavaScript, 49 ไบต์
-4 ไบต์ถ้าเราสามารถโยนข้อผิดพลาดแทนที่จะส่งออกสตริง
f=([c,...a])=>c?c==`h`?`Hello World`+f(a):`err`:a
ลองออนไลน์!
JavaScript 72 66 ไบต์
-6 ไบต์ขอบคุณ @Ismael Miguel
alert(/^h*$/.test(a=prompt())?a.replace(/h/g,'Hello World'):'err')
Pip , 28 27 ไบต์
aRM'h?"err""Hello World"X#a
-1 ไบต์จาก DLosc
หากสตริงที่ไม่มี h ว่างเปล่าให้พิมพ์ "Hello World" ตามจำนวนครั้งที่ต้องการ
มิฉะนั้นข้อผิดพลาด
โปรแกรมนี้มีข้อผิดพลาดเกี่ยวกับอินพุตว่างเช่นกัน
ลองออนไลน์!
Python 3 , 57 52 ไบต์
lambda a:a=='h'*len(a)and'Hello World'*len(a)or'err'
ลองออนไลน์!
Japt , 23 19 ไบต์
-4 ไบต์ขอบคุณ @Shaggy
rh ?`r`:¡`HÁM Wld
ลองมัน
คำอธิบาย
rh ?`...`:¡`...
? // if
rh // input with 'h' removed
`...` // then "err"
: // else
¡ // each char in input
`... // replaced with "Hello World"
MathGolf , 23 20 ไบต์
'h-╛æ╖•p0{δ╕○ô 'W╕7ÿ
ลองออนไลน์
คำอธิบาย:
'h- '# Remove all "h" from the (implicit) input-string
╛ # Pop, and if it's now truthy (thus non-empty):
æ # Use the following four characters as single code-block:
╖•p # Push compressed string "err"
0 # And push a 0
{ # Either loop 0 times,
# or loop over each character of the (implicit) input-string:
δ # Titlecase the implicitly pushed current character ("h"→"H")
╕○ô # Push compressed string "ello"
# Push " "
'W '# Push "W"
╕7ÿ # Push compressed string "orld"
# (implicitly output the entire stack joined together as result)
SimpleTemplate 0.84, 92 63 ไบต์
ความท้าทายนี้เรียบง่าย แต่สนุก!
เพียงตรวจสอบว่าอินพุตเป็นเพียง "hhh .... " และส่งออกข้อความหรือส่งออก "err" เป็น STDOUT:
{@ifargv.0 matches"@^h+$@"M}{@eachM.0}Hello World{@/}{@else}err
การประหยัดไบต์ขนาดใหญ่เกิดจากความคิดเห็นของโคบอลต์ :
การส่งออกไปยัง STDOUT นั้นใช้ได้ดังนั้นคุณสามารถใช้เวอร์ชัน 63 ไบต์ของคุณได้
ไม่พอใจ:
ด้านล่างนี้เป็นโค้ดเวอร์ชันที่อ่านได้ง่ายขึ้น:
{@if argv.0 matches "@^h+$@"}
{@each argv.0 as h}
{@echo "Hello World"}
{@/}
{@else}
{@echo "err"}
{@/}
คุณสามารถลองสิ่งนี้ได้ที่: http://sandbox.onlinephpfunctions.com/code/e35a07dfbf6b3b56c2608aa86028b395ef457129
PowerShell , 44 ไบต์
$args|%{if($_-104){'err';exit}"Hello World"}
ลองออนไลน์!
รับข้อมูลโดยการแยก
GFA Basic (Atari ST), 125 ไบต์
INPUT a$ FOR i=1 TO LEN(a$)
b$=MID$(a$,i,1) IF b$="h"
PRINT "Hello World"
ELSE
PRINT "err"
EXIT IF 1
ENDIF
NEXT I
Java 8, 65 53 ไบต์
s->s.matches("h+")?s.replace("h","Hello World"):"err"
-12 ไบต์ขอบคุณที่@ corvus_192
ลองออนไลน์
คำอธิบาย:
s-> // Method with String as both parameter and return-type
s.matches("h+")? // If the input consists solely of 1 or more "h":
s.replace("h", // Replace all "h" in the input
"Hello World") // with "Hello World"
: // Else:
"err" // Return "err" instead
Pyth 25 ไบต์
?-Q\h"err"*"Hello World"l
ลองออนไลน์!
คำอธิบาย
?-Q\h"err"*"Hello World"l
? // if
-Q\h // input with 'h' removed
"err" // then "err"
*"Hello World"l // else "Hello World" repeated len(input) times
R , 84 ไบต์
function(p,n=nchar(p))`if`(n-lengths(gregexpr("h",p)),"err",strrep("Hello World",n))
ลองออนไลน์!
เนื่องจากRเป็นภาษาของเดือนกันยายน 2020 เรามาหาคำตอบ R สำหรับความท้าทายนี้กัน
อย่างไรก็ตามนี่ยังไม่ใช่คำตอบที่สั้นที่สุดในRดังนั้นฉันจึงอยากสนับสนุนให้นักกอล์ฟคนอื่น ๆ ที่ไม่ใช่ R-ปกติได้ไปด้วยเช่นกัน ...
แบทช์ 64 ไบต์
@set/ps=
@if "%s:h=%"=="" (echo %s:h=Hello World%)else echo err
รับข้อมูลบน STDIN ถ้าเปลี่ยนhในผลการป้อนข้อมูลในสตริงว่างการส่งออกผลของการแทนที่ที่hมีต่อการส่งออกเป็นอย่างอื่นHello Worlderr