노란 나무로 갈라진 두 개의 도로 (1 부)


14

이것은 시리즈의 첫 번째이고, 두 번째는 노란 나무로 갈라진 두 개의 도로입니다 (2 부).

이 도전은 Robert Frost의 유명한 시인 "The Road Not Taken"에서 영감을 얻었습니다.

두 도로 노란 나무에 갈라
그리고 미안해 모두 여행 할 수없는
긴 내가 서서, 그리고 한 여행자 수
그리고 내가 할 수있는대로 멀리로 하나 아래로 보였다
는 덤불에 구부러진 곳으로;

그런 다음 공정한 것처럼 다른 쪽
을 택했고 아마도 더 좋은 주장을했을
것입니다.
그 통과는
실제로 거의 같은 것을 착용 했지만

그리고 그날 아침 똑같이
잎이 깔려있었습니다.
아, 나는 또 다른 날을 위해 처음을 지켰다!
그러나 어떻게 길을 가는지 알면서도
다시 돌아올 것인지 의심했습니다.

나는 한숨을 쉬며
어딘가에 이것을 말해 줄 것이다. 그래서
두 개의 도로가 나무로 갈라져 나갔다. 그리고 나는 —
덜 여행 한 길을 택했다.
그리고 그것은 모든 차이를 만들었다.

두 번째 행부터 마지막 ​​행까지 주목하십시오 I took the one less traveled by,.

당신의 실제 도전

다음과 같은 형식으로 입력을받습니다.

#     ##
 #   ##
  # ##
   #
   #
   #

가는 길을 찾아야합니다

도로는 맨 아래에서로 시작합니다 #. 항상 맨 위 줄에서 끝나는 다른 2 개의 도로는 점검해야 할 도로입니다. 가장 두꺼운 도로가 가장 많이 이동하므로 원하는 것이 아닙니다. 다른 하나는 여행이 가장 적으며 원하는 것입니다.

산출

프로그램 / 기능은 취하지 않은 도로의 가능한 위치마다 하나씩 2 개의 고유 한 값 중 하나 (예 : 0 또는 1, true 또는 false)를 출력해야합니다. 예를 들어, 도로를 타지 않은 도로가 도로의 왼쪽에 있으면 0을, 그렇지 않으면 1을 출력하거나 문자열 "left"또는 "right", true, false 등을 출력 할 수 있습니다.

테스트 사례 :

 ##    #
  ##  #
   ###
    #
    #
    #

"오른쪽"을 출력 할 수 있습니다.

 ##  #   
  ## #  
   ###
    ##
     #
     #
     #

"오른쪽"을 출력 할 수 있습니다.

 ##  #   
  ## #  
   ###
    ##
   # 
  #  
 #   

"오른쪽"을 출력 할 수 있습니다.

 ##   #  
  ## #  
   ###
    #
   # 
  #  
  #  

"오른쪽"을 출력 할 수 있습니다.

 #    ## 
  #  ## 
   ###
    #
   # 
  #  
  #  

"왼쪽"출력 가능

 #    ## 
  #  ## 
   ###
    #
     #
     #
     #

"왼쪽"출력 가능

노트

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
  • 금지 된 표준 허점
  • "왼쪽"과 "오른쪽"에 대한 출력을 지정해야하며 고유해야합니다.
  • 입력은 하나의 큰 문자열이 될 것이며 어떤 줄이라도 가질 수 있습니다
  • 유효한 입력에 대해 걱정할 필요가 없습니다.
  • 도로는 항상 Y 자형이므로 맨 위에서 만 봐야합니다.
  • 질문이 있습니까? 아래의 코멘트 :

가장 낮은 바이트 수가 이깁니다!


1
예, 항상 #과 ##과 수평 단면.
programmer5000

1
내가 아니 었어 나는 그것을 아주 좋아한다. 잘 정의되고 좋은 뒷이야기와 명확한 예. 꽤 쉽게 할 수 있으며 모호한 언어를 초대한다는 아이디어는 맛을 더할 뿐이며 흥미로운 답변을 장려 할 수 있다고 생각합니다.
ElPedro

1
IBM / Lotus Notes 공식 언어 및 Acc !! 응답은 모호한 언어를 쉬운 질문에 초대하여 흥미로운 결과를 얻는 방법을 보여줍니다.
programmer5000

3
난 그냥 자신에게 말하고 있었다 : "당신은 당신이 생각할 때 도전은 간단 알고, '이봐,이에 쉬운 것입니다 도 Acc! '";)
DLosc

22
@ programmer5000 : 나는 downvoters 중 하나입니다. (A)의 그것의 무언가 때문에 나는 도전을 downvoted 카멜레온 도전 배경의 많은이 (가 구문 분석하거나 도로를 측정에 대해,하지만 실제로 그것은 단지처럼 보이는 점에서 "공간에 분할, 첫 번째 섹션을") 만 접선의 그 관련되고 여전히 도전을 가려주는 것; 그리고 매우 쉬우므로 (일반적으로 저를 도전 과제로 만드는 것). 또한 불완전하게 지정되어 있습니다 (예 : 입력이 1과 2 이외의 너비를 가질 수 있습니까?)

답변:



18

자바 스크립트 (ES6), 19 12 바이트

편집하다:

더 골프 버전은

a=>a.trim[1]

#오른쪽과 공백을 반환 합니다.

기발한:

a=>a.trim()[1]=='#'

설명

언 골프 :

function(input) {
  return input.trim().charAt(1) === '#';
};

이 기능이 가장 먼저하는 일은 입력의 시작과 끝에서 공백을 제거하는 것입니다. 이것은 첫 번째 문자가 항상임을 의미합니다 #. 그런 다음 두 번째 문자 (JavaScript는 0에서 시작)를 확인하고 #문자 인지 확인하십시오 . 부울을 반환합니다. 경로 인 경우 right가있을 것입니다 true이 남아 있으면, 그것을 돌려줍니다 false.

어떻게 골프를 쳤는가

ES6에는 화살표 함수 라는 익명 함수 속기가 있습니다 . 이것은 래퍼 기능을 가져 와서 다음으로 바꿀 수 있음을 의미합니다.

input => ...;

화살표 함수의 규칙으로 인해 나머지 코드를 반환합니다. 거기에서 나는 변환 charAt(1)[1]비록 그것이 짧은 방법으로 권장되지 않습니다 . 그럼 갔다 ===와로를 돌렸다 ==. 이 경우 에는 다르지만 중요하지 않습니다. 마지막으로 모든 공백으로 이름 input을 바꾸고 a제거했습니다.

좌우로 출력

퍼즐은 실제로 좌우로 출력하는 프로그램이 필요하지 않지만, 다른 출력의 예는 다음과 같습니다.

a=>a.trim()[1]=='#'?'right':'left'

유일하게 추가 된 부분은 ?'right':'left'입니다. 이렇게하면 압축 된 if 문인 삼항 연산자 가 생성 됩니다. 즉, (ungolfed) 코드가 *와 같습니다.

function(input) {
  let output = input.trim().charAt(1) === '#';
  if(output) {
    return 'right';
  } else {
    return 'left'
  }
};

// Function assignment not counted in byte count
let f =
a=>a.trim()[1]=='#'
<textarea placeholder="Put path in here" id="path" rows="10" style="width:100%"></textarea>
<button onclick="document.getElementById('result').textContent = f(document.getElementById('path').value)">Submit</button>
<p id="result"></p>


3
사이트에 오신 것을 환영합니다! 좋은 설명과 발췌 문장은 매우 철저한 첫 번째 대답입니다. :)
James

2
감사. 나는 한동안 코드 골프를 서핑하고 마침내 그것을 만들기로 결정했습니다. StackOverflow가 저를 문지르고 있다고 가정하십시오.
David Archibald

1
와, 완전히 아웃 고프!
programmer5000

1
정말 멋진 접근법입니다. 그 생각은하지 않았습니다.
ElPedro

1
@ programmer5000이 응답하자마자 편집하겠습니다. 좋은 생각이야, 고마워
David Archibald


10

Acc !!, 30 바이트

Acc! 입력을 받으면 단 한 줄의 입력 만 입력하면 출력이 제공됩니다. 그러나 입력을 파이프로 보내거나 파일에서 리디렉션하면 차이점을 알 수 없습니다.

Count i while 35-N {
}
Write N

stdin에서 입력을받습니다. 왼쪽 도로가 덜 이동 한 경우 또는 #오른쪽 도로가 덜 이동 한 경우 출력 합니다 . 온라인으로 사용해보십시오!

설명

N참조 될 때마다 stdin에서 문자의 ASCII 값을 읽습니다. 우리 35-N는 진실 하면서 반복합니다. 즉, 35-N != 0또는 N != 35. 따라서 루프가 종료되면 #라인 의 첫 번째 문자를 읽었습니다 . 다음 문자는로 읽고 Nstdout으로 다시 쓴다 Write.


와! 또 다른 모호한 언어 ...
programmer5000

7
@ programmer5000 불분명 한 프로그래밍 언어를 원한다면 올바른 사이트를 방문한 것입니다. ;)
DLosc

Acc!는 어디에서 실행할 수 있습니까? GitHub 링크, Tio 또는 기타가 있습니까?
programmer5000

@ programmer5000 파이썬 3 소스 코드는 헤더에 링크 된 게시물에 있지만 TIO 링크를 함께 묶을 수 있는지 볼 수 있습니다.
DLosc

@ programmer5000 답변에 TIO 링크가 추가되었습니다.
DLosc

8

레티 나, 5 바이트

왼쪽 1이면 오른쪽이면 출력 합니다 0.

^ *##

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


긍정적 인 결과 값이 고유하지 않아도되는 경우 (5 바이트) :

오른쪽이면 양의 정수를, 왼쪽이면 0을 출력합니다.

## +#

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


1
와! 어떻게 작동합니까? 설명을 위해 답을 수정 하시겠습니까?
programmer5000

1
@ programmer5000 일치하는 정규 표현식과 비교하여 입력을 테스트합니다.
mbomb007

6

IBM / Lotus Notes 공식 언어, 37 35 26 바이트

편집 나는 항상 @Like와일드 카드 를 사용하는 것보다 2 바이트 저렴하다는 것을 잊어 버립니다 @Contains.

편집 2는 실제로 필요하지 않습니다 @if그것은 단지 인쇄로 1또는 0수식 결과 여부에 따라 @True또는 @False.

@Like(@Left(a;"##");"%#%")

계산 된 필드 수식. ##필드에서 찾은 첫 번째 필드 의 왼쪽으로 모든 것을 가져 가면 왼쪽에 대한 출력 a이 있고 그렇지 않으면 오른쪽에 대한 출력 이 있습니다.#10

enter image description here

enter image description here

@DavidArchibald 덕분에 22 바이트 솔루션이 있습니다. Davids 솔루션에 대한 존중에서 나는 그것을 주요 대답으로 게시하지 않을 것입니다.

@Left(@Trim(a);2)="##"

이것은 1오른쪽과 0왼쪽으로 출력 됩니다 .


와! 아주 모호한 언어! 더 좋은 답변이 곧 오지 않으면 받아 들여질 수 있습니다 ...
programmer5000

1
내가 젊었을 때 (
었다.

4

, 8 6 바이트

a~`#+`

입력을 명령 행 인수로 사용합니다 (실제 명령 행에서 실행될 때 줄 바꾸기를 인용하고 이스케이프해야 함). 출력 #왼쪽 도로가 덜 여행하는 경우, 그리고 ##오른쪽 도로가 작은 경우 여행했다. 온라인으로 사용해보십시오!

설명

Pip의 최근에 추가 된 정규식 첫 번째 일치 연산자를 사용합니다.

a         First cmdline arg
 ~        Regex match the first instance of...
  `#+`    ...one or more #s (i.e. a cross-section of the left-hand road)
          Print (implicit)

간단한 정규식 솔루션 ( mbomb007의 Retina answer 포트 )은 9 바이트입니다.

`^ +##`Na

바이트 수로 명령 줄 인수를 세었습니까?
programmer5000

@ programmer5000 명령 줄 인수를 통해 입력을받는 것은 기본적으로 허용되는 입력 방법이며 Pip가 입력되는 일반적인 방법입니다. 바이트 페널티는 비표준 명령 행 플래그에 적용되며 ,이 제출에서는 사용하지 않습니다. 즉,이 특별한 경우 에는를 a로 변경하고 대신 stdin에서 입력을 얻을 있습니다 . aq
DLosc

오. 나는 이해하지 못했다.
programmer5000

4

, 7 바이트

AZ~S
at

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

0x0왼쪽과 0x1오른쪽에 대한 출력 . TIO에는 플래그가 포함되어 -v있으므로 stderr에서 이진 값을 볼 수 있습니다. ASCII로 출력을 보려면e*f 수 있습니다. 첫 번째 행의 끝에 추가 할 수 있습니다.)

칩은 바이트 스트림 내의 개별 비트에서 작동하므로 실제로이 특정 문제를 상당히 잘 처리합니다.

A는 입력 바이트의 최하위 비트이며 '#'은이 비트가 설정되는 입력의 유일한 문자입니다. 이 비트가 처음 발견되면 첫 번째 줄의 첫 번째 '#'에 도달했습니다.

Z 한 사이클 동안 그 신호를 지연시켜 다음 문자를보고 있습니다.

t이 활성화되었습니다. 이는이주기가 완료된 후 실행을 종료하는 것을 의미합니다. 첫 번째 도로의 너비보다 더 멀리 볼 필요는 없습니다.

~S마지막주기를 제외한 모든주기의 출력을 억제합니다. 이것이 여기에 없다면, 우리는 모든주기에서 출력을 얻을 것입니다.

a이웃의 현재 값 ( A이 경우 에만 )을 출력 바이트의 최하위 비트에 넣습니다 .

이 모든 0x1것은 첫 번째 '#'바로 다음에 또 다른 '#'이 오면 0x0그렇지 않으면 그렇지 않다는 것을 의미합니다.


4

C, 35 바이트

f(char*s){while(35^*s++);return*s;}

PragmaticProgrammer의 답변 과 같은 아이디어 : 첫 번째를 찾아서 "오른쪽"과 "왼쪽"에 대한 #결과를 출력하십시오 .#<space>

C (루프 홀), 16 바이트

테스트 사례에 따르면 왼쪽 도로는 항상 왼쪽 여백에서 정확히 한 칸인 것처럼 보입니다. 그래서...

#define f(s)2[s]

허점은 의도되지 않았으며, 테스트 사례가 잘못되었습니다. 그러나 C 답변은 인상적입니다!
programmer5000

3

배치, 46 바이트

@set/ps=
@for %%a in (%s%)do @echo %%a&exit/b

STDIN에서 한 줄을 읽고 공백으로 나누고 첫 단어를 인쇄하므로 #왼쪽과 ##오른쪽으로 출력 됩니다 . 인용 된 명령 행 매개 변수 배열이 허용되는 경우 36 바이트입니다.

@for %%a in (%~1)do @echo %%a&exit/b

공백으로 나뉘어 첫 번째 단어를 인쇄하도록 첫 번째 인수의 인용을 해제합니다.




3

하스켈, 21 바이트

f n=snd$span(==' ')n!!1

또는 포인트 프리 스타일로 :

(!!1).snd.span(' '==)

"#"는 오른쪽을 의미하고 ""는 왼쪽을 의미

이 함수는 문자열을 가져 와서 시작 공백을 뺀 다음 두 번째 문자 (왼쪽이 마른 경우 공백, 왼쪽이 두꺼운 경우 #)를 취합니다.

편집 : Laikoni와 nimi 덕분에 3 바이트를 절약했습니다!


익명 함수도 허용되므로 (!!2).dropWhile(' '==)답으로 충분합니다.
Laikoni

그것은의 !!12 요소. 테스트를로 단축 할 수 있습니다 <'!'. pointfree 버전에서는 교체 할 수 있습니다 dropWhilesnd.span.
nimi

2

Brainfuck, 32 바이트

+[>,>+++++[<------>-]<--[,.>>]<]

언 골프 드 :

+[                       while 1
>,>+++++[<------>-]<--     3 if hash; 0 if space
[,.>>]                     print next char and break iff current char is hash
<]

#오른쪽과 왼쪽에 인쇄 합니다 .

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


2

펄 5 , 8 + 1 = 9 바이트

die$F[0]

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

로 실행 -a(1 바이트 페널티)로 .

출력은 (여기서 filename# at filename line 1, <> line 1왼쪽 도로가 덜 이동 한 경우 은 스크립트의 파일 이름입니다.)## at filename line 1, <> line 1 오른쪽 도로가 덜 이동 된 경우 .

설명

-a옵션은 입력을 자동으로 읽고 공백 주위의 열로 분할하여 선행 공백을 무시합니다. 따라서 첫 번째 입력 기준은 우리가 필요로하는 것입니다. 입니다 $F[0]. 또한 우리가 원하지 않는 암시 적 루프에 프로그램을 넣습니다. 그러나를 사용 die하면 문자열을 출력하고 암시 적 루프를 동시에 종료 할 수 있습니다 (문자를 더 많이 사용 say하여 문자열을 인쇄하는 가장 일반적인 방법).


창의력과 적은 바이트 수! 불행히도 이미 2 바이트 답변이 있습니다. 이 시리즈세 번째 도전에 관심 있습니까?
programmer5000

2
@ programmer5000 : Perl에는 2 바이트 답변이 없다고 생각합니다 (실제로 이것이 골프가 아닌 언어로 가장 짧은 답변입니다). 일반적으로, 우리는 각 언어 / 각 접근 방식을 통해 최상의 솔루션을 찾는 것을 목표로합니다. 그렇지 않으면 골프 언어 이외의 다른 것을 사용할 필요가 없습니다.

2

C 54 바이트

char*strchr();char c(char*s){return*(strchr(s,35)+1);}

C ++ 58 바이트

#include<cstring>
char c(char*s){return*(strchr(s,35)+1);}

OP가 지정했기 때문에 "프로그램 / 기능"일 수 있습니다. 문자를 저장하는 기능을 작성하기로 선택했습니다. 그러나 함수를 컴파일하는 데 필요한 문자 수에는 "#include"문과 줄 바꿈이 포함되어 있습니다.

산출

" "왼쪽을 나타내는 공백 문자 또는 "#"오른쪽을 나타내는 해시 문자를 반환합니다 .

설명

strchr () 함수는 주어진 문자열을 이동하고 지정된 문자가 처음 나타나는 포인터를 반환합니다. 그것은 하나의 문자를 저장하는 문자가 아닌 두 번째 인수로 정수를 허용하는 과부하를 가지고 있습니다. 예를 들어 '#'은 35로 대체 될 수 있습니다. 그런 다음 함수에서 반환 된 포인터에 하나를 추가하여 문자 바로 다음에 문자를 가져 와서 역 참조한 다음 결과 문자를 반환합니다.

노트

또한이 기회를 통해 골프를하려고 할 때 코드를 자동 형식화하는 Visual Studio에서 내 성가심을 공식적으로 표현하고 싶습니다 (╯ ° □ °) ╯︵ ┻━┻.

편집 : C와 C ++의 차이점과 문자 <3을 저장할 수있는 위치를 지적한 Ray 에게 감사드립니다 .


C / C ++는 언어가 아닙니다. C와 C ++에 다른 의미를 갖는 표현이 있습니다. 예를 들어, C ++에서 함수에 빈 매개 변수 목록이 있으면 인수가 없다는 의미입니다. C에서는 매개 변수가 지정되지 않았 음을 의미합니다. 그래서 당신이 결정하는 경우에 이것은 C 프로그램입니다, 당신은 대체 할 수 #include <string.h>\n와 함께 char*strchr();여전히 완벽하게 합법적하면서 6 바이트를 저장합니다. (당신이 어떤 이유 ++ C를 선호하는 경우, 당신은 대체 할 수 #include <string.h>#include <cstring>1 바이트 저장합니다.)
레이

흥미 롭습니다. 답변을 업데이트했습니다. 감사합니다.
PragmaticProgrammer

1

자바 스크립트 (ES6), 37 바이트

p=s=>/^ *#( |$)/.test(s.split("\n")[0])

설명:

p 반환하는 함수입니다 true이동량이 적은 도로가 왼쪽에 있으면 하고 그렇지 않으면 false 인 . 이것은이 사이트의 첫 번째 답변이므로 골프를 더 많이 할 수 있습니다 (정규식 일 수도 있습니다).

입력의 맨 윗줄을 가져 와서 정규식 /^ *#( |$)/(문자열 시작, 공백, # 및 공백 또는 문자열 끝)과 일치하는지 확인하여 작동 합니다.

이는 사람들에게 형식에 대한 설명을 제공하고 아이디어를 생성하기위한 것입니다. 이길 수 있고 더 골프를 칠 수 있다고 확신합니다. 행복한 골프!

p=s=>/^ *#[^#]/.test(s.split("\n")[0])
<textarea rows = "8" cols = "8" oninput = "console.log(p(this.value))"></textarea>


공간 대신 ​​공간을 가질 수 있다고 생각합니다.[^#]
user41805

정규식 문제를 수정했습니다.
programmer5000

더 짧은 자바 스크립트 답변을 만들었습니다 .
David Archibald


1

Excel, 17 바이트

=left(trim(A1),2)

cell에 입력을 가정합니다 A1.

##오른쪽 및 #( #및 공백)을 왼쪽으로 반환 합니다 .


1

Dyvil , 12 바이트

s=>s.trim[1]

설명:

s=>          // lambda expression
   s.trim    // removes leading (and trailing) whitespace
         [1] // gets the second character

용법:

let f: String -> char = s=>s.trim[1]
print f('...')

왼쪽과 #오른쪽에 대해 (공백)을 반환합니다 .


1

자바 7, 166 66 63 52 43 바이트

int c(String s){return s.trim().charAt(1);}

35오른쪽과 32왼쪽에 대한 출력 . @Clashsoft 의 Dyvil 답변
기반 합니다.

설명:

int c(String s){   // Method with String parameter and integer return-type
  return s.trim()  //  Remove leading and trailing whitspaces
   .charAt(1);     //  and return the second character (as int value)
}                  // End of method

테스트 코드 :

class M{
  static int c(String s){return s.trim().charAt(1);}

  public static void main(String[] a){
    System.out.println(c(" ##    #\n  ##  #\n   ###\n    #\n    #\n    #"));
    System.out.println(c(" ##  #   \n  ## #  \n   ###\n    ##\n     #\n     #\n     #"));
    System.out.println(c(" ##  #   \n  ## #  \n   ###\n    ##\n   # \n  #  \n #   "));
    System.out.println(c(" ##   #  \n  ## #  \n   ###\n    #\n   # \n  #  \n  #  "));
    System.out.println(c(" #    ## \n  #  ## \n   ###\n    #\n   # \n  #  \n  #  "));
    System.out.println(c(" #    ## \n  #  ## \n   ###\n    #\n     #\n     #\n     #"));
  }
}

여기에서 시도하십시오.

산출:

35
35
35
35
32
32

0

Befunge 98, 11 바이트

-!jv~'
@.~<

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

하나의 후행 공백으로 32왼쪽과 35오른쪽에 모두 인쇄 합니다.

설명

-!jv      This is a no-op the first time through, but used later

    ~'    Pushes the ASCII value of the next character, and pushes 32
-!        Subtracts the 2, and nots. If the character was a space, the top will be 1
  jv      Goes to the second line if the character was not a space

  ~<      Pushes the next characer's ASCII value
 .        Prints it (32 for " " and 35 for "#")
@         Ends the program

내가 사용한 트릭 -!jv은 아무것도하지 않았지만 첫 번째 트릭이었습니다 . 이렇게하면 공간을 제거 '하고 패딩을 저장했습니다. 마지막으로 코드는

~' -!jv
   @.~<

15 바이트


0

루비, 20 바이트

->r{r.strip[1]==' '}

왼쪽은 true, 오른쪽은 false를 반환합니다.

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