간단한 인쇄 화살표


23

골프 연습을 위해 여자 친구의 Intro to Python 수업에서 과제를 수행했습니다. 나는이 과제를 위해 캐릭터 수에 매우 근접한 여러 전략이 있다는 것을 발견했으며, 여기 사람들이 더 나은 방법을 찾을 수 있다고 확신합니다. 파이썬 에서이 작업을 수행하는 방법에 가장 관심이 있지만이 프로그램이 얻을 수있는 가장 골프를 배우기를 원합니다. 따라서 이것이 코드 골프이며 가장 짧은 답변입니다.

규칙:

과제는 다음과 같습니다. 프롬프트는 아무 것도 말할 필요가없고 다른 순서로 표시 될 수 있지만 사용자에게 두 번 입력하도록 요청해야합니다.

표준 허점이 적용됩니다.


과제 3 : 화살

사용자에게 많은 열을 요구하는 프로그램을 작성하면 아래와 같이 패턴이 인쇄됩니다. 사용자가 양수를 제공한다고 가정 할 수 있습니다. 프로그램은 왼쪽 및 오른쪽 화살표를 모두 처리해야합니다. 다음은 몇 가지 샘플 실행입니다.

How many columns? 3
Direction? (l)eft or (r)ight: r
*
 *
  *
 *
*
How many columns? 5
Direction? (l)eft or (r)ight: l
    *
   *
  *
 *
*
 *
  *
   *
    *

23
이건 집처럼 보이는데 ..
TessellatingHeckler

각 줄의 후행 공백이 허용됩니까?
lirtosiast

@ThomasKwa 네.
aks.

이 질문 에서처럼 제어 문자를 사용하여 커서를 움직일 수 있습니까 ?
lirtosiast

@ThomasKwa 물론 ... 정말로 그것이 무엇을 의미하는지 확신하지 못하지만 실제로 그것을 보는 데 관심이 있습니다.
aks.

답변:


8

Pyth, 23 바이트

이 의견 에 대한 답변을 바탕으로 유효하거나 유효하지 않을 수 있습니다 . 어쨌든, 나는 이것을 깔끔하게 발견했으며, 그것이 유효하지 않으면 다른 Pyth 답변도 유효하지 않습니다. ;) 글쎄, 그것은 명백하게 명백한 것을 놓 쳤기 때문에 유효합니다 . : /

편집 : 나는 !!!! 예 !!!! 처음으로! :디

j+_J_Wqz\r.e+*dkb*\*QtJ

라이브 데모.


1
m+*\ d\*Q그 대신에 물건을 열거하십시오. 2 바이트를 저장합니다.
Jakube

7

피스, 27

j<tQ_Wqz\l++Jm+*\ d\*Q_PJtJ

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

여기서 기본 아이디어는 5와 같이 하나의 문자열을 작성하는 것입니다.

*
 *
  *
   *
    *
   *
  *
 *
*
 *
  *
   *
    *

l입력 값을 받으면 거꾸로 뒤집습니다 . 그런 다음 input-1이 문자열 의 마지막 줄을 제외하고 모두 인쇄합니다.


7

파이썬 2, 81 79 바이트

c=input()
r=1
l=0
exec"print' '*(%sabs(c-r))+'*';r+=1;"%("c+~"*input())*(2*c-1)

여전히 골프를 칠 수는 있지만 우리는 다음을 보게 될 것입니다 :)


2
입력 변수가 될 가진 좋은 아이디어 lr. 입력이 eval코드와 동일한 환경에 있다는 것을 깨닫지 못했습니다 .
xnor

4

Pyth, 30 28 27 바이트

VtyQ+*+*tQJqz\r_WJ.a-hNQd\*

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

분명히 나는 ​​현재 완전히 다른 접근법 으로 FryAmTheEggman에 묶여 있습니다. (나는 독창적이라고 생각합니다.)

$ python pyth.py spa.p
r
3
*
 *
  *
 *
*

$ python pyth.py spa.p
l
5
    *
   *
  *
 *
*
 *
  *
   *
    *

설명

 tyQ                              (columns * 2) - 1
V                               loop N through range(the above)
        tQ                                columns - 1 (maximum number of spaces)
       *                                multiplied by
           qz\r                           1 if direction == "r" else 0
          J                               also save that 1 or 0 to J
      +                               plus
                  .a-hNQ                    abs(N - columns + 1)
               _WJ                      negate that if direction == "r"
     *                  d           that many spaces
    +                    \*       add the star and print

@ Pietu1998 나는 아직도 당신이하고있는 것에 대한 기본 설명에 관심이 있습니다. 나는 당신이 단 하나의 루프를 가지고 있고 맵이나 람다가없는 것을 본다
.

@aks. 설명을 추가했습니다.
PurkkaKoodari

4

PowerShell을 91 85 102 바이트

$c=(Read-Host)-1;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[(Read-Host)-eq'l']|%{" "*$_+"*"}
  • 열을 가져 와서에 저장합니다 $c. 각 열에도가 *있고 필요한 공간의 수에만 관심이 있기 때문에 1을 뺍니다 .
  • 입력 한 값이 이면 스크립트의 1인쇄 *및 종료-나머지는 차이가 없습니다. +
  • 다음 섹션은 먼저이든 방향과 검사 얻는다 -eq연간가 l다음의 값에 기초하여 동적으로 생성 된 배열의 배열 인덱스에 기초한 배열을 생성 $c. 마법. 기본적으로 이것은 라인 당 필요한 공간의 수입니다.
  • 예를 5 r들어이 컬렉션의 경우 hold (0,1,2,3,4,3,2,1,0)입니다.
  • 배열을 가져 와서 Foreach-Object %루프에 파이프합니다 . 여기서 X 개의 공백 문자열을 출력합니다.*

사용법 예 :

PS C:\Tools\Scripts\golfing> .\simple-printing-arrows.ps1
6
r
*
 *
  *
   *
    *
     *
    *
   *
  *
 *
*

편집- $e콜렉션을 직접 파이핑하여 변수 를 제거 했습니다.
Edit2-이제 1 열을 올바르게 설명합니다.

+ 여전히 1 열 화살표 방향을 입력 해야하는 경우 (필자는 아닙니다) 변수를 Read-Host다시 도입하여 106 의 위치를 바꾸고 몇 바이트를 잃을 수 있습니다 .$d

$c=(Read-Host)-1;$d=Read-Host;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[$d-eq'l']|%{" "*$_+"*"}

1 열을 넣으면 왼쪽에 2 열 오른쪽 화살표가 나타납니다. 1 열과 오른쪽을 넣으십시오- '유효한 값 범위에서 지정된 인수'오류가 발생합니다. 나는 두 배의 범위를 피함으로써 85가 이길 수 있다고 생각했습니다. 그러나 나는 심지어 가까이 갈 수 없습니다. 1 열 화살표를 계산하면 현재 112 자입니다. > _ <
TessellatingHeckler

1
@TessellatingHeckler 감사합니다-수정되었습니다.
AdmBorkBork

1
그것은 당신을 102로 밀어 냈고 나의 것은 102로 내려갔습니다. 더 이상 이것에 응시할 수는 없지만 삭제할 수있는 것이 하나 더 있어야합니다 ... : D
TessellatingHeckler

4

TI-BASIC, 75 65 57 54 50 47 바이트

올바른 바이트 계산 및 10 바이트 골프를위한 @ThomasKwa에게 감사 합니다 .

TI-84 + Silver Edition 에서 테스트되었습니다 .

첫 번째 TI-BASIC 제출, 골프 제안을 환영합니다 (아직 많은 트릭을 모릅니다). 이름이 표시된 메모리에서 요소를 재생하면이 문자는 1 대신 3 문자였습니다 (내 계산기 자체의 바이트 수를 보았습니다). 이 프로그램은 output기능의 제한에 의해 제한되지만 (길이가 4 인 화살표로 생각합니다)로 전환 할 수 text있습니다. 길이가 너무 짧으면 그래픽으로 표시됩니다.

Prompt L,Str1
Str1="R
For(I,1,2L-1
Output(I,(1-2Ans)abs(I-L)+AnsL+1,"*
End

또한 화면을 지우거나 일시 중지하지 않습니다.

나는 내가 사용하는 방정식을 더 골프화 할 수있는 것처럼 느낍니다. 또한 종료 따옴표를 제외하는 것이 잘못되었다고 느낍니다.


트윗 담아 가기 지금 할게요
cole

2
둘째 : Ans입력에 사용 Output(하지 않고 수정하지 않기 때문에 무료 Ans입니다. 그것을 사용하고 변수를 제거하십시오 A. -2(Str1="R;를 사용하여 할당 할 수 있습니다 . 조건부 필요가 없습니다.
lirtosiast

1
@ThomasKwa 팁에 감사드립니다. TI-BASIC에 갈 수있는 방법이있는 것 같습니다.
cole

3
셋째 : 실제로 값을 곱할 필요가 없습니다 -2. 그냥 할 Str1="R두 번째 라인. 그러면 네 번째 줄 Output(I,(1-2Ans)abs(I-L)+AL+1,"*이 만들어져 4 바이트 더 늘어납니다. 그러나 대기,있다 관용구 에 대한 (1-2Ans)- 그것은의 cos(πAns)한 바이트를 저장, 플러스 우리가 무료로 여는 괄호를 얻을 더 때문에 하나!
lirtosiast

1
어떤 언어로든 골프에 능숙 해지려면 연습 만하면됩니다. 당신은 거기에 도착할 것이다.
lirtosiast

2

파이썬 2, 89 바이트

c=input()-1
d=raw_input()>'l'
for j in range(2*c+1):print' '*(d*c-(2*d-1)*abs(c-j))+'*'

내 Pyth 답변과 거의 동일하게 작동하여 정확한 공간 수를 즉시 계산합니다.


2

PowerShell, 104102 97 바이트

# 97 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];($j=2*$c)..0|%{' '*[Math]::Abs($o++%($j+!$j)-$c)+'*'}

3
r
*
 *
  *
 *
*

# Previous 102 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];(2*$c)..0|%{
' '*[Math]::Abs($o++%(2*($c+(!$c+0)))-$c)+'*'}

NB. 다시 실행하려면 새 PowerShell을 열거 나 rv o변수 상태를 재설정하십시오.

다른 사람들이 얼마나 간결한 지에 비해, 이것은 아프다. [122에서보다 97에서 덜 허드]. 그것의 두 부분, 그들 중 어느 것도 놀랍지 않습니다. 많은 열을 읽고 array-index-ternary-operator-substitute를 사용하여 오프셋을 가져오고 오프셋에서 시작 하여 웨이브 함수를 실행 합니다 (그리고 조정하여 수행하지 않습니다 mod 0).

(그리고 나는 그 파동 함수에 나이를 먹었고, 나의 오해를 발견 할 수 없었고, 모든 것이 비정형 적이며, 정직한 Parens를 타이핑했습니다).


2
그것은 피의 찬란하다.
AdmBorkBork

2

파이썬 2, 98 89 바이트

f=[' '*n+'*'for n in range(input())]
if'l'==input():f=f[::-1]
print'\n'.join(f+f[-2::-1])

조금 더 길다.


용법

$ python2 test.py
3
"l"
  *
 *
*
 *
  *

또한 깨진 것 같습니다. NameError: name 'l' is not defined, NameError: name 'd' is not defined.
TessellatingHeckler

사용법을 확인하십시오. @TessellatingHeckler
Zach Gates

아, 영리하다. 그러나 1 열 화살표에는 두 개의 화살표 머리가 있습니다. (I는 저장하지 않음으로써 더 당신이 골프를 할 수 생각 i하고 d그냥 사용, 전혀 range(P())그리고 if P()=='l'...)
TessellatingHeckler

제안 해 주셔서 감사합니다! 또한 이중 화살표 머리를 고정했습니다. @TessellatingHeckler
Zach Gates

기압 테스트 할 수 없습니다,하지만 당신은 아마 같은 것을 할 수있는 f=[...][::2*('r'>input())-1]사실을
SP3000을

2

펄, 85 바이트

($-,$_)=<>;$,=$/;@}=map$"x$_.'*',0..--$-;@}=reverse@}if/l/;print@},map$}[$--$_],1..$-

용법:

perl 59874.pl <<< '6
r'

4
나는 당신이 나중에 당신이 알아볼 스크립트 이름을
짓는

트윗 담아 가기 알다시피, 실제로 스크립트 이름을 지정 simplearrows2.pl하지는 않지만 사용법 지침에 간단한 이름을 지정하는 것이 가장 좋다고 생각했습니다 . : P
Dom Hastings

2

PHP, 156 바이트

<?for($c=1+fgets(STDIN);--$c;$s[-$c]=$t[]=sprintf("%{$c}s","*"));arsort($s);$a=fgetc(STDIN)==r?$s+$t:$t+$s;array_splice($a,count($a)/2,1)?><?=join("
",$a);

다음과 같이 두 개의 배열을 만듭니다.

$t = [
    0 => "  *"
    1 => " *"
    2 => "*"
]
$s = [
    -1 => "*"
    -2 => " *"
    -3 => "  *"
]

다음 배열의 조합을 사용 $s+$t하거나 $t+$s그들을 결합하고 array_splice중간에 요소를 제거 할 수 있습니다. 마지막으로 출력<?=join()


대신 팔이 짧은 바이트 것 내 코드를 표준 입력의 CLI 인수)
파비안 Schmengler

2

파이썬 2, 111 109 104 바이트

아주 간단한 해결책. 더 골프를 칠 수 있다고 확신합니다. 모르는 사람 ~x+n과 동일합니다 n-1-x.

n=input()
r=range(n)
r+=r[-2::-1]
for i in[r,[~x+n for x in r]]['r'>raw_input()]:print"*".rjust(i+1," ")

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

편집 : 이것은 마지막 줄로 골프되었습니다 :

if'r'>d:r=[~x+n for x in r]
for i in r:print"*".rjust(i+1," ")

2

MATLAB, 109 105 96 바이트

9 바이트를 절약 해 준 @beaker에게 감사드립니다 .

x=eye(input(''));if(input('','s')<114),x=fliplr(x);end
x=x*10+32;disp(char([x;x(end-1:-1:1,:)]))

ASCII 코드를 삽입하는 두 줄을 다음과 같이 바꾸면 9 바이트를 절약 할 수 있습니다.x=x*10+32;
beaker

@beaker 매우 영리합니다, 감사합니다!
Luis Mendo

1

루비, 118 바이트

2.times{l,d=gets.split;l=l.to_i;a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a;(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"}}

2.times{ -물론 두 번 ...

l,d=gets.split; -입력을 받는다

l=l.to_i; -길이를 정수로 변경

a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a; -0에서 길이 범위의 배열을 만듭니다.

(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"} -반복하고, 끈으로 바꾸어 화살표를 만듭니다.

지금까지 최고의 골프는 아니지만 이봐.


1

PowerShell, 98 94 바이트

$c=(Read-Host)-1;$d=Read-Host;if($c){$c..0+1..$c|%{if($d-eq'r'){$_=$c-$_}' '*$_+'*'}}else{'*'}

foreach-object 루프 내부에 방향에 대한 Read-Host를 넣을 수있는 방법을 찾을 수 있지만 한 번만 프롬프트하면 몇 바이트를 저장할 수 있습니다.

편집 : 94 바이트. 왼쪽을 테스트하는 대신 오른쪽을 테스트합니다 (루프 단순화).

원본 98 바이트 :

$c=(Read-Host)-1;$d=Read-Host;if($c){0..$c+($c-1)..0|%{if($d-eq'l'){$_=$c-$_}' '*$_+'*'}}else{'*'}

$_변수 재설정 -까다로운 호빗. 매우 영리하고 오늘 무언가를 배웠습니다.
AdmBorkBork

@TimmyD 매우 까다로운. 그런 다음 if 문을 전환하여 더 많이 저장하십시오.
Jonathan Leech-Pepin

0

> <> , 60 바이트

i"1l"i=&-:&*&:?!\:1-:}c0.
~/?:<-$?&::&;!?l<oao"*"
1/  \o" "-

결론에 2 바이트를 낭비, 얼마나 짜증나!

> <>에서 입력이 작동하는 방식으로 인해 입력을 '대기'할 수 없습니다. i 명령은 STDIN에서 입력 문자를 사용할 수 있는지 확인합니다. 있으면 해당 문자의 ASCII 값을 푸시하고 그렇지 않으면 -1을 푸시합니다.

즉,이 프로그램을 사용하려면 STDIN에서 번호와 방향이 이미 준비되어 있어야합니다 (예 : 3r오른쪽을 가리키는 크기 3 화살표). 이 항목이 실격되는지 확실하지 않은 경우, 귀하의 생각을 알려주십시오 : o)

누군가가 원한다면 설명을 쓰겠습니다.


어떤 의미에서 쉘에서 실행하려고하면 입력을 기다리므로 괜찮습니다. 나는 이것이 입력이 한 자리가 될 것으로 기대한다는 사실에 더 관심이 있습니다 ( :10 을 입력하려고하지 않는 한 ?)
Sp3000

좋은 점은 9 번 이상의 입력에 대해서는 생각하지 못했습니다. 드로잉 보드로 돌아갑니다!
Sok

1
만약

0

PHP, 154 바이트

정말 반복적으로 보이지만 원하는 작업을 수행합니다.

$c=$argv[1];$b=l==$argv[2]?1:0;$a=$b?$c:-1;function a($a){echo strrev(str_pad('*',$a))."\n";}while($b?--$a:++$a<$c)a($a+1);while($b?++$a<=$c:1<$a--)a($a);

다음과 같은 명령 행에서 실행됩니다.

php arrow.php 5 l
php arrow.php 5 r

-1

파이썬, 88 바이트

편집

n=input()-1
x=raw_input()>'l'
for i in range(2*n+1):print" "*(n*x+(-1)**x*abs(n-i))+"*"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.