오름차순 / 내림차순으로 아치를 인쇄


28

"아치"가이 숫자 패턴을 설명하는 가장 좋은 방법이라고 생각했습니다.

1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

공식적으로 정의 된 각 줄은 1에서 1까지 9-n(n-1)*2공백, 1에서 1까지 의 숫자 9-n( n현재 행이있는 위치 )로 구성됩니다.

당신의 임무는 가능한 한 가장 짧은 코드를 사용하여 다음 패턴에 따라 위의 패턴을 인쇄하는 작은 스크립트 / 프로그램을 작성하는 것입니다.

  1. 전체 패턴을 하드 코딩 할 수 없습니다. 최대 한 줄의 패턴 만 하드 코딩 할 수 있습니다.
  2. 프로그램 은 각 줄 끝에 줄 바꿈 ( \n또는 조합)을 인쇄해야합니다 \r.

준비 ... 설정 ... 이동!


1
;-)에 해당하는 추가 라인 123456787654321을 사용할 수 있습니다.11111111^2
Egor Skriptunoff

3
@ EgorSkriptunoff 11111111^2 == 123465787654321 != 1234567887654321(반복 통지 8)
Bob


6
오히려 커튼 처럼 보입니다 .
변동성

답변:


22

파이썬 2, 65 55 53 51

s=12345678
while s:r='%-8d'%s;print r+r[::-1];s/=10

ugoren의 아이디어를 사용하여 단축했습니다 .


훗, 나는 개선의 여지가 알고 있었다 : P
나단 오스만

2
s=s[1:]루프별로 많이 절약 할 수 있습니다while s:
ugoren


9

APL (18)

k,⌽k←↑↑∘(1↓⎕D)¨⌽⍳8

설명:

  • 1↓⎕D: 숫자 문자열 ( "0123456789")에서 첫 번째 요소를 뺀 값
  • ↑∘(1↓⎕D)¨⌽⍳8: 첫 번째 [8..1] 문자를 선택하십시오 ( '12345678', '1234567'...)
  • : 행렬 형식 (사용하지 않는 문자를 공백으로 채움)
  • k,⌽k←:에 저장 k하고 표시 한 k다음 수직 미러링k

4

루비 : 61 50 자

s="87654321";s.chars{|c|puts s.reverse+s;s[c]=" "}

샘플 실행 :

bash-4.2$ ruby -e 's="87654321";s.chars{|c|puts s.reverse+s;s[c]=" "}'
1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

4

사랑-3 x 18 = 54

나는 사랑으로 무언가를해야한다고 느꼈다. 마지막으로 사용한지 너무 오래 걸렸다. 이 문제는 언어에 가장 적합하다고 생각했습니다.

문자 당 약 8 개의 동작을 수행하는 인쇄 루프 (카운팅 스타일이 다름)로 인해 너무 느립니다.

80v >#v"12345678"<
>5 *^ >,#$:_$:1-:v
^2< 0p0+7\*48\_@#<

4

자바 스크립트, 71

s='1234567887654321',i=10;while(--i)console.log(s=s.split(i).join(' '))

s="1234567887654321";for(i=10;--i;)console.log(s=s.split(i).join(" "))70 자 : @SteveWorley
WallyWest

3

C, 83 자

main(a,b,n){
    for(a=12345678,n=1e8,b=n-a-1;a;a/=10)
        printf("%-8d%8d\n",a,b),
        b%=n/=10;
}

3

파이썬 2, 75 62

Volatility의 대답을 이길 수는 없지만 파이썬의 가변 문자열 ( bytearray)을 사용하는 또 다른 접근법이 있습니다 .

s=bytearray('1234567887654321')
for i in range(8):s[8-i:8+i]=i*'  ';print s

편집하다

다음을 사용하여 더 짧은 버전을 찾았습니다 str.replace.

s='1234567887654321'
for c in s[8:]:print s;s=s.replace(c,' ')

3

펄, 41

더하기 -E스위치. 명령 행의 총 문자 : 50

최소한 perl5, 버전 10이 필요합니다.

perl -E'say@!=1..8-$_,$"x(2*$_),reverse@!for-0..7'

표준보기 -E가 프로그램에 1 바이트 추가 이기 때문에 이것이 42라고 말하고 싶습니다 .
Timtech 2009 년

3

매스 매 티카 92 85 67 54 51

방법 # 1 : (54 자) row #, col # 및 왼쪽에서 오른쪽 가장자리까지의 거리를 사용하여 배열을 만듭니다.

Grid@Array[If[#2<9,#2,17-#2]/.x_/;x+#>9:>" "&,{8,16}]

방법 # 2 : (67 자) 패드의 짧아 진 범위.

Print@@@Table[Join[k = PadRight[Range@i, 8, " "], Reverse@k], {i, 8, 1, -1}];

방법 # 3 : (85 자) 배열의 각 행을 선택적으로 채 웁니다.

8 개의 공백 문자 목록으로 시작하십시오. 위치 1과 16을 "1"로 바꾸십시오. 위치 2와 15 등에서 "2"를 교체하십시오.

p = 0; q = 16;
Print @@@Reverse@Rest@NestList[ReplacePart[#, {++p -> p, q-- -> p}]&,Array[" "&,q], 8];

방법 # 4 : (86 문자) 배열의 각 행을 선택적으로 비 웁니다.

p=8;q=9;
Print@@@NestList[ReplacePart[#,{p---> " ",q++-> " "}]&,Join[k=Range@8,Reverse@k],7];

방법 # 5 : 문자열 사용 (92 자)

p=8;s="12345678";
Print[#,StringReverse@#]&/@NestList[StringReplace[#,ToString@p-- ->  " "]&,s,7];

그 새것은 매끈하다! 가능하다면 다시 +1을하겠습니다. :-) btw,을 삭제 ()하고 다음으로 바꿀 수 #1있습니다 #.Grid@Array[If[#2<9,#2,17-#2]/.x_/;x+#>9:>" "&,{8,16}]
Mr.Wizard

팁 주셔서 감사합니다. 예, Array때로는 반복자를 추가하지 않고도 멋진 테이블을 만들 수 있습니다.
DavidC

3

PHP, 68

(함자의 답변에서 영감을 얻음)

for($n=8;$n;$r[]=$n--)echo str_replace($r," ","1234567887654321\n");

PHP의 str_replace는 검색을위한 배열과 교체를위한 문자열을 받아 들일 수 있다는 사실을 재생하며, 배열의 모든 항목을 주어진 문자열로 대체합니다. 각 반복 후에 현재 번호가 검색 배열에 추가되어 다음 루프에서 제거됩니다.

작동중인 코드의 예 : http://ideone.com/9wVr0X


hehe nice +1
HamZa

중간하지만 공백의 오른쪽 숫자를 넣어 표시되지 않습니다
나단 목초 밭

@nathanhayfield : 어떻게 요? 첫 번째 줄에는 0 개의 공백이 있고 두 번째 줄에는 2, 4, 6, 8 등이 있습니다.
Mr. Llama


출력이 <pre>태그로 래핑되지 않았기 때문 입니다. html 텍스트로 해석하면 공백이 축소되고 줄 바꿈이 무시되지만 소스를 확인하면 다르게 표시됩니다.
Mr. Llama 2016 년

3

놀라운 165

@0
08
>0
LN
--
@0
:LN
}0}0}0}0
..SAPSSD0A
{0
:PS
}0
~~09
..//
<<@0
\\>0
&0//
--@1
@020
&0/\&0
@1
:SA
@0
}0
>0!!
--00@1
@0++//
+O/\@1
+O
:SD
}0@0
\\>0\/
--/\+O
@0..+O

의사 코드 :

MB():
    for x in 8..1:
        LN(x)
LN(x):
    SA(x)
    PS(x)
    SD(x)
    print "\n"
PS(x):
    print " "*(8-x)*2
SA(x):
    for n in 1..x:
        print n
SD(x):
    for n in x..1:
        print n

2

Python 2.x- 73 65 63 61 자

c=1;s='87654321'
while c<9:print s[::-1]+s;s=' '*c+s[c:];c+=1

2

PHP, 76

for($i=9;$i>1;){$r[]=$i--;echo str_replace($r,' ','1234567887654321')."\r";}

2

K, 28

-1_a,'|:'a:8$'{-1_x}\,/$1+!8

.

k)-1_a,'|:'a:8$'{-1_x}\,/$1+!8
"1234567887654321"
"1234567  7654321"
"123456    654321"
"12345      54321"
"1234        4321"
"123          321"
"12            21"
"1              1"

36으로 일반화 할 수 있습니다. {-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x}

k){-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x} 5
"1234554321"
"1234  4321"
"123    321"
"12      21"
"1        1"
q)k){-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x} 15
"123456789101112131415514131211101987654321"
"12345678910111213141  14131211101987654321"
"1234567891011121314    4131211101987654321"
"123456789101112131      131211101987654321"
"12345678910111213        31211101987654321"
"1234567891011121          1211101987654321"
"123456789101112            211101987654321"
"12345678910111              11101987654321"
"1234567891011                1101987654321"
"123456789101                  101987654321"
"12345678910                    01987654321"
"1234567891                      1987654321"
"123456789                        987654321"
"12345678                          87654321"
"1234567                            7654321"
"123456                              654321"
"12345                                54321"
"1234                                  4321"
"123                                    321"
"12                                      21"
"1                                        1"

2

자바 스크립트, 67 자

steveworley의 답변에 영감을 받았습니다 (가능한 경우 의견을 말함).

코드 스 니펫

a='1234567887654321\n',b='',c=10;while(--c)b+=a=a.split(c).join(' ')
<a href="#" onclick="javascript:document.getElementById('output').innerHTML = b;">Display</a>
<pre id="output">...</pre>

마지막 개행의 존재는 규칙을 따릅니다.

업데이트 : 괄호 (연산자 우선 순위)를 제거하여 2자를 잘라 내고 불필요한 공간을 제거하여 1자를 자릅니다.

코드 세그먼트의 하드 코딩을 해제하여 단축 또는 단순화하려는 여러 가지 방법에 관계없이 아래에 작성된 "이 카운트"규칙을 적용 할 때까지 길이는 동일하게 유지 되었기 때문에 트롤링처럼 보입니다.

(크롬 콘솔에서 인쇄 할 때 다시 인쇄되는 것으로 계산되는 경우)


다른 답변처럼 보이지 않으며 숫자는 오른쪽 열에 정렬되어 있지 않습니다.
AL

@AL 자음 btw에서 출력되는 내용을 읽는 경우 경고가 필요하지 않습니다.
Sophiα2329

오른쪽 열을 정렬하려면 조인의 문자열 인수에 2 대신 1이 있어야합니다. 공백이 2 개인 경우 크롬 기반 브라우저 경고에서 올바르게 정렬됩니다.
Qwertiy

JS 경고없이 스 니펫에 결과를 표시하도록 게시물을 수정했습니다 (편집이 수락되어야 함).이 경우 하나의 공간 만 필요합니다.
AL

2

Brainfuck : 542 바이트

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

1

매스 매 티카 , 59

61 내 자신의 아이디어를 사용하여 :

Grid[Clip[#~Join~Reverse@#&@Range@8,{1,9-#},{," "}]&~Array~8]

또는 59, 다윗의 대답에서 빌리기 :

Grid@Array[Join[k=PadRight[Range[9-#],8," "],Reverse@k]&,8]

난 당신의 항목에서 영감을 그리드를 사용하여 4 문자를 저장했습니다.
DavidC


1

하스켈, 84

누군가를 개선하기위한 출발점 :

mapM_ putStrLn[let l=take(8-i)"12345678"++replicate i ' 'in l++reverse l|i<-[0..7]]

아마도 그 부분을 l++reverse l자유롭게 let만들어서 진술을 제거 할 수 있었을 것입니다. 그러나 내가 찾을 수있는 것은 ap수입이 필요합니다.


1

포스트 스크립트 : 105 자

PS에서는 문자열 처리가 쉽지 않지만 비교적 간단한 코드를 만들 수 있습니다.

0 1 7{(1234567887654321)dup
8 3 index sub(              )0 6 -1 roll 2 mul getinterval putinterval =}for

120 자에서 약간 더 긴 버전이지만 두 번째 줄의 시작 부분에있는 8을 1에서 9 사이의 숫자로 바꾸면 다른 숫자의 아치를 생성 할 수 있습니다.

/D{dup}def/R{repeat}def/P{=print}def
8 D -1 1{1 1 index{D P 1 add}R pop 2 copy sub{(  )P}R D{D P 1 sub}R pop()=}for pop

PostScript를 좋아하는 사람은 내가 아닙니다.
AJMansfield

1

GoRuby 2.1

36 자

8.w(1){|x|a=[*1..x].j.lj 8;s a+a.rv}

언 골프

8.downto(1) do |x|
  a = [*1..x].join.ljust(8)
  puts a + a.reverse
end

1

K 20

{x,'|:'x:|x$,\$1+!x}    

q)k){x,'|:'x:|x$,\$1+!x}8    
"1234567887654321"    
"1234567  7654321"    
"123456    654321"    
"12345      54321"    
"1234        4321"      
"123          321"    
"12            21"    
"1              1"    

1

TSQL, 148

편집 : manatwork의 제안으로 148까지 낮추고 주문으로 조정하십시오.

읽을 수있는 :

WITH t AS(
    SELECT 1n, CAST(1 AS VARCHAR(MAX)) o
 UNION ALL
    SELECT n+1,o+CHAR(n+49)
    FROM t
    WHERE n<8
)
SELECT o  + SPACE(16-2*n) + REVERSE(o)
FROM t
ORDER BY 1 DESC

골프 :

WITH t AS(SELECT 1n,CAST(1AS VARCHAR(MAX))o UNION ALL SELECT 1+n,o+CHAR(n+49)FROM t WHERE n<8)SELECT o+SPACE(16-2*n)+REVERSE(o)FROM t ORDER BY 1DESC

산출:

1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

1
좋은데 그러나 153자를 세는 형식으로 게시 할 수 있습니까? 어쨌든, 당신은 숫자를 사용하여 두 문자를 마련 할 수있는 1대신 문자열 '1'위치를 바로 cast그것으로 varchar. 이것은 나에게 149자를 준다 : with t as(select 1n,cast(1as varchar(max))o union all select n+1,o+char(n+49)from t where n<8)select o+space(16-2*n)+reverse(o)from t order by o desc.
manatwork

@ manatwork : 계속 낮아지기 때문에 153 숫자를 재현 할 수 없었습니다. 그래도 당신의 제안을 적용했습니다. 감사!
편안하게

1

하스켈, 79

r n x|x>n=' '|True=x
t="87654321"
main=mapM(putStrLn.(`map`("12345678"++t)).r)t

이것은 문자> n을로 대체하여 작동합니다 ' '. 여기서 문자 n은 "87654321"(소스 대체를 수행 할 문자열의 꼬리 부분)에서 제공됩니다.


1

PHP : 61 자 (또는 \ n을 실제 ASCII 줄 바꿈으로 바꾸면 60 자)

(GigaWatt와 HamZa의 답변에서 영감을 얻음)

for($n=9;$n;$r[$n--]=" ")echo strtr("1234567887654321\n",$r);

http://ideone.com/FV1NXu


1

PowerShell : 38

골프 코드

8..1|%{-join(1..$_+"  "*(8-$_)+$_..1)}

연습

8..1|%{... }8에서 1까지의 정수를 ForEach-Object 루프로 파이프합니다.
-join(... )중첩 된 코드의 출력을 분리 문자없이 단일 문자열로 결합합니다.
1..$_루프에서 1에서 현재 정수로 오름차순으로 정수를 출력합니다.
+" "*(8-$_)8과 현재 정수의 차이를 곱한 이중 공백을 출력에 추가합니다.
+$_..1현재 정수에서 1로 내림차순으로 정수를 출력에 추가합니다.


1

람다가 포함 된 자바 스크립트, 147

(s="12345678")[r="replace"](/./g,i=>s[r](RegExp(".{"+(i-1)+"}$"),Array(i*2-1).join(" ")))[r](/\d{1,8} */g,m=>m+(Array(m%10+1).join(m%10+1)-m)+"\n")

Firefox에서 확인할 수 있습니다.



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