绘制锯齿字母


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或函数调用或类似方式进行。输出到标准输出。
  • 上面的输入26不需要工作。
  • 没有尾随空格。

9
允许使用带有一个字母名称的编程语言吗?(C,J,K等)
isaacg 2014年

@isaacg当然。我以为在他们那里可能会更容易。
加尔文的爱好2014年

1
可以简单地将输入期望存储在变量中吗?
Martin Ender 2014年

@MartinBüttner是的,很好。
加尔文的爱好2014年

13
顺便说一句,这不是锯齿波,这是三角波:P
qwr14'-

Answers:


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-
马丁·恩德

我可以要求编译说明吗?cc给出错误“<bebe.c:1:17:错误: 'n'个未声明(在此函数首先使用)”。
manatwork

2
好吧,它比看起来差很多。首先,第二个包含尾随空格,其次,它们都依赖于将n全局变量设置为您选择的多个变量(如Martin先前所要求的)。
贝贝2014年

哦,所以我必须我所能提供n。大声笑。仍然印象深刻。
manatwork 2014年

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

感谢user2992539tolosedc65的改进。


3
您可以使用puts("")代替printf("\n")
2014年

2
保存4个字符p-=(c-n+r)%m*((c-n-r)%m)?0:printf("%*c",p,c+65);代替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 2014年

快速注释:代币化后,0→F它可以Delvar F节省1个字节,而您不能这样做。另外,由于坐标的内联布尔测试条件,我敢肯定您可以将输出/文本C+7→C
考虑在内

11

纯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

的JavaScript(ES6)231 244

编辑错误修复,一些重新排序和不同的高度管理方式== 1
此外,由于OP允许将其更改为函数,因此没有输入的hint()

无需对通用算法进行任何更改,这可能不是此挑战的最佳选择

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;。:-(
贾斯汀

但是您可以改善代码:消除循环头String x="ABC...Z";并替换为,我喜欢Java中的char =)for(char c...for (char c=65;++c<91;){
更加模糊的

进一步,您可以替换c=='J'c==74,总共节省两个字节。
瑕疵

2
我敢肯定,如果您对if语句使用一些XOR,那么您可以做得更好,但是这里是我的改进版本:(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; =)
瑕疵的

9

Ruby,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

让我知道是否需要澄清。


很小,但是您可以在之后删除空格%
卡尔文的爱好2014年

@ Calvin'sHobbies哈,我不相信我在此处高亮显示的语法:D。稍后将修复它。
Martin Ender 2014年

您可以替换puts o...$><<o...
约旦

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个动名词(一种名词化动词(又称函数)):

  • 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',该解决方案中的丑陋部分是8个字符,仅达到特殊情况下的高度1,但这可能会缩短一点。
b_jonas 2014年

谢谢你的建议!您的确确实短得多,而修改可能会过大。由于它是如此不同,也许您想自己将其发布为解决方案?
jpjacobs 2014年

规范说“没有尾随空格”,我的解决方案确实打印了尾随空格。
b_jonas 2014年

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 2014年

3

使用Javascript - 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都可以使用诸如|0或的整数强制操作进行更改~~。2:直接构建w数组要短一些,而无需splitfor(w=[],v=0;v<z;v++)w[v]="\n";
edc65 2014年

...并且没有输出语句(console.log或您在提琴中使用的任何内容,它是字符计数的一部分)
edc65 2014年

@ edc65谢谢您的提示。您是对的,我在这里忘记了输出,所以我添加了一个警报,但是没有单色间距的字体,因此看起来非常混乱。
伊兹林2014年

@izlin (i==9?" ":" ")可以使用代替(i^9?" ":" ")它来保存字符。
修订

1
救命!谁能解释?(为什么有两次<code> v = 0 </ code> ??)
更加模糊的

3

Perl 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向上移动,然后换行到第二列并到达B,那么您会在A和B之间找到四个空格。字母之间的这种间距模式非常规则:对于n = 4,图案是4 4 4 2 2 2 4 4 4 ...

因此,我们的想法是先构建展平(和转置)的数组,然后对其进行重新成形和翻转以使其看起来正确。输出例程很简单(至少为J):dtb是“删除尾随空白”,并"1说“在每一行上操作”。 dtbecho均由标准库提供。

感谢ZsbánAmbrus提供的高尔夫帮助。


3

MetaPost的(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 2014年

@ProgramFOX没关系。谢谢你!
Okw

我认为某处存在小错误,因为输出缓慢下降。(至少在Bash 4.3中。)一些较小的改进,以将大小减小到194个字符:在算术评估中省略了符号,不要在双引号字符串中使用双引号:pastebin.com/zKa3zdwR
manatwork

您可以使用换行符代替一些换行符,;以使其更具可读性吗?它不会影响您的高尔夫成绩
Digital Trauma 2014年

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 Int其中执行Int。您还可以添加

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

import文本文件中的s 下,使用进行编译ghc,然后将height作为命令行参数传递。非高尔夫版本:

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(使用Applicative实例的函数)来节省一些字节。
Esolanging Fruit '18

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(...),在lambda表达式开头的测试确定在i==2检查“ C” 时是生成字符还是空格,并将其转换为“ C#”或两个空格,具体取决于行。的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
这是一场失败的战斗,但我坚持认为:在许多情况下,无论是gcc还是任何其他编译器,都不需要#include <stdio.h>。无论如何,这是标准且有效的C语言。
edc65 2014年

2
@ edc65:取决于您认为的“有效C”。它是AFAIK有效的K&R C,但是ANSI / ISO C要求可变参数函数(包括scanfprintf)必须具有原型,否则您将获得不确定的行为。#include <stdio.h>当然,这是同时为scanf和提供原型的最短方法printf
celtschk 2014年

@celtschk有效的K&R在代码高尔夫方面对我来说足够了。“在许多情况下”(例如,仅使用认沽权时)是有效的C89。我要强调的是,这不是gcc的奇怪行为。(无论如何
也要

1
全局变量的类型为int,并且初始化为零。int如果您不返回任何内容,也可以对main进行drop 声明。可以删除多余的括号,替换' '32if(!C)m=c用ternarny语句,因为我刚刚学会(以上)代替printf("\n")puts("")18个字符: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

Javascript(204185150

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

即使我不太了解它,我也喜欢。但是无论如何,您都可以削减9个字符,删除substr并使用直接索引.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:142139个字符

可怕的是,我希望能够将其缩短一点:

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

Scala,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

的Python-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  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.