양파 프로그래밍


22

인쇄 가능한 ASCII (16 진수 코드 20 ~ 7E) 만 사용하여 4 개의 레이어로 둘러싸인 주석없이 정사각형 NxN 코어 프로그램 작성하여 (N + 8) × (N + 8) 정사각형 프로그램 (N> 0)을 만듭니다. . N = 3의 경우 레이아웃 (실제 코드로 대체 됨)은 다음과 같습니다.

44444444444
43333333334
43222222234
43211111234
4321CCC1234
4321CCC1234
4321CCC1234
43211111234
43222222234
43333333334
44444444444
  • C는 핵심 3 × 3 프로그램을 나타냅니다.
  • 1은 첫 번째 레이어를 나타내고 2는 두 번째 레이어를 나타냅니다.

프로그램은 항상 0 -1 31 -1 2 2 2stdin 또는 이와 유사한 것을 통해 공백으로 구분 된 정수 문자열을 취합니다 (일반 숫자, 따옴표 또는 괄호 또는 아무것도 아니어야 함). 출력은 레이아웃의 어떤 부분이 실행되었는지에 달려 있습니다.

프로그램을 실행하는 다섯 가지 방법이 있습니다 (줄 바꿈이 실행에 포함됨). 각각은 목록과 다른 것을 수행합니다.

  1. 핵심 만 실행하십시오.

    CCC
    CCC
    CCC
    

    입력 목록 요소의 최대 절대 값을 계산하고 CORE여러 번 새 줄에 인쇄합니다 . 최대 값이 0이면 아무것도 출력되지 않습니다 (개행은 괜찮습니다).

    • 에 대한 출력 0 -1 31 -1 2 2 2될 것이다

      CORE
      CORE
      ...
      

      31 번

  2. 레이어 1로 코어를 실행하십시오.

    11111
    1CCC1
    1CCC1
    1CCC1
    11111
    

    그러면 목록 값 의 평균 ( 산술 평균 )이 표준 부동 소수점 정밀도로 출력됩니다.

    • 에 대한 출력은 0 -1 31 -1 2 2 235 / 7 = 5( 5.0괜찮습니다)입니다.
  3. 레이어 1과 2로 코어를 실행하십시오.

    2222222
    2111112
    21CCC12
    21CCC12
    21CCC12
    2111112
    2222222
    

    입력 목록의 공백으로 구분 된 목록이 반대로 출력됩니다.

    • 의 출력은 0 -1 31 -1 2 2 2입니다 2 2 2 -1 31 -1 0.
  4. 레이어 1, 2 및 3으로 코어를 실행하십시오 (패턴은 분명해야 함).
    정렬 된 입력 목록의 공백으로 구분 된 목록을 출력합니다.

    • 의 출력은 0 -1 31 -1 2 2 2입니다 -1 -1 0 2 2 2 31.
  5. 레이어 1, 2, 3 및 4로 코어를 실행합니다.
    그러면 중복 된 항목이 제거 된 입력 목록의 공백으로 구분 된 목록이 출력되며 순서는 중요하지 않습니다.

    • 의 출력 0 -1 31 -1 2 2 2은입니다 -1 0 2 31.

모든 출력은 stdout 또는 이와 유사한 대안입니다.

이 5 가지 레이아웃 조합 만 동작을 지정했습니다.

노트

  • 코어 또는 층 또는 이들의 조합에는 주석이 허용되지 않습니다 . no-op이거나 건설적인 코드는 주석으로 간주되지 않습니다.
  • 코어는 (양의) NxN 치수를 가질 수 있지만 레이어는 한 문자 두께입니다.
  • 입력에 선행 또는 후행 공백이없고 숫자 사이에 정확히 하나의 공백이 있다고 가정 할 수 있습니다. 항상 하나 이상의 숫자를 포함합니다. (출력 목록도 이와 같이 형식화되어야합니다.)
  • 출력에 필요한 목록과 계산에 정수가 오버플로 (또는 언더 플로)되는 값이 없다고 가정 할 수 있습니다 (최대 값이 2 16 과 같은 합리적인 값이라면 ).

채점

이 프로그램을 작성하는 것은 일반적으로 쉽습니다. 작은 코어로 작성하는 것은 어렵습니다.

가장 작은 코어 크기 (가장 작은 N)를 가진 프로그램이 승리합니다. 동점 인 경우, 가장 적은 고유 문자 (개행을 계산하지 않음)를 가진 전체 프로그램 ((N + 8) × (N + 8) 정사각형)이 승자가됩니다.

답의 맨 위에 N 값을보고하십시오.


1
나는 이것이 새로운 유형 중 하나라고 생각했습니다.
Optimizer

줄 바꿈 뒤의 모든 것을 무시하는 언어를 사용할 수 있습니까?
isaacg

1
@isaacg 예 (개행 문자가 주석 문자로 간주되지 않는 이상 이상합니다).
Calvin 's Hobbies

3
@Optimizer 나를 유혹하지 마십시오 ... " 각 답변은 코드 양파에 새로운 레이어를 추가하여 목록과 함께 새로운 것을합니다 ... "
Calvin 's Hobbies

1
@Optimizer 호 (규칙이 좀 가혹하지만 이제 언어 일관된 일을 계속 O를 나는 /이 내가 알고있다.)
칼빈의 취미

답변:


10

CJam, N = 5, 27 (26) 개의 고유 문자

공백을 세지 않으면 26 자입니다. 프로그램은 실제로 공백을 사용하지 않는 것으로 변환 할 수 있습니다 (예 : _;상단 스택 요소를 복제 한 다음 삭제하거나 배열을 반복해서 정렬하여). 실제 코드에서 산만 해집니다.

l~]_|S*      
{l~]$S*      
 {l~]W%S*    
  {l~]_,\    
   {l~]{z    
    }%$W=    
    "CORE    
    "*       
         }   
   ;:+d\/ }  
  ;        } 
 ;          }
;            

여기에서 테스트하십시오.

핵심은

l~]{z
}%$W=
"CORE
"*

(빈 줄도 추가하십시오.)

N = 4CJam에서 할 수 없다고 확신합니다 (Dennis가 다른 방법으로 설득 할 것이라고 확신합니다 : D). 위는 17 개 문자가, 그리고 그것을 할 수있는 반면 (CJam가 질식하는 버그하지 않은 경우 예를 들어 16로 내려받을 :z필요 {z}%, 당신이 그것을 맞게 수 있다고 생각하지 않습니다, 또는 ARGV를 사용하여)를 안에 줄 바꿈을 도입하지 않고 레이아웃에서 CORE.

모든 구현은 주어진 작업에 대한 매우 간단한 솔루션입니다. 그들 모두는 시작 l~]하는 STDIN을 읽고 그것을 평가하고 배열의 풋를.

이전 레이어는 항상로 둘러싸여 {...}있으므로 자동으로 실행되지 않는 블록이됩니다. 그리고 그것을 실행하는 대신에 스택에서 버릴 수 ;있으므로 이전 레이어의 코드에 의존하는 레이어가 없습니다. 레이어 1에서 코드는 첫 번째 줄에 맞지 않았으므로 코어 블록을 버린 후에 계속했습니다.

실제 프로그램의 경우 :

  • 핵심:

    {z}%$W="CORE
    "*
    

    abs목록에 매핑 하고 정렬하고 마지막 요소를 가져 와서 CORE여러 번 반복하십시오.

  • 층 1 :

    _,\:+d\/
    

    목록을 복제하고, 길이를 가져오고, 스택 요소를 바꾸고, 합계를 얻고, 캐스트하고 double, 스택 요소를 바꾸고, 나누십시오. 나는 이것이 더 짧을 수 있다고 생각하지만 그렇게 할 인센티브는 없습니다.

  • 레이어 2 :

    W%S*
    

    공백으로 배열하여 배열을 반전시킵니다.

  • 레이어 3 :

    $S*
    

    공백으로 배열, 배열을 정렬하십시오.

  • 레이어 4 :

    공간이있는 복제, 설정된 조합, 리플.

Layer 2 ;및 and *S의 재사용 과 같은 다른 최적화도 가능 하지만 점수에는 영향을 미치지 않습니다.


17

파이썬 2-N = 17, 53 자

오, 나는 파이썬으로 소스 레이아웃 도전을 좋아합니다 ...

i=4                     ;
ii=3                    ;
iii=2                   ;
iiii=1                  ;
iiiii=0;R=raw_input     ;
iiiii;w=R().split()     ;
iiiii;n=map(int,w)      ;
iiiii;S=set(n);M=max    ;
iiiii;s=sorted(n)       ;
iiiii;J="\n".join       ;
iiiii;j=" ".join        ;
iiiii;k=M(map(abs,n))   ;
iiiii;A=J(["CORE"]*k)   ;
iiiii;B=sum(n)/len(n)   ;
iiiii;C=j(w[::-1])      ;
iiiii;D=j(map(str,s))   ;
iiiii;E=j(map(str,S))   ;
iiiii;P=A,B,C,D,E       ;
iiiii;print P[i]        ;
iiiii;" /__----__\  "   ;
iiiii;"|/ (')(') \| "   ;
iiii;"  \   __   /  "   ;
iii;"   ,'--__--'.   "  ;
ii;"   /    :|    \   " ;
i;"   (_)   :|   (_)   ";

그래도 아직 사용되지 않은 공백이 있습니다.

나는 여전히 독특한 문자 수를 향상시킬 수는 있지만 더 나은 가독성을 유지할 것입니다.

편집 : 아, 다시 스탠입니다 !


당신은 아마 대신의 인쇄 앨리어싱하여 일부 라인을 절약 할 수 있습니다 i=*트릭
M.Herzkamp

@ M.Herzkamp : print파이썬 2에서는 앨리어싱 이 불가능합니다. 그러나 아마도 개선의 여지가있을 것입니다. 아마도 파이썬 3을 사용할 것입니다.
Falko

나는 파이썬을 모른다. 그러나 핵심 코드 출력에서이 누락 된 절대 값은 아니다 –c*max(n)
nutki

@nutki : 당신이 맞아요! 나는주의 깊게 읽지 않았습니다. 그러나 나는 고칠 수 있었다.
Falko

6

파이썬 3 : N = 11, 40 개의 구별되는 문자

if 1:              
 if 1:             
  if 1:            
   if 1:           
    p=print;R=0    
    a=input()      
    b=a.split()    
    m=map;a=abs    
    E=max;l=len    
    n=m(int,b);    
    C=['CORE']     
   "R=E(m(a,n))"   
   OO=C*R;s=sum    
   "x='\n'.join"   
   "p(x(O))    "   
  "p(s(n)/l(b)) "  
 "p(*b[::-1])    " 
"p(*sorted(n))    "
p(*set(n))         

내 뮤즈가 된 @Falko에게 감사합니다. 파이썬은 각 if 문에 대해 새로운 범위를 만들지 않기 때문에 변수가 외부 print문에 유지되기 때문에 작동 합니다. 한 가지 성가신 것은 map객체 (우리의 경우 n)를 한 번만 사용할 수 있다는 것입니다. 따라서 R=E(...)줄 을 묶어야 했지만 R정의되지 않았습니다. 따라서 첫 줄에 네 개의 공백이 남았 기 때문에 운이 좋았습니다!

*b[::-1]목록 대신 여러 요소 를 제공하여 출력을 해결할 수 있습니다 . 대안 ' '.join(...)이 너무 길었을 것입니다.


아름다운! 파이썬에서 가변 줄 시작을 처리하는 대체 접근법을 만나서 반가워요. 짧은 진술과 그 공간은 괜찮습니다. :)
Falko

@ 팔코 : 단점은 : 스탠 공간이 없습니다 :(
M.Herzkamp

2

C (gcc) , N = 15, 47 개의 고유 문자

가정 sizeof(int) == 4sizeof(int*) >= sizeof(int).

;                     ;
 ;                   ; 
  ;                 ;  
   ;           float   
    s;c(a,b)int*a,*    
    b;{b=*b-*a;}i,n    
    ,*f;*q,*R,C,E ;    
    main(a){for(;0<    
    scanf("%i",&a);    
    i=i<abs(a)?a:i,    
    s+=f[n-!0]=a)f=    
    realloc(f,++n*4    
    );qsort(f,n*C,4    
    ,c);for(i=q?R?n    
    :!0:i;i--;a=f[i    
    ])!E|n-i<2|a!=f    
    [i]&&printf(q?R    
    ?R:q:"CORE\n",!    
    q+R?f[i]:s/n);}    
   ;*q="%f";       ;   
  ;*R="%.0f ";      ;  
 ;C=!0;              ; 
;E=!0;                ;

4 개의 층

3 개의 층

2 개의 층

1 개의 층

핵심


0

룬 마법 마법 부여 , N = 9 N = 8, 38 자

/ o/\  \     \S\
" //RiU\      \}
@            q "
"        }+1\r @
}   ^U \    {q "
     \{\?)}\+  }
  o\/'|A:{:/R' S
 //r/Ril2=?\?R :
   ,A~/"OC"/=? {
   @| \"RE"\3= =
 D$\' /rqka/l2S?
    i \*@   il\/
   'R1i     Ui ~
 R$/Rak      U \
 ?!D  Rlril1-{=
R   R: }S:{=?\~

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

내가 틀렸다는 것이 밝혀졌습니다 o. 전에 "목록 정렬"문제가 발생했기 때문에 이미 명시적인 s rt 명령을 잊어 버렸습니다 . 그러나 정렬 명령의 내부 비용으로 인해 최종 프로그램이 취할 수있는 입력 크기 (8 개 값)가 제한됩니다. 약간의 조정만으로도 1 개의 고유 문자 를 사용하여 입력 크기를 13으로 늘리거나 2 개의 고유 문자 를 사용하여 19 로 늘릴 있습니다 (모든 추가 문자는 레이어 1에 있고 동시에 추가되지만 IP 스택의 용량이 증가하지는 않습니다) C, L1 및 L2가 전체 입력을 메모리에 유지하지 않고도 계산을 수행 할 수 있으므로 Layer 3까지 필요합니다.

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

레이어 1 : 온라인으로 사용해보십시오!

레이어 2 : 온라인으로 사용해보십시오!

레이어 3 : 온라인으로 사용해보십시오!

레이어 4 : 온라인으로 사용해보십시오!

더 작은 공간으로 인해 흐름 제어 문자 수가 증가해야하므로 추가 압축은 거의 불가능합니다. 핵심 프로그램에서 9 개의 빈 공간을 제공하는 배열을 찾았지만 15 (정확하게 배열 된) 15가 필요하므로 충분하지 않습니다.

IP가 취하는 경로를 시각적으로 보여주지 않으면 이러한 프로그램이 어떻게 작동하는지 설명하는 것은 번거롭고 시간이 많이 걸립니다. 초기 진입 점은 코어 프로그램 ( ^) 의 왼쪽 상단에 있으며 , 새 레이어가 추가 될 때 일관된 흐름 제어가 가능합니다. 각 레이어는 새로 추가 된 선을 맨 위나 맨 아래에서 가로 챌 수 있습니다.

레이어 1과 레이어 2는 맨 아래에서 가로 채서 (맨 위 줄은 미래 레이어를 위해 비어있는 상태로 유지) 오른쪽 가장자리 (수직으로 배열 된 루프)를 따라 작업을 수행합니다. 레이어 1이 너무 길고 상단 가장자리를 따라 3자를 사용하지만 \오른쪽 상단 의 대각선 리플렉터 ( )가 IP를 다음 루프 반복으로 다시 정렬합니다.

레이어 3은 맨 아래 가장자리로 리디렉션하기 전에 첫 번째 입력 값을 가져 오기 위해 맨 위 가장자리를 가로 채고 (레이어 4는 맨 아래 줄에이 열에 NOP를 남김) 맨 아래 가장자리 루프를 사용하여 전체 입력을 읽고 아래로 리디렉션합니다. D왼쪽 하단의 명령 ( ). 거기에서 IP는 몇 번 바운스 $되어 값을 공백으로 분리하기 위해 왼쪽 아래 의 출력 ( ) 루프로 끝납니다 .

레이어 4는 레이어 3의 모든 기능 (따라서 빈 공간)을 사용하지만 레이어 3의 처리가 끝날 때 자체 기능을 수행하기 위해 새로운 상단 가장자리 (왼쪽 위)를 가로 챕니다. 왼쪽 상단 모서리 "@"는 하단을 따라 처리 루프에 들어가기 전에 배열의 끝을 나타내는 데 사용되는 문자열 을 삽입합니다 . 중복 값이 ​​발견되면 팝업 ( ~, 오른쪽 아래 모서리)되어 새 오른쪽 모서리를 사용하는 분기가 수행됩니다. 이 사이드 브랜치는 배열의 끝에 도달했는지 확인하고, 그렇다면 배열 3에서 동일한 공백으로 분리 된 출력 루프로 나아갑니다. 그렇지 않으면 계층 3의 공백을 사용하여 기본으로 돌아갑니다. 고리.

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