我花了很多时间才能做到这一点。(YouTube评论1)


84

等等.....这不是拖钓。


背景

如今,在YouTube上,评论部分杂乱无章:

S
St
Str
Stri
Strin
String
Strin
Stri
Str
St
S

其中String仅是占位符,是指字符的任意组合。这些模式通常伴随一个It took me a lot of time to make this, pls like或某种东西,并且OP通常会成功聚集许多喜欢的对象。


任务

尽管您凭借出色的高尔夫技巧在PPCG上积累了丰富的才能,但您绝对不是在YouTube评论部分发表机智的言论或引用模因的最佳选择。因此,您在YouTube上经过深思熟虑而提出的建设性评论几乎没有“喜欢”。您想要改变。因此,您可以采用上述陈词滥调的模式来实现自己的最终目标,而又不浪费任何时间手动编写它们。

简而言之,您的任务是获取一个字符串,例如s,并输出的2*s.length - 1子字符串s,以换行符分隔,以符合以下模式:

(用于s=“ Hello”)

H
He
Hel
Hell
Hello
Hell
Hel
He
H

输入值

单个字符串s。输入社区的默认值。您可以假设输入字符串仅包含可打印的ASCII字符。


输出量

几行用换行符分隔,构成如上所述的适当模式。应用社区的默认输出。输出中允许使用前导和尾随空白行(不包含任何字符或看不见的字符,如空格)


测试用例

多字测试用例:

Input => "Oh yeah yeah"

Output =>

O
Oh
Oh 
Oh y
Oh ye
Oh yea
Oh yeah
Oh yeah 
Oh yeah y
Oh yeah ye
Oh yeah yea
Oh yeah yeah
Oh yeah yea
Oh yeah ye
Oh yeah y
Oh yeah 
Oh yeah
Oh yea
Oh ye
Oh y
Oh 
Oh
O

请注意,上述测试用例的输出的形状存在明显的失真(例如,输出的第二行和第三行看起来相同)。那是因为我们看不到尾随的空格。您的程序无需尝试修复这些变形。


获胜标准

这是,因此每种语言中以字节为单位的最短代码胜出!


19
我计划在将来提出更多与YouTube评论相关的挑战;因此YouTube Comments #1标题中的。
Arjun

1
是否允许返回行数组?
有人

2
我们可以将输入作为字符数组并返回一个字符数组吗?
毛茸茸的


3
输入可以""吗?像这样的单个字符"H"呢?如果是这样,这两种情况的输出应该是什么?
AdmBorkBork

Answers:


103

操蛋,32字节

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

在线尝试!

同一循环用于图案的两个半部。

说明:

,             Take first input character as initial line
[             Until line to output is empty:
  [<]>        Move to beginning of line
  [.>]        Output all characters in line
  ++++++++++. Output newline
  ,           Input next character
  [>>]        Move two cells right if input character nonzero
  <[-]        Otherwise remove last character in line
  <           Move to new last character in line
]

2
简直太棒了。我当时想做些脑力激荡的事情,但结果出来的时间大约是这个时间的10倍,但仍然无法正常工作。
ElPedro

34
没想到我会遇到一个挑战,在此之前,脑力激荡的答案实际上在竞争中取得了惊人的成绩!
问号

54

JavaScript(ES6),36个字节

f=([c,...r],s=`
`)=>c?s+f(r,s+c)+s:s

在线尝试!

已评论

f = (             // f is a recursive function taking:
                  //   the input string split into:
  [c,             //     c   = next character (may be undefined if we've reached the end)
      ...r],      //     r[] = array of remaining characters
  s = `\n`        //   the output string s, initialized to a linefeed
) =>              // 
  c ?             // if c is defined:
    s +           //   append s (top of the ASCII art)
    f(r, s + c) + //   append the result of a recursive call to f, using r[] and s + c
    s             //   append s again (bottom of the ASCII art)
  :               // else:
    s             //   append s just once (this is the final middle row) and stop recursion

3
非常好的答案:D
lois6b

10
@MartinBarker在Windows上,我使用的是Notepad ++,并且默认的Line Ending设置为Unix (LF)。问题一劳永逸。:)
Arnauld

3
太棒了!您能为那些完全是JS新手的人写一个解释吗?
阿霍伊(Akhoy)

3
@Akhoy我添加了评论版本。
Arnauld

3
谢谢。现在要清楚得多。
阿霍伊(Akhoy)

47

05AB1E(旧版) 4  3 字节

划掉&nbsp;4&nbsp;不再是4 :)

η.∊

在线尝试验证所有测试用例

说明:

η     # Get the prefixes of the (implicit) input-string
 .∊   # Vertically mirror everything with the last line overlapping
      # (which implicitly joins by newlines in the legacy version of 05AB1E)
      # (and output the result implicitly)

在新版本的05AB1E中,»在之后需要显式η,这就是为什么我在此处使用旧版本的05AB1E来保存字节的原因。


7
嗯,这似乎是UTF8中的6个字节:\xce\xb7\x2e\xe2\x88\x8a
rubenvb

10
@rubenvb在UTF-8中确实更多。就像其他答案中使用的某些编程语言(例如Jelly; Japt; Charcoal)一样,05AB1E使用自己的源代码(对于05AB1E,它是CP-1252),在其中知道的256个字符中的每个字符都是单字节。
凯文·克鲁伊森

好吧,很公平:)。
rubenvb

@KevinCruijssen PHP似乎认为这些字符对于CP-1252无效,但可能只是一个PHP错误:3v4l.org/UC1QE
hanshenrik

7
@hanshenrik好问题。实际上,它不是CP-1252,而是05AB1E编码,它是它使用的自定义编码。这个代码在十六进制的字节08 2e 17,它可以运行,并与验证--osabie标志:tio.run/...
阿德南

21

IBM PC DOS,8088组件,  44  43

d1ee ad8b d6b4 0948 8af8 8ac8 d0e1 49b3 243a cf7d 024e
4e46 861c cd21 861c 52ba 2901 cd21 5ae2 eac3 0d0a 24

未组装:

    SHR  SI, 1              ; point SI to DOS PSP at 80H (SI intialized at 100H)
    LODSW                   ; load arg length into AL, advance SI to 82H
    MOV  DX, SI             ; save start of string pointer
    MOV  AH, 9              ; DOS API display string function
    DEC  AX                 ; remove leading space from string length
    MOV  BH, AL             ; save string len in BH (AL gets mangled by INT 21H,9)
    MOV  CL, AL             ; set up loop counter in CL
    SHL  CL, 1              ; number of lines = 2 * string length - 1
    DEC  CX
    MOV  BL, '$'            ; end of string marker
LINE_LOOP:
    CMP  CL, BH             ; if CL >= string length, ascend
    JGE  ASCEND
    DEC  SI                 ; descend by backing up two places (always increments)
    DEC  SI                 ; (this is fewer bytes than 'SUB SI, 2' or two branches)
ASCEND:
    INC  SI                 ; increment current string position
    XCHG BL, [SI]           ; swap current string byte with end of string delimiter
    INT  21H                ; write substring to console
    XCHG BL, [SI]           ; restore string byte
    PUSH DX                 ; save output string pointer
    MOV  DX, OFFSET CRLF    ; load CRLF string
    INT  21H                ; write to console
    POP  DX                 ; restore output string pointer
    LOOP LINE_LOOP          ; move to next line
    RET
CRLF DB 0DH,0AH,'$'

说明

循环2 * input length - 1每一行。DOS API的字符串显示函数(INT 21H,9)将一个- $终止的字符串写入屏幕,因此,每次循环时,最后一个要显示的字符将与字符串结尾终止符交换。

将循环计数器与字符串长度进行比较,如果长度更大(表示输出的升序部分),则字符串/交换位置递增,否则递减(实际上,-1-1+1字节数比if / else分支结构少)。

独立的可执行程序,从命令行获取输入字符串。

输出量

在此处输入图片说明

下载YT2.COM(43字节)


1
多数DOS版本在加载COM文件时的SI = 100h。通过将第一个指令替换为,可以节省一个字节SHR SI, 1
gastropner

@gastropner非常聪明!事实证明,原始版本无论如何都不会在DOS 1.0上运行,因为它指望CH为0(初始化需要花费+2字节,这对于DOS 1而言是不值得的)。更新了新版本!
640KB

每次打开终端时都需要输入日期吗?
user14492

1
@ user14492哈,不!我只是忘了从DOS屏幕截图中裁剪掉那部分!
640KB

19

Python 2中60 52个字节

f=lambda s,n=1:s[n:]and[s[:n]]+f(s,n+1)+[s[:n]]or[s]

在线尝试!

Python 3.8(预发布),50字节

f=lambda s,n=1:s>(x:=s[:n])and[x,*f(s,n+1),x]or[s]

在线尝试!


2
这是否取决于3.8即将推出的功能?哪个功能?
Alexis

7
@alexis这是通过使用一个赋值表达式x:=s[:n]
Arnauld

1
嗯,我现在看到它了,谢谢:-)我以前已经读过有关该功能的内容,并期待着它。从我的C天起仍然想念它
Alexis

1
这些虽然不打印输出。他们只是制作数组,对不对?
Jaden Travnik

@JadenTravnik如果通过控制台交互运行,Python会自动将最后一个表达式的结果
加倍

18

MATL,8字节

nZv"G@:)

在线尝试!

请喜欢这篇文章,因为:)它花了我很多时间编写代码。

n  % Length of the input string
Zv % Symmetric range ([1 2 ... n ... 1])
"  % For each k in above range
G  % Push input
@: % Push [1 2 ... k]
)  % Index

17

J,11个字节

匿名默认前缀功能。返回带空格的字符矩阵。

[:(}:,|.)]\

在线尝试!

]\ 前缀列表

[:() 将以下功能应用于该列表

|. 反向列表

, 前置

}: 缩减(无最后一项)列表


18
[:(并且}:,|看起来很悲伤...
亚当

但这是(}:那是一个
留着

13

Perl 6,31个字节

{[\~](@_)[0...@_-1...0]}o*.comb

在线尝试!

匿名代码块,它接收字符串并返回行列表。

说明:

{                      }o*.comb   # Pass the list of characters into the codeblock
 [\~](@_)                 # Triangular reduce by concatenation
                          # e.g. The list [1,2,3,4] turns into [1,12,123,1234]
         [0...@_-1        # Return the elements from 0 to length of string minus 1
                  ...0]   # And back down to 0

5
有趣的是,这些天甚至打高尔夫的Perl都是最易读的选手之一。
停止转动逆时针

7
@ceasedtoturncounterclockwis好吧,这是Perl6。Perl5的答案仍然难以理解
Jo King

12

Japt -R,4个字节

å+ ê

累计减少字符串。

-1字节感谢@Shaggy

在线尝试!


怀疑字符串中必须包含“ -R”(无输出将不起作用)
Flying Thunder

3
@FlyingThunder不再怀疑:) 参见此处
Quintec

@Quintec,我已将解决方案标题中的标志链接到该元发布,以尝试抢占这些评论。
毛茸茸的

1
可以肯定的约定是<language> + -flag或<language> -flag。另外,:| 我忘了累积减少是一回事,我发誓每次看到它都会跳过它
纯ASCII码

@ ASCII-only同样,我只记得它是因为我在考虑如何在APL中解决此问题,并说:“我想知道Japt是否具有此内置函数”。另外,我没有使用<language> -flag吗?
Quintec



10

哈斯克尔, 52 50 44个字节

f x=unlines$init<>reverse$scanr(\_->init)x x

在线尝试!


欢迎来到该网站。 inits需要使用导入,因此您需要添加import Data.List或类似内容。
精神分裂症O'Zaic

@ SriotchilismO'Zaic不确定是否需要计数。添加,谢谢!
Joseph Sible

4
我还要提到我们有一个聊天室,可以谈论Haskell打高尔夫球。如果您有任何想法或疑问,那是个好地方。
精神分裂症O'Zaic

1
我简直不敢相信您想出了我要发布的内容:import Data.List putStr.unlines.((++)<*>reverse.init).tail.inits
Axman6

9

R79 65 62 58字节

write(substring(s<-scan(,""),1,c(1:(r=nchar(s)),r-1:r)),1)

在线尝试!

-14由朱塞佩的高级功能知识

-3,索引更清晰

-4感谢尼克·肯尼迪和Giuseppe的举动scanwrite

避免循环(和substr)很好。


2
循环是完全不必要的,因为是sapply- substring会做你想要什么(有额外的尾随空行),并为65个字节substring如果我没有看到您在substr这里的很好用,我绝对不会想到的。
朱塞佩

1
哈哈,好抓!我想我从您的编辑中学到的更多关于同一工作的替代功能的信息,比其他任何地方都多。
CriminallyVulgar

2
哈哈,R的愚蠢数量具有微妙的差异。每当我觉得自己知道最适合该工作的工具时,就会发现在一些怪异的情况下会稍微好一点……
Giuseppe

3
如何在线尝试!使用scanwrite?只有59个字节!
尼克·肯尼迪

1
@NickKennedy 58字节(如果替换""为)1
朱塞佩

7

果冻5 4字节

-1个字节感谢@JonathanAllan

¹ƤŒḄ

在线尝试!我认为这是我的第二个果冻答案?我不知道这是否是最佳选择。我更相信它是最佳的。返回行数组。

说明

¹ƤŒḄ     input: "Hi!"
¹Ƥ       prefixes of the input: [["H"], ["H", "i"], ["H", "i", "!"]]
  ŒḄ     bounce, using each array: [["H"], ["H", "i"], ["H", "i", "!"], ["H", "i"], ["H"]]

@JonathanAllan提出的另一种方法是;\ŒḄ,该方法可累计减少(\)级联(;),这是生成前缀的另一种方法。


我们被允许产生一个行数组,因此您可以Y跳出代码(我可以在页脚中写出来,ÇY或者ÇŒṘ避免整个程序的隐式粉碎打印)。在旁注中,这也等效;\ŒḄ于相同的字节数实现(您也可以传递参数,"blah"因为Jelly将其解释为字符列表-您实际上是字符列表,如您所见)如果您创建页脚ÇŒṘ
乔纳森·艾伦

@JonathanAllan谢谢!非常有趣:)
Conor O'Brien

7

Python 3.8(预发布),48字节

lambda s,r='':(l:=[r:=r+c for c in s])+l[-2::-1]

在线尝试!

赋值表达式与一起使用:=积累前缀列表,然后再次保存结果以连接其反向字符(无第一个字符)。

Python 2,51个字节

f=lambda s,l=[]:s and f(s[:-1],[s]+l)or l+l[-2::-1]

在线尝试!

我们几乎有以下不错的45字节解决方案,但是它有两次原始字符串,我看不出解决此问题的捷径。

f=lambda s,l=[]:s and f(s[:-1],[s]+l+[s])or l

在线尝试!


您是否不需要添加一些换行符并打印以获得所需的输出?
Jaden Travnik

print('\n'.join(f(s))) 什么?
Jaden Travnik

@JadenTravnik社区默认设置(此挑战遵循)允许除程序外的功能。挑战作者在评论中说,默认情况下允许使用连接中的字符串列表,但我自己不喜欢将其作为默认值,因此对此表示反对。另请参阅Python规则摘要
xnor

嗯 好的,谢谢你指出这一点。我是新的__(ツ)_ /¯。如果是这样,这是一个竞争性的45字节解决方案:x=[s[:i+1]for i in range(len(s))];x+x[-2::-1]
Jaden Travnik

@JadenTravnik没问题,不幸的是规则散布在整个地方。不过,您的示例是不允许的摘录。它需要像一样进行输入和输出s=input();x=[s[:i+1]for i in range(len(s))];print x+x[-2::-1]。请参阅此处顶部示例
xnor

6

木炭,5字节

G^Lθθ

在线尝试!链接是详细版本的代码。说明:绘制一个填充的多边形,^指定边在右下和左下(然后多边形自动关闭),Lθ将这些边的长度θ指定为原始输入的长度,而final 指定填充字符串。




5

Brachylog(v2),6个字节

a₀ᶠ⊆.↔

在线尝试!

函数提交,返回一个行数组。松散地基于@Fatalize的答案

说明

a₀ᶠ⊆.↔
    .↔  Find a palindrome
   ⊆      that contains, in order,
  ᶠ       all
a₀        prefixes of {the input}

抢七顺序是由设置的,当与该流模式一起使用时,它倾向于尽可能短的输出,并通过尽早放置给定元素来平分。最短的输出就是我们想要的输出(由于不可能有任何重复的前缀),并且尽早放置给定的元素(即前缀)会将它们放置在结果的前半部分(四舍五入)。输出。考虑到我们还要求它们以相同的顺序放置,即使我们对Brachylog的描述非常笼统,我们也恰好获得了所需的模式。抢七决定完全正确,这导致Brachylog选择我们想要的输出,而不是遵循描述的其他输出。


5

PowerShell,89 87 66字节

-2个字节,感谢@AdmBorkBork

param($a)0..($d=$a.Length-1)|%{$b+=,-join$a[0..$_]};$b+$b[--$d..0]

在线尝试!

实际上,它没有按之前指定的那样工作,对此感到抱歉!我已经对其进行了编辑,还设法节省了一些字节。


您可以--$d不必($d-1)最后保存一对。
AdmBorkBork

@AdmBorkBork谢谢。
加布里埃尔·米尔斯

遗憾的是,这不适用于单字符输入。
AdmBorkBork


4

APL(Dyalog Unicode),9 字节SBCS

匿名默认前缀功能。返回字符串列表。

(⊢,1↓⌽),\

在线尝试!

,\ 前缀列表(点亮,累积串联)

() 对列表应用以下功能:

 反向列表

1↓ 删除第一项

, 前置

 未经修改的清单




4

SNOBOL4(CSNOBOL4),118字节

	N =INPUT
	L =1
1	X =LT(X,SIZE(N)) X + 1	:F(D)
O	N ARB . OUTPUT POS(X)	:($L)
D	X =GT(X) X - 1	:F(END)
	L ='D'	:(O)
END

在线尝试!

SNOBOL的此实现似乎存在一个错误;试图更换标签D与标签2导致错误,尽管对于香草SNOBOL手动指示(强调)

如果有标签,则必须以该行的第一个字符开头。标签为语句提供名称,并用作从任何语句的GOTO字段进行控制转移的目标。标签必须以字母或数字开头,并可以选择后面跟任意字符串。标签字段以空格,制表符或分号结尾。如果一行的第一个字符为空白或制表符,则标签字段不存在。

我的假设是CSNOBOL解释器仅支持以整数开头的单个标签。


4

APL + WIN,31个字节

提示输入字符串:

 ⊃((⍳n),1↓⌽⍳n)↑¨(¯1+2×n←⍴s)⍴⊂s←⎕

说明:

(¯1+2×n←⍴s)⍴⊂s create a nested vector of the string of length =1+2x length of string

((⍳n),1↓⌽⍳n)↑¨ progressively select elements from each element of the nested vector 
              following the pattern 1  2 ...to n to n-1 ... 1

⊃ convert nested vector into a 2d array.

4

F#(.NET Core)67 61字节

let l=s.Length
[1..l*2-1]|>Seq.map(fun i->s.[..l-abs(i-l)-1])

在线尝试!

输入是a string,输出是aseq<string>

另一个解决方案可能是let f(s:string)=for i=1 to s.Length*2-1 do printfn"%s"s.[..s.Length-abs(i-s.Length)-1]80ish字节...我不确定是否值得研究。


4

sed31 35字节

:x
h
s/.\n.*\|.$//
/^$/{x;q}
H
G
bx

在线尝试!

说明

在循环的每次迭代开始时,模式空间是所需输出的“中心块”,并且每个循环在顶部和底部都添加了缩短的副本。

:x                 
h                  Copy the current chunk to hold space
s/.\n.*\|.$//      Remove the last letter of the first line, and all other lines (if there are any)
/^$/{x;q}          If pattern space is empty we're done; output hold space
H                  Add the shortened line to the end of hold space
G                  and add the new hold space to pattern space.
bx                 

1
不错,但是中间线(完整的原始输入)似乎被输出了3次。至少与GNU有关sed。在TIO上也一样。sed您使用哪种实现以及如何将其传递给输入?(顺便说一句,更改替代以s/.\n.*\|.$//修复它。)
manatwork

2
啊,你是对的。这不是我的sed实现问题(使用GNU 4.2.1版),我只是没有注意到该错误。我玩了一些其他修复程序,找不到添加少于四个字节的内容,因此,我采用您的修复程序,谢谢。
Sophia Lechner

4

Python 2中131个 100 84字节

我对Code Golf的第一个答案!

由于@ SriotchilismO'Zaic,整体-47字节

a,b=[],len(x)
for i in range(2*b-1):
 if i<b:a+=x[i]
 else:a=a[:-1]
 print''.join(a)

在线尝试!


1
欢迎来到PCG!请务必阅读旅游行为准则。好的解决方案!
akozi

2
对于python,您可以使用;s而不是换行符来避免缩进。也不需要在print和之间放置空格''
Sriotchilism O'Zaic

感谢@ SriotchilismO'Zaic的提示,确实帮助减少了我的字节数!
Yoni Matz

2
最后一件事,如果您创建的a是字符串而不是列表,则根本不需要join,而可以print a
精神分裂症O'Zaic

4
无效,它必须是完整的程序或函数,而您假设输入在中x
仅限ASCII

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.