직각 삼각형 생성


10

이 문제에서는 입력으로 두 개의 숫자 (공백으로 구분)를 가져와 xs 로 구성된 ASCII 직각 삼각형을 출력해야합니다 .

첫 번째 숫자는 출력해야 할 삼각형의 너비와 높이입니다. 두 번째 숫자는 직각이 어느 모퉁이에 있는지 나타냅니다. 모서리는 왼쪽 상단부터 시작하여 영어 읽기 순서로 1부터 4까지 번호가 매겨집니다.

1    2



3    4

예를 들어 (입력 및 해당 삼각형 출력) :

INPUT | 3 1 | 3 2 | 3 3 | 3 4
------+-----+-----+-----+----
 OUT- | xxx | xxx | x   |   x
 PUT  | xx  |  xx | xx  |  xx
      | x   |   x | xxx | xxx

프로그램의 출력은 각 입력에 대해이 예제와 정확히 일치해야합니다.

입력은 항상 유효합니다. 첫 번째 숫자는 1 이상의 정수이고 두 번째 숫자는 1, 2, 3 또는 4입니다.

이것은 . 가장 짧은 코드 (문자 수)가 이깁니다.

답변:


9

APL (30)

{' x'[1+(⍎⍵⌷'⌽+⍉⊖')≤/¨⍳2⍴⍺]}/⎕

설명:

  • {... }/⎕: 입력에 대해 주어진 기능을 줄입니다 (입력에 2 개의 숫자가 있으면 왼쪽 숫자와 오른쪽 숫자 인 두 숫자로 함수를 호출하십시오 )
  • ≤/¨⍳2⍴⍺일 : 확인 -by- 좌표 매트릭스 및 비트 필드를주는 X 좌표의 Y 좌표보다 크지 그 위치를 설정.
  • (⍎⍵⌷'⌽+⍉⊖'): 삼각형을 위로 하여 변환 함수를 선택 합니다.
  • ' x'[1+... ]: 비트 필드에 1을 추가하고 결과를 문자열의 인덱스로 사용하여 ' x'0과 x1의 공간을 확보하십시오 .

1
APL을 많이 읽을수록 APL이 파싱 악몽이라는 것을 깨닫게됩니다. (⍎⍵⌷'functions')전체 진술을 해석하는 방법을 결정하기 전에 실제로 부품을 평가할 필요는 없습니까? 예를 들어 보자 1+(⍵⌷'12+')|40. 괄호로 |묶은 부분을 넣기 전에 모나 딕인지 디아 딕 인지조차 알 수 없습니다 . 전체 추상 구문 트리는 평가에 따라 변경됩니다.
protist

나는 1+(⍎⍵⌷'12+')|40... 나를 편집하게하지 않을 것을 의미했다 .
protist

2
@ protist : 재미있는 사실 : f ← { [ }오류가 발생하지 않습니다! f 1÷0제공합니다 ... 도메인 오류를 ! (0으로 나누기 때문에). 당신이 함수를 호출 할 때 만처럼 f 123당신이 얻을 구문 오류 . 보라 : imgur.com/jtmdi4B
marinus

모든 신들에 의해 !!!! 그것은 내 마음을 조금 아프게합니다. 나는 APL 인터프리터를 작성하면서 놀고 있었고 현재 구현에 큰 악을 보여줍니다. hahaha
protist

함수가 추악한 매크로 확장과 같은 프로세스에 의해 일상적으로 배치되는 것처럼 보입니다. 내부 텍스트 확장을 다소 나타냅니다.
protist

6

루비, 116 (115) 109 96

나는 내 자신의 해결책으로 시작할 것이다.

i=gets.split
s=i[0].to_i
(i[1]<?3?s.downto(1):1..s).map{|x|t=?x*x
puts /2|4/=~i[1]?t.rjust(s):t}

나는 거의 30 자의 GolfScript 솔루션에 거의 즉시 이길 것이라는 것을 알고 있습니다.

19자를 깎아 낸 미니 테크에 감사합니다!


대신을 ==0사용할 수 있습니다 <1. ?x*x다른 캐릭터를 저장합니다. 또한, puts i[1]%2<1?t.rjust(s):t}트릭을 할 것입니까?
Ry-

흠… 당신은 주위에 공백이 ?있습니까? 그게 필요한가요? 또한와 동일한 작업을 수행 할 수 있다고 생각합니다 r=.
Ry-

@minitech 필요합니다. 그렇지 않으면 1?단일 토큰으로 구문 분석하기 때문에 선행 공간이 필요 하고 그렇지 않으면 ?t(로 동등 함 't') 구문 분석하므로 후행 공간 이 필요합니다 . r부품 구조 조정을 어떻게 제안 합니까?
Doorknob

해봤 어? 어떤 버전의 루비에서? 2.0에서 잘 작동합니다.
Ry-

@ minitech Odd, 그것은 전에 작동하지 않았으며 지금은 작동합니다 : P Thanks
Doorknob

4

GolfScript ( 34 33 자)

~\:^,{)' x'^*$>^<0(2$?%}%\(2&(%n*

하나의 배열을 만든 다음 n시간 을 회전시키는보다 우아한 접근 방식을 허용하기 때문에 모서리에 회전 번호가 매겨지지 않는 것은 부끄러운 일입니다 .

~\:^,{)' x'^*$>^<}%{-1%zip}@)*n*

3

C #-195

using System;class P{static void Main(string[]a){int G=int.Parse(
a[0]),O=int.Parse(a[1]),L=O<3?0:G+1,F=O<3?-G:1;G=O%2>0?-G:G;for(;
F<L;F++)Console.Write("{0,"+G+"}\n","".PadRight(F<0?-F:F,'x'));}}

형식화 :

using System;
class P
{
    static void Main(string[] a)
    {
        int G = int.Parse(a[0]),
            O = int.Parse(a[1]),
            L = O < 3 ? 0 : G + 1,
            F = O < 3 ? -G : 1;

        G = O % 2 > 0 ? -G : G;

        for(; F < L; F++)
            Console.Write("{0," + G + "}\n", "".PadRight(F < 0 ? -F : F, 'x'));
    }
}

여기에 이미지 설명을 입력하십시오


입력은 쉼표로 구분되지 않고 공백으로 구분되어야합니다.
Doorknob

@Doorknob : 스크린 샷은 테스트 프로그램에서 가져온 것으로 쉼표로 입력을 표시하도록 선택했습니다. 모든 C # 콘솔 응용 프로그램은 입력을 문자열 배열로 받기 때문에 입력은 실제로 프로그램을 실행할 때 공백으로 구분됩니다.
Igby Largeman

2

골프 공, 39 36 35 자

~\:y,{' '*'x'y*+y<0~2$?%}%-1@2>?%n*

라이브 데모 : http://golfscript.apphb.com/?c=OyczIDInCn5cOnkseycgJyoneCd5Kit5PC0xIDIkPyV9JS0xQDI%2BPyVuKgo%3D

너무 나빠서 요청 한대로 30자가 아닙니다.


교체 1${-1%}*-1 2$?%\2>{-1%}*함께하면 \2>-1\?%당신이 개 문자를 그물 것입니다.
변동성

@Volatility 감사, 통합
John Dvorak

@Volatility -1 2는 쓸 수 있습니다0~2
Howard

그리고 또 다른 숯을 위해 우리는 조금 더 재구성해야합니다.~(\:y,{{>'x '=}+y,%0~2$?%}%\2&(%n*
Howard

2

Mathematica 122 (104?)

g@s_ := ({w, p} = ToExpression@StringSplit@s; 
   Array[If[Switch[p, 1, # <= (w + 1 - #2), 2, # <= #2, 3, # >= #2, 4, # > (w - #2)],
   "X", ""] &, {w, w}]) // Grid

GraphicsGrid[{{g["12 1"], g["12 3"]}}]

다른 방법


"출력"에 대한 자유의 해석에 따라 다음 (104 자)이 작동합니다.

f@s_ := ({w, p} = ToExpression@StringSplit@s; 
  Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True])


f["50 4"]

삼각형


목록 형식의 입력이 허용되면 다음 (75 자)이면 충분합니다.

f[{w_, p_}] := 
 Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True]


기술적으로 이것은 규칙에 위배됩니다 .P
Doorknob

어떤 규칙을 위반합니까?
DavidC

입 / 출력 차트는 내가 넣은 것입니다. 122 문자 하나는 좋습니다. 명확하게하기 위해 질문을 편집했습니다
Doorknob

죄송합니다. 나는 차트가 단순히 예라고 생각했다.
DavidC

방금 ASCII 아트 버전을 처음에 배치했습니다.
DavidC

2

J, 59 55 42 38 37 36 자

프로그램 종료시 입력이 허용 된 경우 :

(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

그렇지 않은 경우 (추가 3 자) :

t=.(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

용법:

   (|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/3 4
  x
 xx
xxx

또는

   t 3 4
  x
 xx
xxx

나는 대부분의 문자가 묵시적 스타일로 유지하기 위해 대괄호와 대문자이기 때문에 이것이 조금 짧을 수 있다고 생각합니다.

편집
gerund와 의제 동사를 사용하면 몇 가지 문자가 잘려 나갔지 만 여전히 마음에 드는 부분이 너무 많습니다.

편집 2
그것은 조금 더 비슷합니다. 얼마나 많은 회전이 필요한지 목록에 대한 의제를 버리는 것은 대부분의 추가 브래킷과 몇 개의 캡을 제거합니다.

편집 3
프로세스에서 마지막 불필요한 캡과 한 쌍의 괄호를 제거했습니다. 필요한 회전 수를 더 저렴하게 인코딩하는 방법을 찾아야합니다.

편집 4 접미사 대신 접두사를 사용하여 문자를 잘라냅니다. 문자를 저장하지 않는 다른 방법으로 목록을 작성할 수 있습니다. 도청 전문가.

5
수식을 사용하여 다른 문자를 잘라냅니다. 여전히이 비트가 더 짧을 수 있다고 생각합니다.


1

파이썬 106 문자

w,d=map(int,raw_input().split())
for e in range(1,w+1)[::d/3*2-1]:print('%'+'-+'[d%2]+str(w)+'s')%('*'*e)

1

파이썬 3, 91

Abhijit의 답변을 기반으로합니다.

에서 문자열과 ugly 1의 합을 피하기 위해 출력 문자열 생성을 수정했습니다 range. Python 3은 raw_in을 제거 raw_input하지만 //정수 나눗셈 에 사용하고에 대한 paranthese를 추가 print해야하므로 하나의 문자 만 저장됩니다.

w,d=map(int,input().split())
for e in range(w)[::d//3*2-1]:print('%*s'%(w-d%2*2*w,'x'*-~e))

0

새끼 고양이 , 140

def s{><replicate}
getLine{' 'neChar}span{readInt fromSome}toBoth->{w n}
w 0 if(n 2>){><}..
{<>w>< -{'X's}{' 's}both if(n 2%0=){><}cat say}each

언 골프 드 :

getLine
{' ' neChar} span
{readInt fromSome} toBoth
->{ width corner }

width 0
if (corner 2 >):
  swap
..

{ ->index
  'X' index replicate
  ' ' (width index -) replicate
  if (corner 2 % 0 =):
    swap
  cat say
} each

오버로드를 구현하고 표준 라이브러리를 구현해야한다는 증거.

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