그림과 접지


32

그림과 땅
출처 : Wikipedia

이 문제를 해결 하려면 위 이미지 의 그림과 배경 과 유사한 두 개의 프로그램을 작성하여 하나는 인쇄 figure하고 다른 하나는 인쇄해야 합니다 ground. 구체적으로 :

  1. 입력을받지 않고 문자열을 인쇄하는 프로그램을 작성하십시오 figure. 프로그램에서 허용되는 공백 문자 는 공백 (코드 포인트 0x20)과 줄 바꿈 (캐리지 리턴, 0x0D, 줄 바꿈, 0x0A 또는이 둘의 조합)입니다.
  2. 줄 바꿈을 무시하고 공백 문자 (코드 포인트 0x20)와 공백이 아닌 문자의 수는 같아야합니다. 예를 들어, 이것은 유효한 프로그램입니다 (가설 ​​적 언어로).

    ab c 
       d
    e f
    

    첫 줄에는 후행 공백이 있습니다.

  3. n 번째 공백 문자를 공백이 아닌 n 번째 문자로 바꾸면 프로그램이 ground대신 인쇄되어야 합니다. 위의 예에서 프로그램은 다음과 같습니다.

      a b
    cde 
     f 
    

    두 번째와 세 번째 줄에는 후행 공백이 있습니다.

양쪽 그림접지 솔루션은 STDOUT로 인쇄 같은 언어로 전체 프로그램이어야한다. 두 경우 모두 하나의 선택적 후행 줄 바꿈을 인쇄 할 수 있습니다. STDOUT이 올바른 한 STDERR에 원하는 것을 출력 할 수 있습니다.

모든 프로그래밍 언어를 사용할 수 있지만 이러한 허점 은 기본적으로 금지되어 있습니다.

이것은 이므로 바이트 단위로 측정 된 가장 짧은 유효한 답변이 이깁니다.

도우미 스크립트

이 CJam 스크립트 를 사용 하여 그림지면 프로그램 사이를 변환 할 수 있습니다 . 둘 중 하나를 입력 필드에 붙여 넣기 만하면 프로그램이 실행됩니다. 또한 공간 수와 비 공백 수가 일치하지 않는지 알려줍니다.

리더 보드

답변:


20

젤리 , 20 바이트

그림

“¦ĠȮ“©ụd» Ṃ         

9 개의 후행 공백. 온라인으로 사용해보십시오!

바닥

         “ ¦ĠȮ“©ụd»Ṃ

후행 공백이 없습니다. 온라인으로 사용해보십시오!

작동 원리

첫째, 공백은 원자가 아니므로 문자열 리터럴 외부의 공백 문자는 프로그램에 영향을 미치지 않습니다.

문자열 리터럴은 Jelly의 내장 사전 기반 문자열 압축 을 사용하여 원하는 단어를 생성합니다. 압축 된 문자열의 문자로 시작 하여, 단부 », 및 사용 문자열의 배열을 생성하기 위해 내부적.

에서는 프로그램 “¦ĠȮ“©ụd»문자열 수득 쌍 ( "인물", "바닥") 및 원자 선택하는 사전적인 최소값, 즉, "그림" .

지상 프로그램에서는 대신 “ ¦ĠȮ“©ụd»문자열 쌍 ( "logicallyAbacs", "ground")이 생성 됩니다. 사전 최소값은 이제 "ground" 이며 이는 엄밀히 선택됩니다.

두 경우 모두 인터프리터는 마지막 반환 값 (즉, 선택된 최소값)을 STDOUT에 자동으로 인쇄합니다.


14

파이썬 2, 53 바이트

교체 ·두 답변의 공간 :

····················
print'······figureground'[6:12]#

인쇄 figure합니다.

print'figureground'[
······6:12]#····················

인쇄 ground합니다.


14

05AB1E , 15 14 바이트

그림

 'ŠÂ,'í¶      

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

바닥

'       ŠÂ,'í¶

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

CP-1252 인코딩을 사용합니다 . 후행 공백에 유의하십시오. 에서 그림 프로그램이 오류없이 정상 프로그램입니다. 다음 단어를 압축 해제합니다.

'ŠÂ  ->  figure
'í¶  ->  ground

쉼표는 팝을 인쇄하고 figure줄 바꿈으로 단어를 인쇄합니다 . 무언가가 인쇄되었으므로 더 이상 스택 상단이 인쇄되지 않습니다.

접지 프로그램,이 경우에 편리합니다 몇 가지 오류가 있습니다. 다음 부분 :

'<space>

스택 맨 위에 공백 문자를 넣습니다. 는 Š인수에 대응 갖는 스택, 회전 3 . 스택에 요소가 하나만 있고 입력이 없으므로 스택을 지우는 예외가 발생합니다. 은 Â스택의 상단을 두 갈래 있지만, 이것은 회전 연산자와 같은 스토리를 갖는다. 따라서 기본적으로 ,명령은 아무것도 인쇄하지 않습니다.

즉, 프로그램은 여전히 ​​스택의 맨 위에있는을 출력합니다 'í¶. 로 결과 ground.


9

망막 , 31 바이트

그림:

|       
그림
 | 지상
      

바닥:

 | 그림

|       
바닥

그림접지 . 두 프로그램 모두 유효한 도형 또는 지상 프로그램이 되려면 STDIN을 비워 두어야합니다.


9

Pyth, 30 바이트

그림

"figure" "ground              

14 개의 후행 공백.

테스트

바닥

후행 공백이 없습니다.

        "       figure""ground

테스트

작동 원리

오히려 유용하게도 공백은 Pyth에서 인쇄를 억제하는 반면 문자열 리터럴은 닫히지 않습니다. " 이 은 암시 적으로 닫힙니다.

제 프로그램 따라서 두 문자열로 구성 "figure"하고 "ground ". 첫 번째 문자열은 암시 적으로 인쇄되고 두 번째 문자열의 인쇄는 억제 figure되어 인쇄됩니다.

두번째 프로그램은 두 개의 문자열로 구성 " figure"하고 "ground". 첫 번째의 인쇄는 억제되고 두 번째의 인쇄는 암시 적으로 인쇄됩니다. 즉, ground인쇄 만됩니다.


6

MATL , 37 바이트

첫 번째 프로그램

'figure'         
%x'ground'         

각 줄에는 9 개의 후행 공백이 있습니다.

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

두 번째 프로그램

    'figure'%
      x'ground'

여기에는 통행 공간이 없습니다.

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

설명

정말 멋진 것은 없습니다 ...

  • 문 사이의 공백과 줄 바꾸기는 MATL에 의해 무시됩니다.
  • % 주석 줄이며 나머지 줄은 무시합니다.
  • x 스택의 상단을 삭제합니다.
  • 스택은 프로그램 끝에서 암시 적으로 인쇄됩니다.

6

자바, 180 바이트

.공간으로 교체하십시오 .

"그림"을 인쇄합니다.

class
A{public
static
void
main(String[]a){System.out.println(
//"ground"
//
.....
........
......
....
...................................
..
........
..........
....
"figure");}}

"접지"를 인쇄합니다.

.....
........
......
....
...................................
..........
..
class
A{public
static
void
main(String[]a){System.out.println(
//
"ground"
//"figure"
);}}
............


4

매스 매 티카, 50 34 바이트

REPL 환경을 사용합니다. ( Print[]같은 수의 공백이 있는 랩퍼를 추가 하면 바이트 수가 14 증가합니다.) 두 프로그램은 다음과 같습니다.

01figure+0 1ground                

(후행 공백 16 개) 및

          0       1figure+01ground

여기서 핵심은 Mathematica는 공백이없는 숫자 연결을 단일 숫자로 취급하지만 숫자와 임의의 변수 이름의 연결과 같이 중간 공백은 이웃 곱셈으로 해석된다는 것입니다. 에 첫 번째 표현식 평가하여 지금 1*figure+0*1*ground이다 figure; 제 표현식 평가 0*1*figure+1*groundground.


4

PHP, 44 42 바이트

그림 : (16 개의 후행 공백, 그림과; 사이의 5 공백)

echo''?ground:figure     ;                 

지상 : (20 개의 주요 공간)

                     echo' '?ground:figure;

정말 간단 합니다. ''거짓 이기 때문에 ' '사실입니다. 다음과 같이 사용하십시오.

php -r "echo''?ground:figure     ;                "
php -r "                    echo' '?ground:figure;"

편집 : Martin Ender 덕분에 후 향적으로 명백한 2 바이트 절약


3

하스켈, 96 94 88 82 77 바이트

첫 번째 프로그램, 인쇄 "figure":

main              =          putStr$idid"ground"
idid    _          ="figure"

두 번째 프로그램, 인쇄 "ground":

    main=putStr$id id"ground"                   
    idid _="figure"         

서로 다른 명명 된 상수 함수 중 하나를 호출합니다.


3

하스켈, 88 65 바이트

main=putStr
...........--
.."figure"..........
--"ground"........

...........
main=putStr..
--........"figure"--
.........."ground"

.공백을 나타냅니다. --저글링 한 줄 주석 (-> ).


3

파이썬 2, 52 바이트

........................
print"figure"
an
d
"ground"

.s는 공백을 나타냅니다. 마지막 3 줄은 SyntaxError코드가 처음부터 실행되지 못하게 하는 오류없이 분할됩니다 .

그라운드 버전은 and 은 두 번째 문자열을 인쇄하는 합니다.


대체 (더 긴) 시도 :

.......
print(#"ground")#
"figure")...................


print"figure"""and"ground"
.............
.............

3

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

alert('figure'
                //&&'ground'
           )
              
alert('figure'//            
&&'ground') 

그림에는 후행 공백이 없습니다.


줄 바꿈이 계산되지 않으면 각 프로그램에 대해 56 바이트를 계산합니다. 나는 그것이 더 짧아 질지 의심합니다.
ETHproductions

@ETHproductions Ugh, 그것은 바이트를 수동으로 계산할 때 일어나는 일입니다 :-(
Neil

2

레일 , 56 바이트

그림

$'main'
 -[figure]o                
-          [ground]o

두 번째 줄에는 16 개의 후행 공백이 있습니다. 프로그램이 오류와 함께 종료됩니다.

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

바닥

       
$ '메인'-[그림] o
 -[접지] o         

첫 번째 줄에는 7 개의 공백이 있고 마지막 줄에는 9 개의 공백이 있습니다. 이 프로그램은 또한 오류와 함께 종료됩니다.

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

설명

Rail은 (정규 표기법) \$.*'main'으로 시작 하여 진입 점을 찾는 줄 을 찾습니다. 열차 (지시 포인터)는 $남동 에서 출발하여 시작됩니다 . 기차로 접근 할 수없는 것은 프로그램에서 완전히 무시할 수 있습니다. 여기에는 진입 점과 같은 줄에있는 것이 포함됩니다. 는 이후 -의 남동쪽 $바로 동쪽 기차를 회전, 두 프로그램은 단순히 감소 :

 -[figure]o
 -[ground]o

[...]문자열 리터럴을 표시하고 o인쇄합니다. 일반적으로 #레일을 끝내려면 a 가 필요 하지만 생략하면 프로그램이 종료됩니다 (그러나 STDERR에서 열차가 추락했다고 불평합니다).


2

> <> , 39 바이트

·공백을 나타내는 데 사용 합니다.

그림

v·
"·dnuo
e·
r·
u·
g··
i··
f···
"·
>·o·

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

바닥

·v
·"····
·d
·n
·u
·oe
·ru
·gif
·"
·>·o

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

두 프로그램 모두 오류와 함께 종료됩니다.

설명

수직으로 코드를 작성함으로써, 나는 재사용 할 수 있었다 g과를 r따옴표뿐만 아니라, 두 솔루션 사이와 >o출력 루프.

두 경우 모두, 실행되는 유일한 비트는 아래의 열 v이며, 필요한 단어의 문자를 스택에 역순으로 푸시합니다. 그런 다음 >명령 포인터를 오른쪽으로 리디렉션하고을 반복 o하여 스택이 비워 질 때까지 문자를 인쇄합니다.


방금 제 자신의> <> 버전으로 작업을 시작한 후 나는 당신을 만났습니다. 나는 당신이 수직으로 일한다는 아이디어를 정말로 좋아합니다 (광산은 매우 '정상적입니다').
청록 펠리컨

@Tealpelican 나는 핵분열 해답을 풀 때까지 이것을 생각해 냈습니다. 그 전에 내 최고의> <> 솔루션은 42 바이트였습니다 !__|"druong">o<"figure"( _공백은 어디에 있고 나머지 공간은 단순히 줄의 끝 부분에 있습니다).
마틴 엔더

가장 짧은 현재 버전은 다음과 같습니다. ## "de nr uu og og ri GF"> o! ~ ~! <## 42 바이트도 재미있다! 이전 버전에서는 오류 검사가 있었지만 53 바이트로 줄일 수있었습니다.
청록 펠리컨

2

분열 , 37 바이트

·공백을 나타내는 데 사용 합니다.

그림

D·
"···
f··
i··
g·
u·
r·
e·ound
"·
;·

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

바닥

·D
·"fi
·gu
·re
·o
·u
·n
·d····
·"
·;

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

설명

기본적으로 내> <> 답변 과 동일하게 작동합니다 (실제로 이것을 먼저 찾았지만). 유일한 차이점은 "Fission에서 문자를 즉시 ​​인쇄 한다는 점입니다 . 단어가 거꾸로 쓰여지지 않은 이유와 ;마지막에 프로그램을 종료해야하는 이유 입니다.


1

망상, 46 바이트

                      "ground""figure"" "?$$o;

온라인으로 사용해보십시오! 이 인쇄 ground됩니다.

"ground""figure"""?$$o                 ;      

온라인으로 사용해보십시오! 이 인쇄 figure됩니다.

바닥

관련 코드 :

"ground""figure"" "?$$o;
................          push these two strings
                " "?$     pop " " off (since " " is truthy, `?` executes `$`)
                     $    pop TOS ("figure")
                      o;  output and terminate

그림

관련 코드 :

"ground""figure"""?$$o;
................         push these two strings
                ""?$     doesn't activate
                    $    pop ""
                     o;  output and terminate

1

브라이언 & 척 , 55 53 바이트

그림

erugif?dnuorg             
}<.<.<.<.<.<.             

각 줄에는 13 개의 후행 공백이 있습니다.

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

바닥

             erugif?dnuorg
             }<.<.<.<.<.<.

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

설명

아, 내가 Brian & Chuck을 마지막으로 사용한 지 오래되었습니다. 간단히 말해, Brian과 Chuck은 서로의 소스 코드를 테이프로 사용하는 두 개의 Brainfuck과 같은 인스턴스입니다. 만 척 인쇄 명령을 사용할 수 있습니다 .,? 조건부로 두 인스턴스 사이를 전환하고,} 종류 등이다 [>]브레인 퍽있다. 알 수없는 명령은 단순히 무시됩니다.

프로그램 시작 부분의 공백은 무시되므로 두 프로그램은 거의 동일합니다. 유일한 차이점은 스위칭 명령 이후 ?명령 포인터가 다음 명령을 실행 하기 전에 이동 한다는 사실과 다릅니다 . 따라서 척 테이프의 첫 번째 명령은 항상 건너 뜁니다. 따라서 유일한 차이점은 지상 프로그램은 실행 }하지만 그림 프로그램은 실행하지 않는다는 것입니다. 코드의 작동 방식은 다음과 같습니다.

?   Switch control to Chuck.
}   GROUND PROGRAM ONLY: Move the tape head on Brian to the end of the tape.
<.  Move the tape head left and print the character there.
... Do the same another five times to print the remainder of the string.

0

WinDbg, 74 바이트

바닥

                      ea2000000"      groundfigure";;;da       2000006  L6

그림

ea2000000"groundfigure          ";;;da                  2000006       L6  

그림에는 후행 공백이 2 개 있습니다. 나는 적어도 2 또는 4 바이트가 골프를 칠 수 있어야한다고 생각합니다 ...

문자열을 메모리에 쓰고 6 개의 문자를 표시하여 작동합니다. 문자열의 문자가 재정렬되어 표시된 문자가 프로그램간에 변경됩니다.

* Ground:
ea 2000000 "      groundfigure";     * Write string "      groundfigure" starting at 2000000
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, from 2000006, ie- ground

* Figure:
ea 2000000 "groundfigure          "; * Write string "groundfigure          " to memory
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, ie- figure

산출:

0:000>                       ea2000000"      groundfigure";;;da       2000006  L6
02000006  "ground"
0:000> ea2000000"groundfigure          ";;;da                  2000006       L6  
02000006  "figure"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.