톱니 알파벳 그리기


42

오늘은 간단한 것입니다. 높이에 양의 정수가 주어지면 "톱니 알파벳"을 그리는 가장 짧은 프로그램을 작성하십시오. 프로그래밍 언어로 시작할 때 프로그래밍 언어의 이름을 작성해야합니다.

예를 들어, 언어가 Python이고 입력이 1출력 인 경우 다음과 같아야합니다.

ABCDEFGHIJKLMNOPythonQRSTUVWXYZ

입력이 2출력 이면 다음과 같아야합니다.

 B D F H J L N Python R T V X Z
A C E G I K M O      Q S U W Y

입력이 4출력 이면 다음과 같아야합니다.

   D     J     Python     V
  C E   I K   O      Q   U W
 B   F H   L N        R T   X Z
A     G     M          S     Y

노트

  • A 항상 왼쪽 하단에서 시작합니다.
  • 입력은 stdin 또는 function call 또는 이와 유사한 것을 통해 이루어질 수 있습니다. 표준 출력으로 출력합니다.
  • 위의 입력 26은 작동하지 않아도됩니다.
  • 후행 공백이 없습니다.

9
문자 이름이 하나 인 프로그래밍 언어가 허용됩니까? (C, J, K 등)
isaacg

@isaacg 물론입니다. 나는 그들이 더 쉬울 것이라고 상상할 것입니다.
Calvin 's Hobbies

1
입력을 변수에 간단히 저장할 수 있습니까?
Martin Ender

@ MartinBüttner 네, 좋습니다.
Calvin 's Hobbies

13
Btw, 이것은 톱니파가 아닙니다. 이것은 삼각파입니다. : P
qwr

답변:


14

n 이 높이를 보유하는 경우 :

C + 이스케이프 코드 : 81

x;main(y){for(y=n--;x<26;x++)printf("\033[%d;%dH%c",n?x/n&1?y++:y--:y,x+1,x+65);}

C : 110

x;char a[702]={[0 ...701]=32};main(y){for(y=--n;x<26;a[x*27-1]=10)a[27*(n?x/n&1?y++:y--:y)+x]=x+++65;puts(a);}

5
나는 패배를 인정한다. 지구상에서 무엇. : D
Martin Ender

컴파일 지침을 요청할 수 있습니까? cc"<bebe.c : 1 : 17 : error : 'n'undeclared (이 기능에서 처음 사용)"오류가 발생합니다.
manatwork

2
잘 보여요. 첫째, 두 번째는 후행 공백을 포함하며 두 번째 n는 마틴이 이전에 요청 한대로 선택한 여러 변수로 설정된 전역 변수 에 의존합니다 .
bebe

오, 그래서 내가 할 수있는 방법으로 n을 제공 해야 합니다. 롤 여전히 감동했습니다.
manatwork

19

C, 134

n,m,c,p;
main(r){
for(scanf("%d",&n),m=--n?n*2:1;n+r--;puts(""))
for(c=-1,p=1;c++<25;)
p+=(c-n-r)%m*((c-n+r)%m)?1:1-printf("%*c",p,c+65);
}

몇 가지 경고와 함께 gcc에서 컴파일합니다. 줄 바꿈은 문자 수에 포함되지 않습니다.

122 개 문자 입력이 이미 저장되어있는 경우 n.

개선을위한 user2992539 , tolosedc65 덕분에 .


3
puts("")대신 사용할 수 있습니다 printf("\n").
Somnium

2
p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);대신에 4자를 저장하십시오if((c-...

1
이전의 (삭제 된) 댓글에 대해 죄송합니다. 매개 변수가없는 경우 징후와 함께 연주하고 main의 첫 번째 인수가 1이라는 사실을 남용합니다. 134n,m,c,p; main(r){ for(scanf("%d",&n),m=--n?n*2:1;n+r--;puts("")) for(c=-1,p=1;c++<25;) p+=(c-n-r)%m*((c-n+r)%m)?1:1-printf("%*c",p,c+65); }
edc65

13

TI-BASIC-148 바이트 (원시 텍스트), 186 바이트 (그래픽)

OP에 응답하여 멋진 TI-83 (및 최신)은 16 x 8 크기 (표준 큰 텍스트 만 사용) 또는 94 x 62 픽셀 (작은 텍스트의 경우 약 10 줄) ).

이제 이것은 약간의 문제가 있습니다 (명백하고 싶습니다). 인터프리터는 크기 부과를 "무시"할 수 없습니다. 즉, 톱니 높이를 20으로 설정하려고하면 코드가 완전히 실행되지 못하게하는 오류가 발생합니다. 나는 는 시스템에서 실행하지 않을 제외하고, 무한 환경에서 올바른 출력을 생성 할 코드를 작성합니다.

이것을 말하면서, 프로그램의 (실행중인) 버전을 제시합니다. 그것들은 모두 N실행하기 전에 원하는 높이로 설정된 변수 에 따라 다릅니다 .

  • 원시 텍스트 접근

    :ClrHome
    :"ABCDEFGHIJKLMNOPQRSTI-BASICUVWXYZ"→Str1
    :8→R
    :For(C,1,16
    :If N=1
    :Then
    :0→F
    :Else
    :If R<2 or 10-R>N
    :1→F
    :If R>7
    :-1→F
    :End
    :If C≠20
    :Then
    :Output(R,C,sub(Str1,C,1
    :Else
    :Output(R,C,sub(Str1,C,8
    :C+7→C
    :End
    :R+F→R
    :End
    

    관계없이 단말기의 변경이 작업을하기 위해 For(C,1,16For(C,1,33과 상한 검사를 제거 ( R<2 or). 출력은 다음과 5→N같습니다.

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

  • 그래픽 접근 방식 ( AxisOff명확성 이 필요할 수도 있음 )

    :ClrDraw
    :N*6→N
    :"ABCDEFGHIJKLMNOPQRSTI-BASICUVWXYZ"→Str1
    :57→R
    :For(C,1,56
    :If N=6
    :Then
    :0→F
    :Else
    :If R<7 or 64-R>N
    :6→F
    :If R>51
    :-6→F
    :End
    :If C≠20
    :Then
    :If C>50
    :Then
    :Text(R,C,sub(Str1,C-23,1
    :Else
    :Text(R,C,sub(Str1,C,1
    :End
    :Else
    :Text(R,C,sub(Str1,C,8
    :C+30→C
    :End
    :R+F→R
    :End
    

    이것은 두 가지 사소한 문제로 정상적으로 작동합니다. 너비는 문제가 없지만 높이는 여전히 문제가됩니다. 그러나 나는 글자의 간격을 두지 않았으므로 어떤 경우에는 (문자가 톱니에서 오르거나 떨어지기 시작할 때) 글자가 후계자에 의해 잘릴 수 있습니다. 터미널에 관계없이 작동하게하려면 상한 검사 ( R<7 or)를 제거하십시오 . 그런 다음 그래프를 따릅니다.

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


이제 이것을 그래프 계산기로 포팅 해야 합니다
Liam McInroy

빠른 의견 : 토큰 화되면 1 바이트를 절약 0→F할 수 있습니다 Delvar F. 또한, 나는 당신이 좌표에 대한 인라인 부울 테스트 조건에 대한 최종 감사 향해 출력 / 텍스트를 인수 분해 할 수있어,과에 대한 C+7→C짧은에 쓰기 있으면 (다음 / 다른 / 끝)
Adriweb

11

Pure Bash (coreutils 없음), 181 바이트

m=$1
for l in A Bash {C..Z};{
((m))||s=++
((m>$1-2))&&s=--
for((m=$1==1?1:m,m$s,i=0;i<$1;i++));{
((i-m))&&a[i]+=${l//?/ }||a[i]+=$l
}
}
shopt -s extglob
printf %s\\n "${a[@]%%+( )}"

산출:

cat -E후행 줄 바꿈이 없음을 증명하기 위해 파이프되었습니다 .

$ ./sawtooth.sh 1 | cat -E
ABashCDEFGHIJKLMNOPQRSTUVWXYZ$
$ ./sawtooth.sh 5 | cat -E
       E       M       U$
      D F     L N     T V$
     C   G   K   O   S   W$
 Bash     H J     P R     X Z$
A          I       Q       Y$
$ 

10

자바 스크립트 (ES6) 231 244

버그 수정, 일부 재정렬 및 ​​높이 = 1을 관리하는 다른 방법 편집
또한 OP에서 허용하는 함수로 변경되었으므로 입력에 대한 prompt ()가 없습니다.

이 과제에 가장 적합하지 않은 일반 알고리즘에는 변경 사항이 없습니다.

F=h=>{for(p=s=[i=z=b=t=''];++p<h;)i=1,z=b=' ',s[p]=t;for(p=--h,k=64;++k<91;)s[p]+=t+String.fromCharCode(k),k-74||(s=s.map((x,q)=>x+(p-q?'         ':'avascript'))),p-=i,p<0|p>h?(i=-i,p-=i+i,t=z,b=t+t):t+=b;console.log(s.join('\n'))}

설명

F=h=>{
  // row in s for output must be initialized to ''. In the same step I make other initializations
  for(p=s=[i=z=b=t='']; ++p < h;) // initialize for height 1, all increment and spacing can be null
    i=1,z=b=' ',s[p]=t; // the for body is entered only if height > 1, initializing spacing and increment to the right values
  for(p=--h,k=64;++k<91;)
    s[p]+=t+String.fromCharCode(k),
    k-74||(s=s.map((x,q)=>x+(p-q?'         ':'avascript'))), // if 'J' modify each line of output adding the name or spacing
    p-=i,p<0|p>h?(i=-i,p-=i+i,t=z,b=t+t):t+=b; // index bouncing
  console.log(s.join('\n'))
}

1

ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ

3가

  C   G            K   O   S   W
 B D F H Javascript L N P R T V X Z
A   E   I            M   Q   U   Y

상단에 4

   D     Javascript     P     V
  C E   I          K   O Q   U W
 B   F H            L N   R T   X Z
A     G              M     S     Y

7 추락

      G                    S
     F H                  R T
    E   I                Q   U
   D     Javascript     P     V
  C                K   O       W
 B                  L N         X Z
A                    M           Y

9

자바 (393)

항상 골프를위한 훌륭한 언어 :

public class P{public static void main(String[]a){int h=Integer.valueOf(a[0]);String x="ABCDEFGHIJKLMNOPQRSTUVWXYZ";String[]l=new String[h];Arrays.fill(l,"");int i=h-1;int d=-1;for(char c:x.toCharArray()){for(int n=0;n<l.length;n++){String k=(n==i)?(c=='J')?"Java":c+"":(c=='J')?"    ":" ";l[n]+=k;}if(i==0&&d==-1)d=1;if(i==h-1&&d==1)d=-1;if(h>1)i+=d;}for(String s:l){System.out.println(s);}}}

2
불행히도에 대한 가져 오기를 잊었습니다 java.util.Arrays;. :-(
Justin

그러나 코드를 개선 할 수 있습니다 String x="ABC...Z";. for(char c...루프 헤더를 제거 하고로 바꾸십시오 for (char c=65;++c<91;){. Java에서 chars를 좋아합니다.)
flawr

또한로 대체 c=='J'하여 c==74총 2 바이트를 더 절약 할 수 있습니다 .
flawr

2
if 문에 XOR을 사용하면 if를 압축하면 더 잘 할 수 있다고 확신하지만 여기에 내 개선 버전이 있습니다. (325) public class p{public static void main(String[]a){int h=Integer.valueOf(a[0]),i=h-1,d=-1,n;String[]l=new String[h];for(n=0;n<h;l[n++]="");for(char c=64;++c<91;){for(n=0;n<h;n++){String k=n==i?c==74?"Java":c+"":c==74?" ":" ";l[n]+=k;}if(i==0&d==-1)d=1;if(i==h-1&d==1)d=-1;i+=h>1?d:0;}for(String s:l)System.out.println(s);}}@Quincunx : 더 이상 import.util.Arrays; =)
flawr

9

루비, 112 바이트

o="#{' '*29}
"*h
26.times{|i|o[(h-i%(h<2?1:2*h-2)-1).abs*30+i+(i>17?3:0)]=(i+65).chr}
puts o.gsub('R   ','Ruby')

에 입력이 저장 될 것으로 예상합니다 h.

설명이 필요한지 알려주세요.


매우 작지만 뒤에 공백을 제거 할 수 있습니다 %.
Calvin 's Hobbies

@ Calvin'sHobbies Ha, 나는 강조하는 구문을 믿지 않았다 : D. 나중에 고칠 것입니다.
Martin Ender

당신은 대체 할 수 있습니다 puts o...$><<o....
Jordan

6

J : 75 바이트

NB. without IO |:26([:u:65+i.@[)`(($(,|.@}.@}:)@i.)<"1@,.i.@[)`(' '$~,~)}5
2(1!:2)~|.26([:u:65+i.@[)`(($(,|.@}.@}:)@i.)<"1@,.i.@[)`(' '$~,~)}".1!:1[1

훌륭한 Amend 결합 사용 . 평소와 같이 IO는 추악하고 어수선합니다. 핵심 솔루션에는 3 가지 gerund (일명 명사 동사 (일명 기능))가 사용됩니다.

  • a) 알파벳 생성
  • b) 지수 생성
  • c) 수정을위한 매트릭스 생성

    x (a bc}) y

a) ascii 테이블에서 아주 사소한 조회입니다.

c) 훨씬 더 사소하다

b) 흥미로운 것이다. 사기는 가로 인덱스가 0에서 y-1로 시작하여 아래로 내려 26 번 반복된다는 것입니다. 예 : y == 4 :

0 1 2 3 2 1 0 1 2 3 2 1 ...

이것을 구현하면 b)는 다음과 같습니다.

($(,|.@}.@}:)@i.) <"1@,. i.@[)       NB. is equivalent too
(tine0 tine1 tine2)                  NB. a fork with tines defined as
tine0 =: 
  hook0 =: hook0_0 hook0_1           NB. a dyadic hook: x (g h) y -: x g h y
     hook0_0 =: $                    NB. reshape
     hook0_1 =: (hook1_0 hook1_1)@i. NB. do hook1 after making 0-y
       hook1_0=: ,                   NB. append to self
       hook1_1=: |.@}.@}:            NB. rotated version of y after beheading and curtailing
tine2 =: i.@[                  NB. generate 0-x
tine1 =: <"1@,.                NB. glue together coordinates.

그리고 그렇습니다, 사실 : J의 이름은 ... "J"입니다.


수정을 사용할 가치가 있습니까? 이 같은 말을 나에게 쉽게 보인다 3 :'|:(26$1+(i.1=y),}:|i:<:y)|.@{."+u:65+i.26'해당 솔루션의 추악한 부분은 단지 특별한 경우 높이 1에 8 자입니다, 그러나 이것은 아마 조금 단축 할 수있다.
b_jonas

제안 해 주셔서 감사합니다! 당신은 실제로 훨씬 짧으며 수정은 아마도 과잉 일 것입니다. 너무 다르므로 직접 솔루션으로 게시하고 싶습니까?
jpjacobs

사양에 "후행 공백 없음"이라고 표시되고 내 솔루션은 후행 공백을 인쇄합니다.
b_jonas

5

R (204)

f=function(x) {
  m=matrix(" ",x,26)
  i=x
  d=ifelse(x==1,0,-1)
  for (j in 1:26) {
    m[i,j]=LETTERS[j]
    if (!((i+d) %in% 1:x)) d=-d
    i=i+d
  }
  for (i in 1:x) cat(m[i,],"\n",sep="")
}

결과

> f(1)
ABCDEFGHIJKLMNOPQRSTUVWXYZ
> f(2)
 B D F H J L N P R T V X Z
A C E G I K M O Q S U W Y 
> f(3)
  C   G   K   O   S   W   
 B D F H J L N P R T V X Z
A   E   I   M   Q   U   Y 
> f(7)
      G           S       
     F H         R T      
    E   I       Q   U     
   D     J     P     V    
  C       K   O       W   
 B         L N         X Z
A           M           Y 

난 당신이 무슨 짓을했는지 참조! 매우 똑똑 ...
Kroltan

1
깔끔한 +1! for그러나 문장 주위의 공백을 제거 할 수 있습니다 (예 for(i in 1:x)cat(...를 들어) %in%.
plannapus

3

자바 스크립트 - 248 224 235

z=~~prompt(),y="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");y[9]="Javascript";for(w=[],v=0;v<z;v++)w[v]="\n";v--;for(i=0;i<26;i++){for(j=0;j<z;j++)w[j]+=j-v?i-9?" ":"          ":y[i];~~(i/(z-1))%2?v++:v--;}if(z==1)w=y;console.log(w.join(""))

다음 은 테스트 할 수있는 jsfiddle에 대한 링크입니다.
편집 : 고정 폭 글꼴에 대한 콘솔 로그를 작성하고 input == 1 인 경우 쉼표를 제거했습니다.


제안 : 1 : parseInt와 Math.floor는 모두 |0or 와 같은 정수 강제 연산으로 변경할 수 있습니다 ~~. 2 :없이 w 배열을 직접 빌드하는 것이 더 짧습니다 split. for(w=[],v=0;v<z;v++)w[v]="\n";
edc65

... 그리고 출력 문장이 없습니다 (console.log 또는 바이올린에서 사용하는 것은 문자 수의 일부입니다)
edc65

@ edc65 팁 감사합니다. 내가 여기에 출력을 잊어 버렸으므로 경고를 추가했지만 모노 간격 글꼴이 없으므로 혼란 스럽습니다.
izlin

@izlin 대신을 (i==9?" ":" ")사용 (i^9?" ":" ")하여 문자를 저장합니다.
rev

1
도움! 누구든지 설명 할 수 있습니까? (왜 <code> v = 0 </ code>의 두 배입니까?)
flawr

3

펄 119

$s.=/26/?++$r&&$/:$m-1&&$r-abs$_%(2*$m-2)+1-$m?$"x(1+3*/15/):/15/?Perl:(A..Z)[$_]for(0..26)x($m=<>);print$s=~s/\s+$//rg

이 프로그램은 입력을 STDIN받아 결과를에 인쇄합니다 STDOUT.

그리고 보너스-후행 공백을 인쇄하면서 규칙에 위배되는 버전이지만 상호 작용을 추가합니다.

#!/usr/bin/perl -p
$r=0;$_=join'',map{/26/?++$r&&$/:$m-1&&$r-abs$_%(2*$m-2)+1-$m?$"x(1+3*/15/):/15/?Perl:(A..Z)[$_]}(0..26)x($m=$_)

... 아래 몇 가지 테스트가 있습니다.

1
ABCDEFGHIJKLMNOPerlQRSTUVWXYZ
2
 B D F H J L N Perl R T V X Z
A C E G I K M O    Q S U W Y
4
   D     J     Perl     V
  C E   I K   O    Q   U W
 B   F H   L N      R T   X Z
A     G     M        S     Y
6
     F         Perl         Z
    E G       O    Q       Y
   D   H     N      R     X
  C     I   M        S   W
 B       J L          T V
A         K            U

3

J, 67 57 61 자

echo@dtb"1@|.@|:@(26&,$(u:65+i.26)#~1 j.26$(0#~1=]),<:#-&0 2)

함수로 사용 :

   echo@dtb"1@|.@|:@(26&,$(u:65+i.26)#~1 j.26$(0#~1=]),<:#-&0 2)
   D     J     P     V
  C E   I K   O Q   U W
 B   F H   L N   R T   X Z
A     G     M     S     Y

설명 : 이 솔루션은 다른 J 솔루션과 다른 접근법을 사용합니다. 톱니파 0 1 2 3 2 1 0 1 ... 을 생성하는 대신 연속 문자 사이의 간격을 살펴 보았습니다. 예를 들어, 대한 N = 4 는 위쪽으로는 A에서 갈 경우, 당신은 A와 B 사이에 네 개의 공간 문자 사이의 간격이 패턴을 발견, 두 번째 열 및 도달 범위 B에 이상 포장은 매우 규칙적 : 대한 N = 4 패턴은 44 4 2 2 2 4 4 4 ... 입니다.

따라서 아이디어는 먼저 평평한 (및 전치 된) 배열을 만든 다음 다시 모양을 바꾸고 뒤집어 보는 것입니다. 출력 루틴은 간단합니다 (적어도 J 인 경우). dtb 는 "후행 공백 삭제"이고 "1"각 라인에서 조작"이라고 말합니다. dtbecho 는 모두 표준 라이브러리에서 제공합니다.

골프를 도와 준 Zsbán Ambrus 에게 감사드립니다 .


3

메타 포스트 (207)

numeric h,d,y;h=5;d=-1;y=1;u=5mm;pair p;string s;for x=1upto26:p:=(x,y)*u;s:=char(x+64);if x=13:s:="MetaPost";elseif x>13:p:=(x+2,y)*u;fi;label.rt(s,p);if(y=h)or(y=1):d:=d*-1;fi;if h=1:d:=0;fi;y:=y+d;endfor;

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

여기서 시도해보십시오 .


2

배쉬 (213) (223)

read i
p=0
d=1
printf '\n%.0s' `seq $i`
for l in {A..Z}
do (($p==$i-1))&&((p=$p*-1))
(($i==1))&&p=0
(($p!=0))&&echo -en "\033[s\033[${p#-}A"
[[ "$l" == "B" ]]&&l="Bash"
echo -en $l"\033[s\033[${p#-}B"
((p++))
done

약간의 조정과 우리는 213으로 떨어졌습니다.

원래는 사소한 버그가있었습니다. bash 버전 4.2.37에서 작동하는지 테스트하고 확인했습니다.

버그와 몇 가지 팁을 지적한 @manatwork에게 감사합니다.


구문 강조 표시를 추가하여 게시물을 편집했지만 코드의 일부를 주석으로 잘못 강조 표시하여 롤백했습니다. 내가 왜 롤백했는지 궁금해하는 경우에 대비해 방금
ProgramFOX

@ProgramFOX 괜찮습니다. 어쨌든 고마워!
Okw

출력이 천천히 내려 가면서 어딘가에 작은 버그가 있다고 생각합니다. (적어도 Bash 4.3에서) 크기를 194 자로 줄이기위한 약간의 개선 사항 : 산술 평가에서시길을 생략하고 큰 따옴표로 묶인 문자열 내부를 큰 따옴표로
묶지 마십시오

;좀 더 읽기 쉽도록 줄 바꿈 대신 줄 바꿈을 사용할 수 있습니까? 골프 점수에는 영향을 미치지 않습니다
Digital Trauma

2

Haskell – 432 바이트 (불행히도 ...)

이것은 내가 순수하게 달성 할 것으로 예상했던 것보다 훨씬 어려워서 무거운 바이트 수입니다. 나는 (또는 누군가) 더 잘할 수 있다고 확신하지만, 이것에 너무 많은 시간을 보냈습니다. 골프 버전은 다음과 같습니다.

import Data.Matrix
import Data.Vector(toList)
r=repeat
s h=y h$l(take 26(case h of 1->r 1;_->concat$r$[h,h-1..1]++[2..h-1]))['A'..'Z']$matrix h 32(const ' ')<|>matrix h 1(const '\n')
l _[]m=m
l(x:i)(r:e)m=l i e$u m(let z=26-length i in if z<9 then z else z+6)x r
l _ _ m=m
u m c r h=case h of 'H'->t c r"Haskell"m;_->setElem h(r,c)m
t _ _[]m=m
t c r(x:i)m=t(c+1)r i$setElem x(r,c)m
y h m=concat[toList$getRow x m|x<-[1..h]]

실행하려면 코드를로드하고 원하는 높이가 있는 곳에서 ghci실행 하십시오. 당신은 또한 추가 할 수 있습니다putStr $ s IntInt

import System.Environment
main :: IO ()
main = fmap (s . read . head) getArgs >>= putStr

import텍스트 파일 의 s 아래 에서를 사용하여 컴파일 ghc하고 높이를 명령 행 인수로 전달하십시오. 언 골프 버전 :

import System.Environment
import Data.Matrix
import Data.Vector (toList)

main :: IO ()
main = fmap (sawtooth . read . head) getArgs >>= putStr

type M = Matrix Char

sawtooth :: Int -> String
sawtooth height = let mat     = matrix height 32 (const ' ') <|> matrix height 1 (const '\n')
                      numbers = take 26 (case height of 1 -> repeat 1
                                                        _ -> concat $ repeat $ [height,height-1..1]++[2..height-1])
                      chars   = ['A'..'Z']
                  in toString height $ makeMatrix numbers chars mat

makeMatrix :: [Int] -> String -> M -> M
makeMatrix []     []     mat = mat
makeMatrix (x:xs) (s:ss) mat = makeMatrix xs ss $ updateMatrix
                                                    mat (let z = 26 - length xs in if z < 9 then z else z + 6) x s
makeMatrix _      _      mat = mat

updateMatrix :: M -> Int -> Int -> Char -> M
updateMatrix mat col row char = case char of 'H' -> insertHaskell col row "Haskell" mat
                                             _   -> setElem char (row, col) mat

insertHaskell :: Int -> Int -> String -> M -> M
insertHaskell _   _   []     mat = mat
insertHaskell col row (x:xs) mat = insertHaskell (col+1) row xs $ setElem x (row, col) mat

toString ::Int -> M -> String
toString height mat = concat [ toList $ getRow x mat | x <- [1..height] ]

나는 당신이 바꿀 수 있다고 생각 constpure몇 바이트를 저장 (기능에 대한 실용적 인스턴스를 사용).
Esolanging Fruit

2

C # / LINQ :

using System;
using System.Linq;

namespace SawtoothAlphabet
{
    class Program
    {
        static void Main(string[] args)
        {
            int N = Int32.Parse(args[0]);   // eg 4
            Console.WriteLine(
                String.Join(Environment.NewLine, Enumerable.Range(0, N).Select(line =>
                    String.Concat(Enumerable.Range(0, 26).Select(i =>
                        line == Math.Abs(i % (2 * (N - 1)) - (N - 1))
                            ? (i == 2) ? "C#" : Char.ConvertFromUtf32(i + 'A')
                            : (i == 2) ? "  " : " ")
            ).TrimEnd())));
        }
    }
}

간단한 설명 : Enumerable.Range(0, N).Select(...)각 줄에 대해 문자열이 생성되어 결국에는 단일 문자열로 연결됩니다 String.Join(Environment.NewLine, ...). 을 사용하여 26 개의 문자를 모두 순환하는 각 행 Enumerable.Range(0, 26).Select(...)에 대해 람다 식 시작시 테스트는 i==2"C"를 검사 하는 동안 문자 또는 공백을 생성할지 여부를 결정 하고이를 행에 따라 "C #"또는 2 개의 공백으로 변환합니다. . String.Concat(...)변환의 결과 IEnumerable<char>로 전달하기 전에 문자열로 라인마다 TrimEnd(...)완전히 벗겨 후행 공백한다.


1

PHP (216) (205)

새로운 버전:

$b=array_fill(65,26,' ');$b[80]='   ';$b=array_fill(0,$i,$b);for($j=--$i,$x=64;++$x<91;$i||$j=0){$b[$j][$x]=chr($x);$x==80&&$b[$j][$x]='PHP';$j+=($d=$j<($d?$i:1))*2-1;}echo join("\n",array_map('join',$b));

구 버전:

$b=array_fill(0,$i,array_fill(0,28,' '));for($j=--$i,$x=-1;++$x<28;$i||$j=0){$q=&$b[$j];$q[$x]=chr($x-($x&16)/8+65);$x==15&&($q[++$x]='H')*$q[++$x]='P';$j+=($d=$j<($d?$i:1))*2-1;}echo join("\n",array_map('join',$b));

변수 $ i가 높이가 될 것으로 예상합니다.


1

C, 214 (169) 바이트의 후미 구역

유용한 제안에 대해 @ edc65와 @tolos에게 감사합니다.

#define C ((c-i+n-65)%z&&(c+i+n-67)%z)
n,i,m,c,z;main(){scanf("%d",&n);z=n<2?1:2*n-2;for(;i++<n;){for(m=c=64;c++<90;)m=C?m:c;for(c=64;c++<m;)putchar(C?32:c);puts("");}}

3
그것은 잃어버린 싸움이지만, 나는 계속한다 : #include <stdio.h>는 gcc 또는 다른 컴파일러 일지라도 많은 경우에 필요하지 않습니다. 어쨌든 표준이고 유효한 C입니다.
edc65

2
@ edc65 : "유효한 C"에 따라 다릅니다. AFAIK의 유효한 K & R C이지만 ANSI / ISO C에서는 가변성 함수 ( scanf및 포함 printf)에 프로토 타입을 제공해야합니다. 그렇지 않으면 정의되지 않은 동작이 발생합니다. #include <stdio.h>물론 scanf및에 프로토 타입을 제공하는 가장 짧은 방법 printf입니다.
celtschk

@celtschk 유효한 K & R은 코드 골프에서 충분합니다. 그리고 '많은 경우'(예를 들어 puts를 사용하는 경우)는 유효한 C89입니다. 내가 스트레스를 원하는 것은 gcc의 이상한 행동이 아니라는 것입니다. (어쨌든 가변 기능에 대한 참고 사항에 대한
감사

1
전역은 int 유형이며 0으로 초기화됩니다. int아무것도 반환하지 않으면 main에 대한 선언을 삭제할 수도 있습니다. 여분의 parens을 버리고 ternarny 문으로 대체 ' '하고 32, if(!C)m=c방금 배운 (위) 18 문자로 대체 할 수 printf("\n")있습니다 puts("").n,i,m,c,z;main(){;scanf("%d",&n);z=n<2?1:2*n-2;for(;i<n;i++){for(m=c=65;c<91;c++)m=C?m:c;for(c=65;c<=m;c++)printf("%c",C?32:c);puts("");}}

1

자바 스크립트 ( 204 185150 )

h=m=4;d=h>1?-1:0;o=[];for(a=0;a<35;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(a<9||a>17){m+=d;if(m<2||m==h)d=-d}}console.log(o.join("\n"))

편집하다

배열과 .join ( "\ n")을 빌드하지 않음으로써 13 바이트를 절약했습니다. for 루프를 뒤집어 야합니다. 그런 다음 C 코딩 아들의 도움으로 코드를 너무 영리하게하여 다른 12 바이트를 절약 할 수있었습니다.

다음은 로직 변경을 보여주는 읽을 수있는 버전입니다.

for (row = height; row; row--) {
    rowOfNextActiveLetter = 1;
    direction = height > 1 ? -1 : 0;
    output = "";
    for (a = 0; a < 35; a++) {
        output += (row == rowOfNextActiveLetter ? "ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a] : "");
        if (a < 9 || a > 17) {
            rowOfNextActiveLetter -= direction;
            if (rowOfNextActiveLetter < 2 || rowOfNextActiveLetter == height)direction = -direction
        }
    }
    console.log(output)
}

골프 (161) :

for(r=h;r;r--){m=1;d=h>1?-1:0;o="";for(a=0;a<35;a++){o+=(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(a<9||a>17){m-=d;if(m<2||m==h)d=-d}}console.log(o)}

골프와 난독 화 (149) :

for(r=h;r;r--,console.log(o))for(m=1,d=h>1?1:0,o="",a=0;a<35;)if(o+=r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ",a<9|a++>17)d=(m+=d)<2|m==h?-d:d

나는 그것을 완전히 이해하지 못하더라도 그것을 좋아한다. 그러나 어쨌든 substr을 제거하고 직접 색인을 사용하여 9 문자를자를 수 있습니다 .substr(a,1)=>[a]
edc65

비트 연산자를 사용하고 182의 병합 반복기를 사용하여 더 좁힐 수 있습니다. h=m=4;d=1<h?-1:0;o=[];for(a=0;35>a;a++){for(r=h;r;r--)o[r]=(o[r]||"")+(r==m?"ABCDEFGHIJavascriptKLMNOPQRSTUVWXYZ"[a]:" ");if(9>a|17<a)if(m+=d,2>m||m==h)d=-d}console.log(o.join("\n"))
WallyWest

멍청이, 너무 많은 공간을 청소
John Nowlin

1

K, 60 바이트

`0:'{+{x!y}.'+(26#{(!x),|1_!x-1}x;(((x-1)#" "),)'`c$65+!26)}

매우 간단하며 J 솔루션을 완성한 것처럼 보입니다. :)

먼저 알파벳을 생성하십시오.

  `c$65+!26
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

적절한 길이의 톱니파 :

  26#{(!x),|1_!x-1}5
0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0 1

알파벳의 각 문자를 선행 공백으로 채 웁니다.

  (((5-1)#" "),)'"ABC"
("    A"
 "    B"
 "    C")

알파벳과 구형파를 함께 ​​압축하고 각 행을 회전시킵니다.

  +(0 1 2;("  A";"  B";"  C"))
((0
  "  A")
 (1
  "  B")
 (2
  "  C"))

  {x!y}.'+(0 1 2;("  A";"  B";"  C"))
("  A"
 " B "
 "C  ")

그리고 그 전치가 우리의 대답입니다.

  +{x!y}.'+(0 1 2;("  A";"  B";"  C"))
("  C"
 " B "
 "A  ")

여기에 그것을 시도 OK .


0

C : (142) 139 자

엄청나게 오래, 나는 그것을 조금 단축 할 수있을 것으로 기대합니다 :

char a[26][27],i,j,p,d;main(n){for(scanf("%d",&n);i<26;d^=!p^p+2>n,p+=d-(d^n>1),i++)for(j=n;j--;a[j][i]=p^j?32:i+65);while(n)puts(a[--n]);}

약간 더 읽기 쉽다 :

char a[26][27], i, j, p, d;
main(n) {
    for (
        scanf("%d", &n);
        i < 26;
        d ^= !p ^ p + 2 > n,
        p += d - (d ^ n > 1),
        i++
    )
        for (
            j = n;
            j--;
            a[j][i] = p ^ j
                ? 32
                : i + 65
        );

    while (n)
        puts(a[--n]);
}

편집 : "후행 공백 없음"규칙을 놓쳤지만 돌아올 것입니다.


0

스칼라, 246 바이트

def f(h:Int)={val a=Seq.fill(h)(Array.fill(32)(' '));var(r,x,d)=(h-1,0,if(h==1)0 else-1);def p(c:Char){a(r)(x)=c;x+=1};for(c<-'A'to'Z'){p(c);if(c==83)"cala"foreach p;r+=d;if(r==0|r==h-1)d*= -1};for(z<-a)println(new String(z)replaceAll(" +$",""))}

재 포맷 및 의견 :

def f(h: Int) = {
  val a = Seq.fill(h)(Array.fill(32)(' '));
  // r - row; x - x coordinate, column; d - direction
  var (r, x, d) = (h - 1, 0, if(h==1) 0 else -1); 
  def p(c: Char) { // p for "put the character"
    a(r)(x) = c;
    x += 1
  };
  for(c <- 'A' to 'Z') { 
    p(c);
    if(c == 83)      // 83 == 'S'
      "cala" foreach p;
    r += d;
    if(r == 0 | r == h - 1)     // | is shorter than || 
      d *= -1
  };
  for(z <- a)
    println(new String(z) replaceAll (" +$", ""))  // trimming trailing whitespace
}

결과 :

scala> f(4)
   D     J     P         V
  C E   I K   O Q       U W
 B   F H   L N   R     T   X Z
A     G     M     Scala     Y

scala> f(5)
    E       M           U
   D F     L N         T V
  C   G   K   O   Scala   W
 B     H J     P R         X Z
A       I       Q           Y

scala> f(1)
ABCDEFGHIJKLMNOPQRScalaTUVWXYZ

0

파이썬-137

ieg에 저장 될 입력 i=8

l=[""]*h;k=j=0;y=h-1;exec'l[y]+=" "*(j-len(l[y]))+chr(k+65)+"ython"*(k==15);j=len(l[y]);y-=1^k/(h-(h>2))%2*-2;k+=1;'*26;print"\n".join(l)

0

라켓

다음은 깔끔한 기능 버전입니다. 환영을 줄이려는 제안입니다.

(define (sawtooth n)
  (define (ST i d m lns)
    (if (null? m) 
        lns
        (let* ([v (first m)]
               [spc (make-string (string-length v) #\space)]
               [I (+ i d)])
          (ST I
              (if (or (zero? I) (= (sub1 n) I)) (* d -1) d)
              (rest m)
              (for/list ([ln lns] [j n])
                       (~a ln (if (= i j) v spc)))))))
  (displayln
   (string-join 
    (ST (sub1 n)
        (if (= n 1) 0 -1) 
        (string-split "A B C D E F G H I J K L M N O P Q Racket S T U V W X Y Z")
        (make-list n "\n")))))

산출

> (sawtooth 1)
ABCDEFGHIJKLMNOPQRacketSTUVWXYZ

> (sawtooth 2)
 B D F H J L N P Racket T V X Z 
A C E G I K M O Q      S U W Y 

> (sawtooth 8)
       H                  V     
      G I                U W    
     F   J              T   X   
    E     K            S     Y  
   D       L     Racket       Z 
  C         M   Q               
 B           N P                
A             O  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.