这不是火箭科学


59

编写一个包含单行字符串的程序或函数。您可以假定它仅包含可打印的ASCII。打印或返回ASCII艺术火箭的字符串,例如

  |
 /_\
 |E|
 |a|
 |r|
 |t|
 |h|
 |_|
/___\
 VvV

输入字符串从上到下写在机身上。在这种情况下,输入为Earth。火箭的高度(包括火焰)始终是弦的长度加五。

输出中的每一行最多可以有两个尾随空格,并且可能只有一个可选的尾随换行符。以字节为单位的最短代码获胜。

更多示例:

[empty string]

  |
 /_\
 |_|
/___\
 VvV

a

  |
 /_\
 |a|
 |_|
/___\
 VvV

|0

  |
 /_\
 |||
 |0|
 |_|
/___\
 VvV

\/\

  |
 /_\
 |\|
 |/|
 |\|
 |_|
/___\
 VvV

 _ _ [note trailing space]

  |
 /_\
 | |
 |_|
 | |
 |_|
 | |
 |_|
/___\
 VvV

    [4 spaces]

  |
 /_\
 | |
 | |
 | |
 | |
 |_|
/___\
 VvV

SPACEY

  |
 /_\
 |S|
 |P|
 |A|
 |C|
 |E|
 |Y|
 |_|
/___\
 VvV

排行榜


1
相关的。可能还有其他人足够接近,因此算作骗子。
彼得·泰勒

2
@Sefa Spaces是的。否其他空格。如链接的Wiki所示。
加尔文的爱好

6
D'oh,我看到标题了,并且对脑外科有所期待。:(

17
而且,如果最低点指向天空,那么您今天就不会进入太空。
AstroDan

4
“它在喀布尔太空计划中起作用……”
魔术

Answers:


55

Excel VBA中,142个 179 175 160 155字节

指令:

设置Excel工作表,其中输入单元格A1,将列C作为输出。将C列中的文本对齐方式设置为center。在立即窗口中编写并运行以下代码:

[C1]="|":[C2]="/_\":T=[A1]&"_":For i=1To Len(T):Cells(i+2,3)="|"&Mid(T,i,1)&"|":Next:Cells(i+2,3)="/__\":Cells(i+3,3)="VvV":[C:C].HorizontalAlignment=-4108

解开代码:

Sub R()
    [C1] = "|"
    [C2] = "/_\"
    T = [A1]&"_"

    For i = 1 To Len(T)
        Cells(i + 2, 3) = "|" & Mid(T, i, 1) & "|"
    Next

    Cells(i + 2, 3) = "/__\"
    Cells(i + 3, 3) = "VvV"
    [C:C].HorizontalAlignment = -4108   'Set the text alignment in column C to center
End Sub

输出:

enter image description here

注意:字体和颜色只是个人选择。


由于edc65的建议,节省了15个字节。谢谢。

由于TaylorScott的建议,节省了5个字节。谢谢。


保存添加"_"到T的15个字节。像这样[C1]="|":[C2]="/_\":T=[A1]&" ":For i=1To Len(T):Cells(i+2,3)="|"&Mid(T,i,1)&"|":Next:Cells(i+2,3)="/__\":Cells(i+4,3)="VvV":Columns(3).HorizontalAlignment=-4108
edc65 '16

(好的,我的代码有错误,现在编辑它为时已晚。但是您明白了)
edc65 '16

@ edc65我不知道。您的代码与我的代码完全相同,因此我应该编辑些什么来保存15个字节?
Anastasiya-Romanova秀

1
154字节:[C:C].HorizontalAlignment=-4108:[C1]="|":[C2]="/_\":T=[A1]&"_":For i=1To Len(T):Cells(i+2,3)="|"&Mid(T,i,1)&"|":Next:Cells(i+2,3)="/__\":Cells(i+3,3)="VvV
泰勒·斯科特

1
或者,您可以将其减少到151个字节,并保持居中状态[C:C].HorizontalAlignment=3:[C1]="|":[C2]="/_\":T=[A1]&"_":For i=1To Len(T):Cells(i+2,3)="|"&Mid(T,i,1)&"|":Next:Cells(i+2,3)="/___\":Cells(i+3,3)="VvV
Taylor Scott

30

Perl 6,75字节

"  |\n /_\\".say;" |$_|".say for slurp.chomp.comb;" |_|\n/___\\\n VvV".say;

101
slurp.chomp.comb... Perl很奇怪。
Mego

14
LU! 加油!!! 梳子!!Perl怪物来了!
stommestack

请注意,通过使用函数和合并,您可以减少很多工作:{[~] " |\n /_\\\n",|(" |$_|\n"for $_.comb)," |_|\n/___\\\n VvV"}65个字节
user0721090601

:但是你可以通过JS的借贷变得更低tio.run/...
user0721090601

22

JavaScript(ES6),54

直截了当

x=>`  |
 /_\\
 |${[...x+'_'].join`|
 |`}|
/___\\
 VvV`

测试

f=x=>`  |
 /_\\
 |${[...x+'_'].join`|
 |`}|
/___\\
 VvV`

function update() {
  O.textContent=f(I.value)
}

update()
<input id=I value='hello' oninput='update()'><pre id=O></pre>


16

实际上是40个字节

"/___\
 VvV",'_o"|
 |"j'|o" |"+"  |
 /_\

是的,这些换行符应该在那里。

在线尝试!

说明:

换行符用表示,\n以便于设置格式

"/___\\n VvV",'_o"|\n |"j'|o" |"+"  |\n /_\
"/___\\n VvV"                                create the bottom of the rocket
             ,'_o                            get input, append a "_" (for the last section before the jets)
                 "|\n |"j                    insert "|\n |" between every pair of characters
                         '|o                 append "|"
                            " |"+            prepend " |"
                                 "  |\n /_\  create the nose cone

12
您的程序看起来令人沮丧,类似于爆炸的火箭。
corsiKa

15

C,83,82字节

F(char*c){for(puts("  |\n /_\\");*c;printf(" |%c|\n",*c++));puts(" |_|\n/___\\\n VvV");}

测试主体:

int main() {
  F("");
  F("a");
  F("|0");
  F("\\/\\");
  F(" _ _ ");
  F("    ");
  F("SPACEY");
}

7
我制定了自己的C解决方案,结果恰好是您的,一个接一个地工作。向我+1。
科迪

在电话上,对SSH太懒了,因此未经测试,但应该可以。节省2个字节(如果我计数正确):F(char*c){for(puts(" |\n /_\\");*c;printf(" |%c|\n",*c++),puts(" |_|\n/___\\\n VvV");}
algmyr

@algmyr实际上节省了一个字节,因为最后一个puts必须只执行一次,而不是每次执行一次printf。但是,是的,保存了1个字节,是的!
Stefano Sanfilippo,

对。当我应该睡觉的时候,我会把责任归咎于打高尔夫球。
algmyr

这不是88个字节吗?
gastropner

10

Python 2,93 66 62 61字节

FGITW。可以打很多球。欢迎提出建议。

编辑: 27字节感谢Mego。4个字节,感谢TheBikingViking。1个字节,感谢user3030010。

在线尝试!

lambda x:r"""  |
 /_\
 |%s|
/___\
 VvV"""%"|\n |".join(x+"_")

9

PHP,73 72 69 62字节

  |
 /_\
 |<?=join('|
 |',str_split($argv[1]._))?>|
/___\
 VvV

调用脚本时,将要打印在机身上的字符串作为命令行的第一个参数。

改进之处:

  1. 通过在\的第一个参数中用实数LF换行符替换\ n来保存字节join
  2. 通过将火箭底部附加一个下划线,在输入中附加了三个字节
  3. 感谢Ismael Miguel:利用PHP曾经是“超文本预处理器”的事实,又节省了7个字节,因此您可以输出任意数量的文本并在中间的某个地方启动代码。

在线尝试!

真有趣!:-)

通话样本:

php rocket.php ""
php rocket.php EARTH
php rocket.php "This is a very long rocket"


高尔夫不错!我完全忘记了这种可能性。谢谢!
YetiCGN

别客气。另外,我在第一行中保存了2个字节。您还有2个额外的尾随空格。我必须说,这是我没想到的。
伊斯梅尔·米格尔

1
我知道,那真是愚蠢,但也很难发现。我只有在改进的版本上找到64字节后才发现原因。
YetiCGN

8

brainfuck,179个字节

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

在线尝试!


@ user00001这个短语被全世界所有穆斯林使用,而不仅仅是恐怖分子。您真的认为恐怖分子代表了所有穆斯林吗?
Leaky Nun


8

Ruby,57 55字节

@ValueInk将-2字节乘以
-5字节(假设@manatwork建议输入中没有换行符)。可以提供新行更少的输入例如使用echo -n,像echo -n hey | ruby rocket.rb

puts'  |
 /_\
 |'+gets.chars*'|
 |'+'|
 |_|
/___\
 VvV'
旧版本,在输入中假定换行符:

Ruby,62个 60字节

puts'  |
 /_\
 |'+gets.chop.chars*'|
 |'+'|
 |_|
/___\
 VvV'

根据问题所有者的评论,输入内容将不包含换行符,因此您可以删除.chop
manatwork

@manatwork neat,谢谢:)
daniero

如果您使用单引号字符串,则应该可以将都替换\\ \ 。(在单引号字符串,字符没有逃脱,除非\'
价值油墨

7

Haskell,58个字节

f s="  |\n /_\\\n |"++((:"|\n |")=<<s)++"_|\n/___\\\n VvV"

7

视网膜44 37字节

感谢Martin Ender提供7个字节。

$
_
.
¶ |$0|
$
¶/___\¶ VvV
^
  |¶ /_\

在线尝试!


在底部的行上留下一个空白:(表示“空间,最后的边界。”
xQbert

@xQbert对我有用,您可以附加一个TIO链接吗?
Leaky Nun

奇怪,现在对我来说还不错...啊,我的错误结尾处有换行符。
xQbert

视网膜是我所知道的唯一添加尾随换行符可以完全更改程序的语言。
caird coinheringaahing

6

果冻37 36 字节

;”_⁾ |;ЀŒB;“/___\“ VvV”“  |“ /_\”;Y

与现有条目得分相同,但使用了一项有趣的新功能- ŒB,即向量化版本ŒḄ,称为反弹。弹跳遍历列表至结尾,然后返回x[:-1]+x[::-1]例如:bounce("codegolf") == "codegolflogedoc"

-1个字节,感谢Dennis(使用退回的矢量化版本)

怎么样?

;”_⁾ |;ЀŒB;“/___\“ VvV”“  |“ /_\”;Y - argument: a string, S
                        “  |“ /_\”   - the top of the rocket ["  |", " /_\"] 
;”_                                  - concatenate to make S=S+"_"
   ⁾ |;                              - concatenate to make c=" |"+c
       Ѐ                            - map over right argument i.e. for c in S
         ŒB                          - bounce! With vectorisation c[:-1]+c[::-1]
                                       e.g. " |B" -> " |B| "
           ;                         - concatenate with
            “/___\“ VvV”             - the bottom of the rocket ["/___\", " VvV"]
                                  ;  - concatenate the top with everything else
                                   Y - join with line feeds

TryItOnline测试


2
ŒB是的缩写ŒḄ€
丹尼斯


5

V41, 39个字节

ys$_òlé
òÎá|I |
Hr/$r\YO  |GpX2á_o VvV

在线尝试!

请注意,由于某种原因,在线解释器产生了意外的结果,因此我将调试版本推送到了运行速度慢得多的在线解释器上。现在应该会产生正确的结果。

由于此程序包含不可打印的字符,因此这里是一个十六进制转储:

0000000: 7973 245f f26c e90a f2ce e17c 4920 7c0a  ys$_.l.....|I |.
0000010: 4872 2f24 725c 594f 2020 7c1b 4770 5832  Hr/$r\YO  |.GpX2
0000020: e15f 6f20 5676 56                        ._o VvV

很好,但是它不能正确处理“太空,最后的边界”中的空间。
xQbert

5

R,163字节

v=c();l="\n";for(i in 1:nchar(a<-scan(,"")))v=c(v,paste0(" |",strsplit(a,"")[[1]][i],"|",l,collapse=""));cat("  |",l," /_\\",l,v," |_|",l,"/___\\",l," VvV",sep="")

松散

v=c()     #Empty vector
l="\n"    #Line break

for(i in 1:nchar(a<-scan(,"")))                  #For the number of character of the input
    v=c(v, paste0(" |",strsplit(a,"")[[1]][i],"|","\n",collapse=""))
    #This part cut the input into its letters, paste each letter between `|`'s, 
    #and a line break

cat("  |",l," /_\\",l,v," |_|",l,"/___\\",l," VvV",sep="") #Puts everything in the STDOUT,
                                                           #with spaces where needed

我真的不喜欢在最后一行放置一些空格的事实,但是,嘿!


5

PowerShell v2 +,59 55 51字节

"  |
 /_\"
$args|% t*y|%{" |$_|"}
" |_|
/___\
 VvV"

在线尝试!

Write-Output在执行结束时滥用默认值,以在每个元素之间插入换行符,因为这些全都是管道上的文字字符串。唯一的“棘手”位是输入中每个元素的循环$args作为字符数组以获取火箭的主体。

使用ConnorLSW指出的文字换行符来节省一些字节。
由于有了Veskah,又多了-4个字节。


您可以在字符串中放入实际的换行符以保存3,shell和ise可以很好地执行,而无需\r
colsw


4

PowerShell,70个字节

"  |`n /_\`n$(([char[]]$a|%{" |$_|"})-join("`n"))`n |_|`n/___\`n VvV 

将$ a设置为输入。

如果必须接受变量以外的其他输入,则可以使用管道输入:

"Hello World"|%{"  |`n /_\`n$(([char[]]$_|%{" |$_|"})-join("`n"))`n |_|`n/___\`n VvV "}

例:

  |
 /_\
 |H|
 |e|
 |l|
 |l|
 |o|
 | |
 |W|
 |o|
 |r|
 |l|
 |d|
 |_|
/___\
 VvV 

4

Mathematica,50个字节

"  |
 /_\\
 |"<>(#<>"|
 |"&/@#)<>"_|
/___\\
 VvV"&

匿名函数。将字符列表作为输入,并返回一个字符串作为输出。


4

PHP,108个 100 88字节

-8字节感谢商务猫

-12个字节归功于YetiCGN

echo'  | 
 /_\\
';foreach(str_split($argv[1])as$c){echo" |$c|
";}echo' |_|
/___\\
 VvV';

非常简单

伊迪奥


1
通过使用foreach(str_split($a)as$c)而不是其他for循环,可以节省很多字节。此外,如果使用双引号,则可以将$ c直接放在字符串中:echo" |$c| ....";
Business Cat

@BusinessCat是的,谢谢,由于括号未得到解释,因此双引号不能用于数组样式
Sefa

那正则表达式呢?function f($a){echo' |.␤ /_\\␤',preg_replace('/./',' |$0|␤',$a),' |_|␤/___\\␤ VvV';}
manatwork

1
为什么还要加上一个函数呢?更换$a$argv[1]和命令行中运行使得它短得多。
YetiCGN

@manatwork这可能是一个有效的替代方法,但是由于我不理解它,并且它的精神与我的不一样,所以我将让您发布它。
塞法

4

C#,106 97 80 74字节

s=>$@"  |
 /_\
 |{string.Join("|\n |",s.ToCharArray())}|
 |_|
/___\
 VvV";

我没有C#6可以尝试上述操作,但我相信它会起作用

感谢Kevin Cruijssen保存了7个字节

感谢manatwork为我指出了正确的方向,以节省17个字节

牛奶节省了6个字节


+1。顺便说一句,尾随空格是可选的,因此您可以将其更改为:using System.Linq;s=>$(" |\n /_\\\n{string.Join("",s.Select(c=>" |"+c+"|\n"))} |_|\n/___\\\n VvV");100 bytes
Kevin Cruijssen,2016年

1
@KevinCruijssen在您评论

您可以通过在Select" |"+c+"|\n"→中使用单个字符串文字来保存某些字符,c+"|\n |"同时将`|`从其后移{}
manatwork,2016年

@manatwork我似乎无法正常工作
TheLethalCoder '16

1
新行是1个字节,而\n的2个字节。因此,您将通过用新行替换它们来节省5个字节。是的,如果您使用的是Visual Studio,则默认情况下,新行将为2字节,但是您可以在十六进制编辑器(Visual Studio有一个)中打开源文件,并删除回车符。输出仍然是相同的。
牛奶

4

C, 131、121 字节

#define P printf
main(){char s[99],*p=s;gets(s);P("  |\n /_\\\n");while(*p)P(" |%c|\n",*p++);P(" |_|\n/___\\\n VvV\n");}

您可以删除三个字符,方法是p=s进入初始化并p在内部使用scanfmain(){char s[99],*p=s;scanf("%s",p);P(" |\n /_\\\n");while(*p)P(" |%c|\n",*p++);P(" |_|\n/___\\\n VvV\n");}
Quentin

好的。我更喜欢危险的空间gets()...
RosLuP

2
请不要破坏您的帖子。谢谢!
NobodyNada16年

3

果冻38 37个字节

;”_“|“|¶”jЀ“  |¶“/_\¶”;K;“/___\¶ VvV

在线尝试!

与我的Pyth答案的想法相同,但这可能可以解决。


3

05AB1E50 47 43 37字节

I'_J"  |
 /_\"svy" |ÿ|"}"/___\
 VvV"»

在线尝试!

感谢Adnan,节省了9个字节。


字符串也可以像这样在05AB1E:p中接受换行符。
阿德南

@Adnan Nice,谢谢!任何想法如何更好地解决空输入?
艾米尼亚(Emigna)

IðJ在程序开始时就在考虑一种方法,其中也包括机身的基础。
阿德南

@Adnan好主意。我«没有运气就尝试过。不过,这要好得多。
艾米尼亚(Emigna)

拆卸U和更换Xs也节省了字节:)。
阿德南

3

Kotlin,68个字节

{"""  |
 /_\${it.replace(Regex("."),"\n |\$0|")}
 |_|
/___\
 VvV"""}

非常简单。使用多行字符串和正则表达式替换。这是带(String)->String类型的lambda 。测试:

fun main(args: Array<String>) {
    val function : (String)->String = {"""  |
 /_\${it.replace(Regex("."),"\n |\$0|")}
 |_|
/___\
 VvV"""}
    println(function(" _ _ "))
}

3

Gema,50个字符

\A=  |\n\ /_\\\n
?=\ |?|\n
\Z=\ |_|\n/___\\\n\ VvV

样品运行:

bash-4.3$ echo -n gema | gema '\A=  |\n\ /_\\\n;?=\ |?|\n;\Z=\ |_|\n/___\\\n\ VvV'
  |
 /_\
 |g|
 |e|
 |m|
 |a|
 |_|
/___\
 VvV

3
我想您会在火箭底部之前错过`| _ |`
TheLethalCoder 16'Aug

哎哟。傻瓜小姐。谢谢@TheLethalCoder。
manatwork

1
+1向我介绍一种新的(对我来说)(非高尔夫)语言。
约旦

3

重击84 70

通过操作节省了14

(cat&&echo _)|sed 's~.~ |&|\n~g;1s~^~  |\n /_\\\n~;$s~$~/___\\\n VvV~'

一半以上的字节用于添加机头和引擎。


为什么grep呢? (cat&&echo _)|sed 's~.~ |&|\n~g;1s~^~ |\n /_\\\n~;$s~$~/___\\\n VvV~'。其实我看不出有任何理由使用catecho两种。将较短的时间转换为纯sed溶液。
manatwork

使用纯sed,如果没有输入,则不会得到任何输出
Riley

h 你是对的。抱歉,我忘记了这部分要求。
manatwork

@manatwork我也在第一次尝试中忘记了它。
莱利

为了将来参考,请避免使用<pre> <code>标记。以后请在代码前使用4个空格,因为这会自动转义Markdown格式。由于删除线的缘故,我保持了当前的格式,但是对于那些好奇的人,您也可以将其保留在编辑历史记录中。
艾迪生·克伦普

3

GolfScript, 61 51字节

我的第一个代码高尔夫,我希望它足够好。

"  |
 /_\\
"\1/.,{" |"\(\"|
"\}\*" |_|
/___\\
 VvV"

说明

"  |\n /_\\\n"   # Push the rocket's head
\                # Swap the head with the user's string
1/               # The string is converted into an array
.,               # Push array length
{" |"\           # Push the rocket's body and swap
(\               # Array's first element cut out
"|\n"\           # Push rocket's body and swap
}\*              # Repeat for array length times
" |_|\n/___\\\n VvV" # Push rocket's bottom

在线尝试!


3

Vim,41 39字节

此处的<End>字面意思是“结束”键。

i <End>_:s/./ |&|\r/g
/___\
 VvVggxo /_\

无法打印,因此:

i <End>_^O:s/./ |&|\r/g
/___\
 VvV^[ggxo /_\^[

3

GNU sed54岁 49 48字节

这是我对本网站挑战的第一个答案。解决方案很简单,主要是打印,所以我花了一些时间来确保它不再打高尔夫球。

s:.:\n |&|:g
s::  |& /_\\&:
a\ |_|\n/___\\\n VvV

在线尝试!

快进了半年后,我重写了脚本,使用了一个很好的技巧,然后将其打高尔夫球缩短了1个字节。现在,这就是进步!

说明:在输入示例“ GO”的情况下,为清楚起见,提到了每个步骤的模式空间

s:.:\n |&|:g
   # turn each input char into a section of the rocket (\n |G|\n |O|)
s::  |& /_\\&:
   # 's::' is a trick; the search part is actually the one from the previous 's'
   #command, i.e. a char. Only the first char, '\n', the modifier 'g' is not
   #inherited. The replace part is the head of the rocket. (  |\n /_\\n |G|\n |O|)
a\ |_|\n/___\\\n VvV
   # append the tail of the rocket, plus implicit printing at the end

  |
 /_\
 |G|
 |O|
 |_|
/___\
 VvV

3

Lua,83,92字节

function f(x)return' |\n /_\\\n'..x:gsub('(.)',' |%1|\n')..' |_|\n/___\\\n VvV'end

print('  |\n /_\\\n'..(arg[1] and arg[1]:gsub('(.)',' |%1|\n') or '')..' |_|\n/___\\\n VvV')

如果我在您的答案中未添加任何输入。这是行不通的。
诺兰
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.