내결함성 Hello World (일명 인터뷰)


66

인터뷰가 끝나면 Evil Interviewer는 다음과 같이 말합니다. "우리는 모든 지원자들이 짧은 코딩 테스트를 받도록하여 그들이 말하는 내용을 실제로 알고 있는지 확인합니다. 걱정하지 마십시오. 쉽게 만들 수 있습니다. 작업 프로그램으로 즉시 작업을 제공하겠습니다. " 그는 당신이 근처의 컴퓨터에 앉으라고 제스처를합니다. "당신이해야 할 일은 작동하는 Hello World 프로그램을 만드는 것뿐입니다."-그리고 그는 광범위하게 웃고 있습니다. "잡을 수 있습니다. 불행히도이 머신에있는 유일한 컴파일러에는 작은 버그가 있습니다. 컴파일 전 소스 코드 파일입니다. 5 분 후에 see겠습니다. " 그리고 그는 방에서 나와 행복하게 휘파람을 불렀습니다.

일자리를 보장받을 수 있습니까?

작업

Hello, world!파일에서 임의의 위치에서 단일 문자를 제거한 후에도 표준 출력으로 인쇄 할 프로그램을 작성 하십시오. 또는 가능한 한 가까이 접근하십시오.

규칙

외부 출력 없음 - Hello, world!표준 출력으로 인쇄 된 실질적인 것이어야합니다. 후행 줄 바꿈 또는 [1] "Hello, world!"R 과 같은 문자와 같이 선택한 언어로 자연스럽게 생성 된 다른 문자를 포함하는 것이 좋지만 매번 똑같은 것을 인쇄해야합니다. 그것은 인쇄 할 수 없습니다 Hello, world!Hello, world!또는 Hello world!" && x==1예를 들어 시간의 일부. 그러나 경고는 허용됩니다.

테스트 점수를 테스트하려면 프로그램의 가능한 모든 순열을 테스트해야합니다. 각 문자를 제거한 상태에서 테스트하고 올바른 출력을 생성하는지 확인하십시오. 이 목적을 위해 간단한 Perl 프로그램을 아래에 포함 시켰습니다.이 프로그램은 많은 언어에서 작동합니다. 그래도 문제가 해결되지 않으면 테스트 프로그램을 만들어 답변에 포함 시키십시오.

득점 점수는 프로그램이 실패한 횟수입니다 . 다시 말해서, 파일에서 문자를 삭제하는 개별 위치의 수는 프로그램이 작동하지 못하게합니다. 최저 점수가 이깁니다. 동점 일 경우 가장 짧은 코드가 승리합니다.

"Hello, world!"여러 언어 (15 점) 와 같은 사소한 솔루션 은 허용되지만 승리하지는 못합니다. 나는 적어도 4 점의 Perl 솔루션을 찾았으며 결국 게시 할 것입니다.

업데이트 : 공식 우승자는 Turing-complete 프로그래밍 언어를 사용하며 사전 정의 된 인쇄 메커니즘을 사용하지 않습니다 Hello, world!. 사용되는 모든 외부 자원 (언어의 표준 라이브러리 이외의)은 프로그램의 일부로 간주되며 동일한 1 자 삭제가 적용됩니다. 이러한 요구 사항은 포스트잇 메모로 책상에 붙어있었습니다. 당신이 처음에 그들을 보지 못한 경우 사과.

업데이트 2 : 예, 프로그램은 실제로 점수를 받으려면 위에서 설명한 작업을 수행해야합니다! Hello, world!적어도 한 번은 성공적으로 인쇄되어야 함을 의미합니다 . 이것은 분명했다. 기능을 추가하는 명령 줄 스위치 및 기타 설정도 프로그램의 일부로 간주되며 단일 문자 삭제가 적용됩니다. 프로그램은 사용자 입력없이 작업을 수행해야합니다. 컴파일 실패는 실패 횟수로 계산됩니다.

행복한 프로그래밍, 그리고 당신은 직업을 얻을 수 있습니다. 그러나 실패하면 어쨌든 그 사악한 보스를 위해 일하고 싶지 않았을 것입니다.

펄 테스트 스크립트 :

use warnings;
use strict;

my $program   = 'test.pl';
my $temp_file = 'corrupt.pl';
my $command = "perl -X $temp_file"; #Disabled warnings for cleaner output.
my $expected_result = "Hello, world!";

open my $in,'<',$program or die $!;
local $/;           #Undef the line separator   
my $code = <$in>;   #Read the entire file in.

my $fails = 0;
for my $omit_pos (0..length($code)-1)
{
    my $corrupt = $code;
    $corrupt =~ s/^.{$omit_pos}\K.//s;  #Delete a single character

    open my $out,'>',$temp_file or die $!;
    print {$out} $corrupt;  #Write the corrupt program to a file
    close $out;

    my $result = `$command`;    #Execute system command.
    if ($result ne $expected_result)
    { 
        $fails++;
        print "Failure $fails:\nResult: ($result)\n$corrupt";
    }
}

print "\n$fails failed out of " . length $code;

1
삭제 된 문자로 인해 프로그램이 컴파일되지 않을 수 있습니까? 여전히 작동하지 않는 것으로 계산됩니까?
lochok

@lochok, 그렇습니다. 실패한 것으로 간주됩니다. Hello, World!인쇄되지 않는 삭제 된 문자 는 실패입니다.


@ Walkerneo, 감사합니다! 비슷한 질문을 검색했지만 찾지 못했습니다. 그래도 이것이 크게 다르다고 생각합니다. 특히,이 질문은 구문 적으로 유효한 코드를 초래하는 수정 만 처리해야한다는 것을 보증합니다.

"기능을 추가하는 명령 줄 스위치 및 기타 설정"의 예를 들어 주시겠습니까? 프로그램 자체에 제공되거나 빌드 환경 내에서 스위치 및 설정을 사용하는 스위치 및 설정을 의미합니까?
CasaDeRobison

답변:


129

Befunge, 0 점

나는 그것을 깨뜨렸다 고 생각한다. 단일 문자 삭제는 출력을 변경하지 않을 것이다.
1 행에서 문자를 삭제해도 아무 변화가 없습니다. 여전히 같은 위치에서 내려갑니다.
2 행과 3 행은 중복됩니다. 일반적으로 2 행이 실행되지만 문자를 삭제하면 문자 <가 누락되고 3 행이 청구됩니다.
줄 바꿈을 삭제해도 줄 바꿈되지 않습니다 (이전 버전을 중단했습니다).
테스트 프로그램이 없습니다. 죄송합니다.

편집 : 많이 단순화되었습니다.

                              vv
@,,,,,,,,,,,,,"Hello, world!"<<
@,,,,,,,,,,,,,"Hello, world!"<<

흐름에 대한 간단한 설명 :

  1. Befunge는 왼쪽에서 실행을 시작하고 오른쪽으로 이동합니다. 공간은 아무것도하지 않습니다.
  2. v 실행 흐름을 아래로 돌리면 한 줄 아래로 내려갑니다.
  3. < 실행 흐름을 왼쪽으로 돌리므로 2 행을 역순으로 읽습니다.
  4. "Hello, world!"문자열을 스택으로 푸시합니다. 우리는 오른쪽에서 왼쪽으로 실행하기 때문에 역순으로 푸시됩니다.
  5. ,문자를 띄워 인쇄합니다. 마지막으로 누른 문자가 먼저 인쇄되어 문자열이 다시 반전됩니다.
  6. @ 프로그램을 종료합니다.

2
+1, 훌륭한 솔루션. 테스트 프로그램이 필요하다고 생각하지 않습니다. 잠재적으로 중요한 삭제 수가 적다는 것이 분명하기 때문입니다.

4
확인하기 쉽고 토론이 필요하지 않습니다. 천재!
Karma Fusebox

훌륭한 솔루션을 축하합니다.

2
나는 이것이 코드 골프 가 아니라는 것을 알고 있지만 여기 66 바이트 버전이 있습니다.
MD XF

42

펄, 0 점

(147 자)

여기에 내가 4에서 0으로 얻을 수있는 해결책이 있습니다.

eval +qq(;\$_="Hello, world!";;*a=print()if length==13or!m/./#)||
+eval +qq(;\$_="Hello, world!";;print()if*a!~/1/||!m/./#)##)||
print"Hello, world!"

작동하려면 한 줄에 모두 나타나야합니다. 줄 바꿈은 "가독성"전용입니다.

그것은 Perl의 병리학 적으로 허용되는 구문의 혜택을받습니다. 일부 주요 특징 :

  • 인식되지 않는 베어 워드는 문자열로 처리됩니다. 그래서 evalevl문자열을 그 시점에서 허용하는 경우, 그 오류가 아닙니다.
  • 단항 +연산자 ( Unary operator) : 특정 상황에서 명확한 구문 외에는 아무것도하지 않습니다. 함수 이름이 엉망이고 문자열이 될 때 ( function +argument+는 단항)가 string + argument(더하기) 가 되므로 위와 같이 유용 합니다.
  • 문자열을 선언하는 여러 가지 방법 : 큰 따옴표로 묶인 문자열 qq( )은 작은 따옴표로 묶인 문자열 이 될 수 있습니다 q(). 괄호로 구분 된 qq(; ... )문자열은 세미콜론으로 구분 된 문자열이 될 수 있습니다 qq; ... ;. #내부 문자열은 내용을 주석으로 변환하여 균형 문제를 제거 할 수 있습니다.

우고 렌의 솔루션을 이길 수는 없지만 의심의 여지가 있지만 길이는 다소 줄어들 수 있습니다.


13
줄 바꿈 +1은 가독성만을위한 것입니다 .
Bakuriu

40

HQ9 +

이것은 문자가 삭제 될 때 의도 한 결과를 생성하지 못하므로 점수가 0이됩니다.

HH

언제 시작합니까?


1
"Hello, world!"가 아니라 "hello, world"를 생성합니다. 지정된대로.
Paul R

16
말도 안돼, 언어가
esolang

11
그들이 인터뷰 컴퓨터에 HQ9 + 컴파일러를 가지고 있다면 당신에게 좋습니다 ... :)

버그가있는 컴파일러를 작성할 수 있습니다.
PyRulez

2
@ mbomb007 이 인터프리터Hello, world!H명령을 인쇄 합니다 .
Dennis

12

Befunge-98 , 점수 0, 45 바이트

20020xx""!!ddllrrooww  ,,oolllleeHH""cckk,,@@

온라인으로 사용해보십시오!

최적의 솔루션이 이미 발견되었지만 (타이 브레이커가 없음) Befunge 98을 사용하면 이것이 단순화 될 수 있다고 생각했습니다.

설명

20020xx확실 델타 (진드기의 명령 포인터 단계)으로 설정하기 (2,0)때문에, 처음에 시작하는 것으로 x, 단지 모든 다른 명령이 실행된다. 이것이 작동하는 이유에 대한 자세한 설명은 이 답변 을 참조하십시오 . 이후 코드는 다음과 같습니다.

"!dlrow ,olleH"ck,@

먼저로 모든 관련 문자 코드를 스택에 푸시합니다 "!dlrow ,olleH". 그런 다음 ck,스택 상단 ( ,), 13 ( c더하기 1) ( )을 인쇄하는 것을 의미합니다 k. @프로그램을 종료합니다.


11

J, 7 점

홀수 위치의 모든 문자 선택 :

   _2{.\'HHeellllo,,  wwoorrlldd!!'
Hello, world!

5
golfscript에서 같은 점은 4 포인트입니다.'HHeelllloo,, wwoorrlldd!!'2%
cardboard_box

@cardboard_box 부담없이 제출하십시오. :)
randomra

내가 이해하기 때문에 공감하고 속임수처럼 느끼지 않습니다.
Michael Stern

3

Befunge-93, 스코어 0 (63 바이트)

나는 이것이 코드 골프 도전이 아니라는 것을 알고 있지만 기존 Befunge-93 솔루션이 크기면에서 개선 될 수 있는지 보는 것이 흥미로울 것이라고 생각했습니다. 필자는 원래 유사한 오류 404 챌린지 에 사용하기 위해이 기술을 개발 했지만,이 경우 래핑 페이로드가 필요하므로 3 라인 솔루션이 더 최적화되었습니다.

이것은 Martin의 Befunge-98 답변만큼 좋지는 않지만 우승 한 Befunge-93 솔루션을 여전히 상당히 감소시킵니다.

<>>  "!dlrow ,olleH">:#,_@  vv
  ^^@_,#!>#:<"Hello, world!"<<>#

온라인으로 사용해보십시오!

설명

페이로드에는 두 가지 버전이 있습니다. 변경되지 않은 프로그램의 경우 첫 번째 <는 프로그램이 오른쪽에서 왼쪽으로 실행되어 줄의 끝을 감싸고 v두 번째 줄로 <지시하고 왼쪽에서 오른쪽으로 왼쪽으로 지시합니다. 탑재량의.

두 번째 줄에 오류 <가 있으면 결승점이 왼쪽으로 이동하고 대신 >흐름이 오른쪽 으로 향하게됩니다. #(다리) 명령을 통해 점프는 아무 상관이없는, 그래서 주위에 랩과에 도달 할 때까지 코드는 계속 ^다음 첫 번째 줄에 그것을 지시 라인의 시작, 그리고 >바로 오른쪽 투로 연출 왼쪽 탑재량.

첫 번째 줄의 대부분의 오류로 인해 최종 v명령이 하나씩 바뀌지 만 코드의 주요 흐름은 바뀌지 않습니다. 첫 번째를 삭제하는 <것은 약간 다릅니다.이 경우 실행 경로는 첫 번째 줄의 왼쪽에서 오른쪽 페이로드로 직접 흐릅니다.

다른 특별한 경우는 줄 바꿈을 제거하는 것입니다. 코드가 줄의 끝 부분을 감쌀 때, 이제는 두 번째 줄의 끝이되었습니다. #오른쪽 에서 명령을 만나면 오른쪽으로 이동 >하여 오른쪽에서 왼쪽으로 페이로드로 바로 이어집니다.

의심의 여지가있는 경우, 나는 또한 perl 스크립트로 테스트했으며 "0 실패 (63 실패)"를 확인했습니다.


0

Gol> <> , 점수 0, 38 바이트

<<H"Hello, world!"/
H"Hello, world!" <

도전 후에 언어가 풀려납니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.