现在我知道了我的ABC,您会不会和我一起打高尔夫球?


46

编写一个程序或函数,输出不区分大小写的确切文本:

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

(基于许多美国孩子学习的字母歌曲,尽管对其进行了编辑以提高可压缩性,但它们仍有助于记忆该字母。)

输出必须看起来完全相同上述(再次,不区分大小写),但也可以包含在每一行和/或后换行符尾随空格。注意最后的句点。

这是代码高尔夫球,因此以字节为单位的最短代码获胜。


4
对于基于正则表达式的语言,请考虑使用0宽前瞻.../(?=[HQTW])/
Magic Octopus Urn

29
我以为是H, I, J, K, LMNO, P
恢复莫妮卡

7
最后一行不应该以“ Y和Z”结尾吗?
KM。

@KM。我们在沙盒中对此进行了讨论,我们决定继续使用该版本,以简化挑战。
ETHproductions '16

6
高尔夫似乎很无聊。板球更好。
Manoj Kumar

Answers:


15

VIM,42,40的击键/字节

:h<_<cr>jjYZZP:s/./&, /g<cr>7f r<cr>9;.3;.3;.$ch.

感谢Lynn和她出色的vim答案,以获取从帮助中获取字母的提示。

感谢RomanGräf节省了两个字节!

说明:

:h<_<cr>                                      " Open up vim-help
        jj                                    " Move down two lines
          Y                                   " Yank this line (containing the alphabet)
           ZZ                                 " Close this buffer
             P                                " Paste the line we just yanked
              :s/./&, /g<cr>                  " Replace every character with that character followed by a comma and a space
                            7f                " Find the seven space on this line
                               r<cr>          " And replace it with a newline
                                    9;        " Repeat the last search (space) 9 times
                                      .       " Repeat the last edit (replace with a newline)
                                       3;     " Third space
                                         .    " Replace with newline
                                          3;  " Third space
                                            . " Replace with newline

然后,我们用移行的结尾,用$换回一个字符ch并插入一个点。


2
您不能转换为大写。OP说“此确切文本,不区分大小写”。
RomanGräf16年

@RomanGräf感谢您的提示!
DJMcMayhem

哈!从vim帮助中获取字母是天才!您知道吗,或者您是否正在寻找这项挑战?
Christian Rondeau

3
@christianRondeau我没有提出。林恩(Lynn)回答
DJMcMayhem

@RomanGräf+1禁止使用
FantaC

12

05AB1E,16个字节

A',â79334S£»¨'.J

说明:

A                  # Push the alphabet.
 ',â               # Cartesian product with ','.
    79334S         # Push [7, 9, 3, 3, 4].
          £        # Contigious substring, pushes the substrings [0:7], [7:7+9], 
                     [7+9:7+9+3], [7+9+3:7+9+3+3], [7+9+3+3:7+9+3+3+4].
           »       # Gridify, join the inner arrays with spaces and join those arrays
                     with newlines.
            ¨      # Remove the last character.
             '.J   # Append a '.'-character.

使用CP-1252编码。在线尝试!


11

Bash + GNU实用程序,36

  • 感谢Neil,节省了5个字节。
echo {A..Y}, Z.|sed 's/[HQTW]/\n&/g'

伊迪恩


2
为什么不只是echo {A..Y}, Z.|sed 's/[HQTW]/\n&/g'呢?
尼尔

@Neil Ooh很好!谢谢!
Digital Trauma

11

JavaScript(ES6),66 65字节

击败@Neil是不可能的...这就是为什么我做到了。:-)

f=(i=10)=>i>34?"z.":i.toString(++i)+","+` 
`[9568512>>i-9&1]+f(i)

由于@LevelRiverSt的技巧,高尔夫球了1个字节。使用String.fromCharCode时间增加了7个字节:

f=(i=65)=>i>89?"Z.":String.fromCharCode(i,44,i%86%83%80%71?32:10)+f(i+1)

这个怎么运作

这个递归生成字母表中的每个字符从ay,使用.toString()。在每个字母后添加逗号,如果9568512>>i-9&1为1,则加上换行符;否则为空格。当递归超过34,即到达时z,该函数仅返回"z."


等一下怎么办-请解释?:3
Downgoat

10

Python 2.7、67 66 63字节

a=65;exec"print'%c'%a+',.'[a>89]+'\\n'[a%42%39%9^2:],;a+=1;"*26

丹尼斯保存了一个字节。


使用exec代替for应该保存一个字节。
丹尼斯

6

果冻19 18 字节

ØAp”,ṁ79334DR¤GṖ”.

感谢@Adnan打高尔夫球1个字节!

在线尝试!

这个怎么运作

ØAp”,ṁ79334DR¤GṖ”.  Main link. No arguments.

ØA                  Yield "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
  p”,               Cartesian product with ','; append a comma to each letter.
             ¤      Combine the two links to the left into a niladic chain.
      79334D          Decimal; yield [7, 9, 3, 3, 4].
            R         Range; yield [[1, 2, 3, 4, 5, 6, 7], ..., [1, 2, 3, 4]].
     ṁ              Mold; reshape the array of letters with commata like the
                    generated 2D array.
              G     Grid; separate rows by spaces, columns by linefeeds.
               Ṗ    Pop; discard the last comma.
                ”.  Print the previous result and set the return value to '.'.
                     (implicit) Print the return value.

11
31秒?Dang ...
ETHproductions's

5

JavaScript(ES6),80 74字节

_=>[...`ABCDEFGHIJKLMNOPQRSTUVWXYZ`].join`, `.replace(/[HQTW]/g,`
$&`)+`.`

如果您可以算出如何使用ISO-8859-1编码,可能可以通过atob / btoa来缩短此时间。编辑:感谢@RickHitchcock,节省了6个字节。


1
@RickHitchcock是的,我在阅读PHP答案后才意识到自己。
尼尔

@RickHitchcock你想要.join`, `吗?在反引号之前放反斜杠。(是的,评论减价是不同的,感叹……)
Neil

5

Pyke,23 19 17字节

G\,J\.+2cu  /P

在这里尝试!

G\,J\.+        -    ",".join(alphabet)+"."
       2c      -   split(^, size=2)
            /  -  split_sized(^, V)
         u     -   yield list [7,9,3,3] (actual bytes `u%04%07%09%03%03`)
             P - print(^)

5

R,83 71字节

a=rbind(LETTERS[-26],","," ");a[3,7+3*c(0,3:5)]="\n";cat(a,"Z.",sep="")

在线尝试!

制作一个三行矩阵(一行带字母,一行带逗号,另一行带空格或换行符)。

编辑:谢谢Billywob!


cat(a,sep="")保存一些字节:a=rbind(LETTERS,","," ");a[3,7+3*c(0,3:5)]="\n";cat(a[,-26],"Z.",sep="")
Billywob '16

谢谢!这很有帮助!使用[-26]on LETTERS直接保存另一个字节。
plannapus

4

CJam,26个字节

'A79333Ab{{',S2$)}*N\}/'.@

在线口译

'A                             Push 'A'
  79333Ab                      Push [7 9 3 3 3]
         {           }/        For each number n in the previous array...
          {      }*              Execute n times...
           ',S                     Push a comma and a space
              2$)                  Copy last letter and increment
                   N\            Place a newline under the letter on top
                       '.@     Push '.' and rotate

4

Brainfuck,117个字节

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

前四行各有一个尾随空格,程序假定8位单元。在线尝试!

(处理最后一行很棘手...)


4

Perl,37个字节

学分@Dom赫斯廷斯该溶液(3字节比我短,见波纹管)。

say+(map"$_, ".$/x/[GPSV]/,A..Y),"Z."

使用-E(或-M5.010)标志运行:

perl -E 'say+(map"$_, ".$/x/[GPSV]/,A..Y),"Z."'

我以前的版本,长3个字节(共40个字节):

perl -E '$_=join", ",A..Z;s/[HQTW]/\n$&/g;say"$_."'

1
略有不同的方法(仍使用正则表达式...)获取37个字节:say+(map"$_, ".$/x/[GPSV]/,A..Y),"Z."
Dom Hastings

@DomHastings不错,做得好。用一个语句而不是三个语句会更漂亮!;-)
达达(Dada)

4

JavaScript(ES6),66 64字节

_=>`ABCDEFG
HIJKLMNOP
QRS
TUV
WXY`.replace(/./g,"$&, ")+"Z."

正则表达式匹配字符,但不匹配回车符,因此,使用正则表达式替换,我可以为每个字符添加“,”。

编辑:删除了2个字符,感谢ETHProductions


1
我不知道为什么其他JS高尔夫球手没有首先采用这种解决方案。在这里,进行投票。
Mama Fun

1
ang,真好!我认为,如果更改$1为,则可以删除正则表达式中的括号$&
ETHproductions

3

Cheddar,70个字节

->[65@"71,72@"80,"QRS","TUV","WXYZ"].map(@.chars.join(", ")).vfuse+'.'

看起来它并没有比这短。我使用了非常有趣的方法制作了其他版本,但这是最短的

在线尝试!

说明

->                        // Function with no arguments
  [                       // Array, each item represents a line
   65@"71,                // See below on what @" does
   72@"80,
   "QRS",
   "TUV",
   "WXYZ"
  ].map(                  // On each item...
    @.chars.join(", ")    // Join the characters on ", "
  ).vfuse                 // Vertical fuse or join by newlines
  + '.'                   // The period at the end

@"运算符用于生成字符串范围。它会生成一个从左字符代码到右字符代码的字符串。

例如,65对于字符代码A90Z。这样做65 @" 90会生成A到Z或字母。


3

C, 112 102 81个字节

感谢cleblanc和LevelRiverSt!

i,c;main(){for(c=64;++c<91;)printf("%c%c%c",c,44+c/90*2,c=="‌​GPSVZ"[i]?++i,10:32)‌​;}

不错的解决方案。您可以节省一些字节,因为44小于“ 1”,而46小于“ 1”。
cleblanc

无需声明int,也可以使隐式int成为可以,这只有101个字节i,c,d;main(){for(c=65;c<91;++c){if(c-"GPSVZ"[i])d=32;else d=10,++i;printf("%c%c%c",c,c-90?44:46,d);}}
cleblanc

您可以将此方法缩减为82个字节:i,c;main(){for(c=64;++c<91;)printf("%c%c%c",c,44+c/90*2,c=="GPSVZ"[i]?++i,10:32);}。请注意,您绝对可以在三元运算符的之间添加任何内容?:,甚至可以将多个表达式用逗号分隔(其结果取最后一个。)
Level River St

3

Brainfuck,157字节

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

在线尝试


3

Ruby,56个 54字节

$><<(?A..?Y).map{|c|c+('GPSV'[c]?",
":", ")}.join+"Z."

第一行以文字换行符结尾。

编辑:替换'A'..'Y'为保存了两个字节?A..?Y


3

Vim,32个字节

26o<C-V><C-V>64,<Esc>r.V{g<C-A>8Jj9Jj3Jj.j4JcH<C-R>"

在末尾留空行,这是允许的,但是很笨拙。更糟糕的是,我以插入模式结束。我在这里看到其他人这样做,所以我想这是允许的吗?有点脏

  • 26o<C-V><C-V>64,<Esc>:第一个<C-V>按字面意义插入第二个。<C-V>64这留在缓冲区中的s将变成ASCII码点,然后变成字母。逗号已加入。
  • r.:再也不会走到尽头了,.现在就做。
  • V{g<C-A>:使用视觉增量将所有64s转换为大写字母的ASCII代码点。
  • 8Jj9Jj3Jj.j4J:任意行连接。第一个8J不是7J因为我们要处理空白行。重复的3Js适用于点重复。
  • cH<C-R>":人们通常将其i<C-R>视为插入模式粘贴,但它更像是插入模式宏。like之类的东西<C-V>65将像键入一样运行,并解释为十进制代码点。这将在末尾留下一条多余的(允许的)行,并保持在插入模式。

4
如果您对政策有疑问(或缺乏政策),请使用meta而不是答案。
Mego

2

PowerShell v3 +,60 78 67字节

-join(65..90|%{[char]$_+'.,'[$_-le89]+" "+"`n"*($_-in71,80,83,86)})

好。这次,我实际上已经阅读,理解并遵循了规范。诺言。:D

获取数组65..90并遍历每个元素|%{...}。每次迭代,我们都使用串联,索引和乘法来构造一个新的字符串。

首先,我们将当前数字char转换为ASCII字母。基于'.,'是否索引我们是否在字符串90Z.而将其与另一个char串联在一起(即,占所有其余字符的逗号)。这是一个字符串," "用于与字母进行空格分隔,并"`n"基于布尔值对字符串进行乘法运算,以确定当前元素是否-in为指定数组(即,是否需要在换行符上进行连接)。结果字符串留在管道上。

这些字符串被封装在括号中,并-join一起编辑成一个新的字符串,然后也留在管道中,并Write-Output在最后隐式打印结果。由于我们`n在字符串中,因此在打印时会自动将其转换为换行符。

要求v​​3 +为-in操作员。每行都有一个尾随空格,根据挑战说明可以。

PS C:\Tools\Scripts\golfing> .\now-i-know-my-abc.ps1
A, B, C, D, E, F, G, 
H, I, J, K, L, M, N, O, P, 
Q, R, S, 
T, U, V, 
W, X, Y, Z. 

1
末尾的时间段缺失。
Downgoat

前四行的末尾不应该有逗号吗?
尼尔

@尼尔好肉汁。在我真正理解规范之前,我将删除它。
AdmBorkBork

2

PHP,62字节

<?=preg_filter("# ([HQTW])#","\n$1",join(", ",range(A,Z)));?>.

仅用于比较87字节

<?="A, B, C, D, E, F, G,\nH, I, J, K, L, M, N, O, P,\nQ, R, S,\nT, U, V,\nW, X, Y, Z.";

您可以使用实际的换行符代替来保存一个字节\n
Alex Howansky '16

由于允许在每行尾随空格,因此可以通过从正则表达式中删除空格来节省一个字节。另外,您还可以使用(在7.0中已弃用并删除)ereg_replace保存一个字节,因为它使您可以跳过正则表达式中的定界符。
user59178 '16

@ user59178我可以保存3个字节,但我会避免这种情况。是的,允许尾随空格。我可以将其写为正则表达式"# (?=[HQTW])#",并将替换操作缩短为"\n"相同的字节,并使其更清晰。使用不推荐使用的功能会使初学者感到困惑。而且物理中断可以在其他系统(然后是Unix)上解释为错误。您可以将其发布为您自己的建议。
约尔格Hülsermann

2

MATL,38 29字节

@Luis节省了9个字节!

1Y2X{', '&Zc46h1[CEII]I*11hY{

在线尝试!

说明

1Y2     % Push the upper-case alphabet to the stack
X{      % Break the character array into a cell array (similar to a list)
        % where each element is a letter
', '&Zc % Combine back into a string with ', ' between each element
46h     % Append '.' (via ASCII code) to the end of the string
1       % Push the number 1
[CEII]  % Push the array: [7, 9, 3, 3]
I*      % Multiply this array by 3: [21, 27, 9, 9]  
llh     % Append an 11 to this array: [21, 27, 9, 9, 11] 
Y{      % Break our comma-separated list of characters into groups of this size
        % Implicitly display the result

2

R,146字节

L=LETTERS
f=function(x,y=""){paste(x,collapse=paste0(", ",y))}
cat(f(c(f(L[1:7]),f(L[8:16]),f(L[17:19]),f(L[20:22]),f(L[23:26])),"\n"),".",sep="")

说明:

LETTERS为大写字母预定义。
f函数用于将向量x on ,与其他y字符连接(用于换行符)。
猫被用作\n换行符。f在字母上调用,以形成行,然后在行上再次调用,以形成整个输出。

大概是高尔夫-我不喜欢f ...


3
原始输出只有77个字节长。直接打印的时间可能会短一些……
Lynn

@Lynn,我知道,但是在这里我看到了一些打高尔夫球的可能性。
pajonk

2

CJam,31个字节

'[,65>", "*7933Ab{3*/(\:+}%N*'.

说明:

'[,65>                             push uppercase alphabet
      ", "*                        ", " between all letters
           7933Ab                  push [7 9 3 3]
                 {3*/(\:+}%        slices of lengths 21, 27, 9, 9
                           N*'.    join slices with newlines, add final "."

在线尝试


2

朱莉娅71字节

f()=join(join.(['A':'G','H':'P',"QRS","TUV","WXYZ"],[", "]),",\n")*"."

广播需要0.5或更高 .()


一方面,当前没有尾随期,并且不需要print/ function定义吗?另一方面,不保存join到变量将保存一个字节。
Sp3000

我的糟糕之处是缺少“。”,并感谢上的指针join。我算错了。运行程序将返回字符串。程序返回的字符串不是有效的输出吗?(或者是仅允许返回值的函数计为输出。如果这样的f()=函数比tnt短print()
Lyndon White

当然,f()=还是()->可以的-我认为功能是可分配的,可以多次运行,相反,这将是一个代码段。
Sp3000

2

Cheddar,57个字节

->(65@"90).sub(/[GPSV]/g,"$0
").sub(/[^Z\n]/g,"$0, ")+"."

在线尝试!那不漂亮吗?这是一个不错的矩形。

两个正则表达式替换。(65@"90)是大写字母,.sub(/[GPSV]/g,"$0\n")代替GPSV自身和"\n".sub(/[^Z\n]/g,"$0, ")替换所有非换行和Z字符本身", ",并"."增加了一个最后.


1
好的技术,出色的工作胜过了Downgoat;)
ETHproductions'Oct2''16 October 2,18

2

Japt,24个字节

;B¬qJ+S r"[HQTW]"@R+XÃ+L

在线测试!

这个怎么运作

;                        // Reset various variables. B is set to "ABC...XYZ", J is set to ",", and L is set to ".".
 B¬                      // Take the uppercase alphabet and split into chars.
   qJ+S                  // Join with ", ".
        r"[HQTW]"        // Replace each H, Q, T, or W with
                 @R+XÃ   //   a newline plus the character.
                      +L // Append a period to the result.
                         // Implicit: output last expression

2

Java中,116 109 105 104

String f(){String s="";for(char c=65;c<91;)s=s+c+(c>89?46:',')+("GPSV".indexOf(c++)<0?' ':10);return s;}

取消高尔夫:

String f() {
  String s = "";
  for (char c = 65; c < 91;) {
    s = s + c
      + (c > 89 ? 46 : ',')
      + ("GPSV".indexOf(c++) < 0 ? ' ' : 10);
  }
  return s;
}

您可以按7个字节打高尔夫球:所有三个|||(-3);更改c==90c>89(-1); 更改'.'46(-1); 并更改'\n'10(-2)。
凯文·克鲁伊森

@KevinCruijssen谢谢,我尝试使用小数,但是如果我将两个字符常量都替换为三进制,它将表达式类型更改为整数,这会破坏它。更改一个常数有效并挤出了几个字节。

2
@KevinCruijssen谢谢。如果我有足够的咖啡,我会记得自己更新它。

1
另外2个字节:"GPSV".contains(""+c)而不是c==71|c==80|c==83|c==86
TNT

1
@TNT我能够做得更好。我知道可以改进这一部分,这要归功于正确方向的推动。

1

q,46个字节

-1@'(", "sv/:0 7 16 19 22_,:'[.Q.A]),'",,,,.";

1

视网膜,43字节


Z
{2`
$`
}T01`L`_L
.
$&, 
[HQTW]
¶$&
, $
.

领先的换行很重要。 在线尝试!

这是我第一次使用Retina,因此非常感谢您打高尔夫球。


1

Pyth,25个字节

+Pjmj\ dc*G\,j94092 23)\.

一个将结果打印到STDOUT的程序。

在线尝试

这个怎么运作

+Pjmj\ dc*G\,j94092 23)\.  Program. Input: none
          G                Yield string literal'abcdefghijklmnopqrstuvwxyz'
         * \,              Cartesian product of that with ',', yielding a list of
                           characters with appended commas
             j94092 23)    Yield the integer 94092 in base-23, giving [7, 16, 19, 22]
        c                  Split the comma-appended character list at those indices
   mj\                     Join each element of that on spaces
  j                        Join that on newlines
 P                         All but the last element of that, removing trailing ','
+                      \.  Append '.'
                           Implicitly print
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.