受编程101任务的启发,这是一个希望不太容易或重复的任务(有点难以搜索这样的东西)。
输入:
- 一个正整数
n >= 1
。
输出:
n
星号行,其中每个新行都比前一行多一个星号,并且在第一行中以一个星号开头。
通用规则:
- 这是代码高尔夫球,因此最短的答案以字节为单位。
- 由于该课程是用C ++讲授的,所以我很想看到C ++的解决方案。
测试案例(n = 5):
*
**
***
****
*****
受编程101任务的启发,这是一个希望不太容易或重复的任务(有点难以搜索这样的东西)。
输入:
n >= 1
。输出:
n
星号行,其中每个新行都比前一行多一个星号,并且在第一行中以一个星号开头。通用规则:
测试案例(n = 5):
*
**
***
****
*****
Answers:
o <Esc><C-V>{r*J
在readahead缓冲区中接受输入,因此如果输入为15,则将其输入,然后输入上面的代码。这是一个愚蠢的规则,但似乎是允许的。如果您输入了类似的寄存器"a
,则只需@a
放在前面(10)。如果您是从起始文件中获得的,则可以添加D@"
(11)。
依靠滥用:set autoindent
,这在vimgolf.com规则中是默认值,而在Vim 8中是默认值(而且每个人都在使用它)。
o <Esc>
:使用数字参数,如果您的文本以空格开头,并且有:set autoindent
,Vim会跳出并创建一系列缩进。<C-V>{r*
:将所有这些空格变成*
s。我正在使用块可视化,这样,即使您糟糕的缩进设置将空格无声地分组到制表符中,您仍然可以获得正确的*
s数。J
:很o
遗憾,开头是空白。这将其删除。-u NONE
自己开了枪……这没用,似乎autoindent
在默认的vimrc中,而不是在vim 8本身中,所以我不得不手动将其打开。但是,为这个答案的精巧而致敬!但是为什么每行新行只有一个空格?为什么它只适用于空格而不适用于其他字符?看来我还有很多要学习的地方:)
O <Esc>
并不需要J
最后。
这包括前导和尾随的换行符。
我们从s
仅包含换行符的字符串开始。然后,我们处理n
递归调用,在每次迭代时在该字符串的左侧添加一个星号。所有中间字符串的串联导致预期结果。
f=(n,s=`
`)=>n?s+f(n-1,'*'+s):s
f=(n,s=`
`)=>n?s+f(n-1,atob`Kg`+s):s
s
。您可以使用来使它的神秘性稍差一些n?s+f(n-1,'*'+s):s
。
使用CP-1252编码。
'*×.p»
8字节无星号版本:
žQTè×.p»
说明
输入示例 n = 5
'* # push "*"
# STACK: "*"
× # repeat input number times
# STACK: "*****"
.p # get prefixes of string
# STACK: ['*', '**', '***', '****', '*****']
» # join by newlines
# implicit print
10žQSè×.p»
是此答案的逻辑扩展,用于获取赏金所需的内容,它只有10个字节。如果没有人击败10字节,那就给Emigna赏金。
TžQè×.p»
甚至是8个字节。
»
,这是一个专门用于将带有定界符的列表合并到字符串中的命令(并且S
会破坏该命令)。但是,很多05AB1E命令都可以向量化,是的。
1..$args[0]|%{'*'*$_}
从循环1
到输入$args[0]
,每次迭代都使用字符串乘法来构造一个有这么多个$_
星号的字符串。Write-Output
最后的隐式默认行为是使用换行符作为分隔符,因此我们免费获得它。
PS C:\Tools\Scripts\golfing> .\draw-asterisk-pattern.ps1 5
*
**
***
****
*****
PS C:\Tools\Scripts\golfing> .\draw-asterisk-pattern.ps1 2
*
**
PS C:\Tools\Scripts\golfing> .\draw-asterisk-pattern.ps1 7
*
**
***
****
*****
******
*******
i=1;exec"print'*'*i;i+=1;"*input()
i
初始化为1
;
然后exec
执行以下代码字符串的命令,因此必须对其进行构造;
字符串是"print'*'*i;i+=1;"
但*
后面的字符串优先于,exec
并指示首先重复字符串input()
时间;
的exec
命令现在执行长串的作用就像一个循环,print
荷兰国际集团增加的长度的另一个字符串,再次使用*
重复的字符'*'
,然后递增i
用i+=1
。
Python 3中,41个字节:
def f(n):i=1;exec("print('*'*i);i+=1;"*n)
; 要么
lambda n,i=1:exec("print('*'*i);i+=1;"*n)
”*ẋþY
”*ẋþY - Main link: n
”* - literal string "*"
þ - form outer product with the dyadic function:
ẋ - repeat list (right input is an implicit range(n), Jelly defaults to 1-based)
so the outer product is like:
[[i*'*' for i in range(1,len("*")+1)] for x in range(1,n+1)]
Y - join with line feeds
- implicit print
赏金:
我不知道no ordinals子句是什么,因为字符是对序数的查找。
直接查找也只是42Ọẋþ³Y
为7个字节 -在³
获取我们输入)
短略间接的方法是,为8个字节,“)’Ọẋþ³Y
-我们查找')'
在果冻的代码页,这是1 -索引,以便“)’
产生42。
f=n=>n<1?"":f(n-1)+"\n"+new string('*',n);
带有测试用例的完整程序:
using System;
namespace DrawAnAsteriskPattern
{
class Program
{
static void Main(string[] args)
{
Func<int,string>f= null;
f=n=>n<1?"":f(n-1)+"\n"+new string('*',n);
Console.WriteLine(f(5));
}
}
}
编辑:根据Riley的评论少4个字节
x;G;:;P;s:\n.:*\n:;t
运行示例:输入为一元格式,基于此共识允许sed
me@LCARS:/PPCG$ sed -nf draw_triangle.sed <<< "0000"
*
**
***
****
输出中存在前导换行符,但是OP允许这样做。
说明:
x;G # prepend a newline to unary string
: # start loop
P # print first line only
s:\n.:*\n: # shift one unary char from 2nd line to 1st, converted to a '*'
t # repeat
P
在换人之前努力,并且允许使用换行符,则不需要/0$/
。如果不允许换行,您仍然可以使用保存一个字节x;G;:;/*/P;s:\n.:*\n:;t
。我问了一个领先的换行符,但还没有回音。
#include<string>
int main(){int n;std::string s;scanf("%d",&n);for(;n--;)puts((s+="*").data());}
取消高尔夫:
//this one hurts, but c++ strings are mutable
#include<string>
int main(){
int n;
//this one hurts as well
std::string s;
//read input to n
//longer than 'std::cin>>n', but no #include<iostream> needed
scanf("%d",&n);
// same as 'while(n--)', also characterwise, but way cooler
for(;n--;)
//add a '*' the string
//data() does the same as c_str()
//puts automatically adds an '\n'
puts((s+="*").data());
}
yke:"*"rj@w\
假设尾随新行是可以接受的
yk The range [0, …, Input - 1]
e Take one element I of that range
:"*"rj Juxtapose "*" I times to itself
@w Write that string followed by a new line
\ False: backtrack to another element of the range
-:"*"rj:@[f~@nw
这是通过使用的所有前缀来实现的"*" × Input
。
清单理解归功于nimi:
f x=unlines[[1..n]>>"*"|n<-[1..x]]
旧版本:
f 0=""
f n=f(n-1)++([1..n]>>"*")++"\n"
备用版本:
g n=([1..n]>>"*")++"\n"
f n=[1..n]>>=g
([1..n]>>"*")
而不是replicate n'*'
保存一个字节。我也只计数39个字节。
f 0=""
被视为一个字节,但在某些文本编辑器中显示为两个字节/字符。
f x=unlines[[1..n]>>"*"|n<-[1..x]]
。
"*"
为\*
。
j*L\*S
(包含S
范围,将每个乘以*L
“ *” \*
,j
将oin 乘以换行符)Pyth在末尾插入一个隐式Q。
jm*\*h
也是6个字节。
>G')Ç>çJN×,
而且没有任何星号的迹象!感谢@Emigna从24到11打高尔夫球。
说明:
>G')Ç>çJN×,
> Push input+1
G For N in range (1,input+1)
')Ç>çJ Push '*' by getting ascii code for ')' and adding 1
Nx, Print '*' repeated N times
õVYI
不会以任何方式影响您的代码,可以将其删除。1+
与相同>
。如果在循环中创建星号,则也可以删除UX
。使用×
代替内部循环可以节省更多的字节。无需更改方法,您可以将其减少到11个字节或更少。
包括+3 -A
{(({})[()]<{({}[()]<(((((()()()){}()){})){}{})>)}{}((()()()()()){})>)}{}
说明:
{(({})[()]< >)}
#reduce the top element by one until it is 0 after doing the following
#Push this element back on to act as a counter for the next step.
#(counts down from input to 0 we'll call this counter)
{({}[()]< >)}
#reduce the top element by one until it is 0 after doing the following
#(counts down from counter to 0)
(((((()()()){}()){})){}{})
#push 42 (the ASCII code for *)
{}
#pop the counter used to push
#the right number of *s
((()()()()()){})
#push a 10 (newline)
{}
#pop the null byte
⌸
可以是一个字节:(,⍕⊢)⌸⍳
7 bytes<sup>SBCS</sup>
。
Àé
hòlÄ
!
<M-@><M-i>*h<M-r>l<M-D>x
(m代表meta,表示alt)。所有这些对于命令的作用都是非常好的助记符。
{.put for [\~] '*'xx$_}
(如果允许输出为不包含换行符的“行”列表,则.put for
可以将其删除)
# bare block lambda with implicit parameter 「$_」
{
.put # print with trailing newline
for # for every one of the following
[\~] # produce using concatenation operator
'*' xx $_ # list repeat '*' by the input
}
(produce
如果您不了解[\~] ...
正在做什么,请参阅文档)
say"*"x$_ for 1..pop
用-E
开关来运行它say
。
$ perl -E 'say"*"x$_ for 1..pop' 5
*
**
***
****
*****
作为一个完整的程序写出来,它看起来像这样:
use strict;
use feature 'say';
# get the argument
my $limit = pop @ARGV;
foreach my $i (1 .. $limit) {
say "*" x $i;
}
-E
标志算作1个额外的字节。
perl -E 'say"*"x$_ for 1..<>' <<< 5
-E
是免费的(因为它将替换-e
仍然需要的内容)。如果您真的想从命令行获取数字(为什么不这样做,即使<>
短了1个字节并允许),也应该使用pop
而不是shift
(短2个字节)!无论如何,欢迎使用PPCG,很高兴见到您打高尔夫球!
-4个字节感谢@Ton Hospel和他对解决方案的重做!
eval"s//*/;say;"x<>
需要free -E
(或-M5.010
)标志才能运行。从输入中获取一个数字:
perl -E 'eval"s//*/;say;"x<>' <<< "5"
eval
for
<>
pop
eval"s//*/;say;"x<>
多亏了英里,节省了3个字节!
]\@#&'*'
这是一个分解:
(]\@#&'*') x
x (]\@#) '*'
]\ (x # '*')
现在,最后一个读为“ ]\
由”的x
副本组成的字符串的前缀()'*'
。观察:
5 ]\@# '*'
*
**
***
****
*****
]\ 5# '*'
*
**
***
****
*****
]\ 5 # '*'
*
**
***
****
*****
]\@#&'*' 5
*
**
***
****
*****
f =: ]\@#&'*'
f 3
*
**
***
f 5
*
**
***
****
*****
f 1
*
f 2
*
**
f &. > ;/1+i.10
+-+--+---+----+-----+------+-------+--------+---------+----------+
|*|* |* |* |* |* |* |* |* |* |
| |**|** |** |** |** |** |** |** |** |
| | |***|*** |*** |*** |*** |*** |*** |*** |
| | | |****|**** |**** |**** |**** |**** |**** |
| | | | |*****|***** |***** |***** |***** |***** |
| | | | | |******|****** |****** |****** |****** |
| | | | | | |*******|******* |******* |******* |
| | | | | | | |********|******** |******** |
| | | | | | | | |*********|********* |
| | | | | | | | | |**********|
+-+--+---+----+-----+------+-------+--------+---------+----------+
'*'#~"+1+i.
这是等效的
'*' #~"0 1 + i.
1 + i.
是范围[1, x]
。然后,'*' #~"0
将的形状(元素)副本应用于'*'
。
奖励计划:
[:#&'*'\#&1
这是#&'*'\
应用于#&1
输入结果的带顶叉。#&1
给出的阵列x
的,并且#&'*'\
形状'*'
此阵列的前缀。
f1 =: '*'#~"+1+i.
f2 =: [:#&'*'\#&1
f1 1
*
f2 2
*
**
f1 3
*
**
***
f2 4
*
**
***
****
f2 5
*
**
***
****
*****
f1 5
*
**
***
****
*****
(f1;f2)3
+---+---+
|* |* |
|** |** |
|***|***|
+---+---+
f1;f2
f1 ; f2
(f1;f2)5
+-----+-----+
|* |* |
|** |** |
|*** |*** |
|**** |**** |
|*****|*****|
+-----+-----+
(f1;f2)10
+----------+----------+
|* |* |
|** |** |
|*** |*** |
|**** |**** |
|***** |***** |
|****** |****** |
|******* |******* |
|******** |******** |
|********* |********* |
|**********|**********|
+----------+----------+
n
的副本'*'
使用8个字节]\@#&'*'
'*'"0\@i.
O <esc>J:h r<cr>lyEZZ<C-v>{@"
巨大的信贷@Udioica能想出一个真棒VIM答案,我扩大了。这个答案不包含任何星号,以期赢得赏金。
说明:
在程序的其余部分之前输入输入。Udioica想出了这个很棒的技巧。<n>O <esc>
只要:set autoindent
启用,键入将创建空格和一条空行的金字塔。默认情况下,此选项在vim 8和neovim中启用,尽管较早版本的vim没有。由于这还会创建一条额外的行,因此我们J
可以将该行与下一行合并,从而有效地删除了我们下面的行。
现在,我们需要将所有这些空格替换为星号。如果我不担心在代码中使用星号,则只需在视觉上选择整个内容<C-v>{
并输入r*
,即可用星号替换所选内容的每个字符。但是我做不到。
因此,我们打开了帮助页面:h r
。有趣的是,在vim窗口中,此页面显示为:
r
r{char} Replace the character under the cursor with {char}.
...
将光标放在第一个“ r”上。但是,文件本身实际上包含以下文本:
*r*
r{char} Replace the character under the cursor with {char}.
...
很方便 因此,我们使用移至一个字符l
,并r*
使用yE
(将单词[[y] ank移至该单词的[E] nd])将文本移至该字符。
要关闭此缓冲区,我们使用快捷方式保存文件ZZ
。现在,我们以视觉方式选择我们的空格,并运行带阴影的文本,就像我们通过键入来键入它一样@"
。之所以有效,是因为“ @”将以下寄存器作为vim-keystrokes运行,而“”是拉动的默认寄存器。
从命令行获取输入
f(n){for(n&&f(n-1);~n;putchar(n--?42:10));}
基本上,如果n不为0,则对n-1进行递归。在n为0的递归顶部,它只是打印换行符,for循环在n为-1或〜n为零时终止,否则打印ASCII 42,即*。在ideone上尝试
#include<iostream>
int f(int n){for(n&&f(n-1);~n;std::cout<<(n--?"*":"\n"));}
main(c,v)char**v;
{
f(atoi(v[1]));
}
a.exe 3
*
**
***
&&
:n?f(n-1):0
→ n&&f(n-1)
。