弹奏字符串


11

沙盒发布在这里

创建一个“弹跳”字符串的函数或程序。

  • 输入将是Stdin中的String或最接近的替代
  • 输入将仅包含可打印的ASCII和/或空格
  • 输出将输出到Stdout或最接近的输出
  • 可以使用尾随的换行符和空格

如何弹奏字符串

  1. 根据需要将字符串格式化为尽可能多的ASCII弹簧圈
  2. 用空间填充线圈,直到最近的线圈
  3. 跟随线圈周围的弹簧,读出字符

这是一个ASCII弹簧圈:

#
# ####
 #    #
# ####
#

其中#s是字符串的字符

这是一个例子:

abcdefghijklmnopqrstuvwxyz

变成

a
b cdef
 g    h
i jklm
n
o
p qrst
 u    v
w xyz.
.

其中.s替换了可见性的空格。

然后,该字符串被读回,继ASCII春天向下,周围的循环,命中gu两次:

1| a  <-3
 V b cdef
    g    h
4| i jklm
 V n  2->
  ...

...给予:

abgjklmhfedcginopuxyz vtsrquw (带有尾随空格)

测试用例

(添加引号以突出显示尾随空格-请忽略IO)

I: "abcdefghijklmnopqrstuvwxyz"
O: "abgjklmhfedcginopuxyz vtsrquw "

I: "!@#"
O: "!@         #   "

I: ""
O: ""

I: "12345 67890"
O: "12690  7 54368 "

I: " "
O: "               "

请注意,输出长度始终是15的倍数,即弹簧圈的长度

这是,因此最短的答案以字节为单位。


我觉得跟随线圈上的图案将面临更大的挑战。
Magic Octopus Urn

@carusocomputing您的意思是相反的?
MildlyMilquetoast

codegolf.stackexchange.com/a/107531/59376原来我不理解所写的挑战,而这正是挑战。
Magic Octopus Urn

Answers:


2

果冻,26 个字节

“4ṘƝ;þ¦Ɱ’b®¤ị
;⁶x14©¤s®ṖÇ€

TryItOnline!

怎么样?

“4ṘƝ;þ¦Ɱ’b®¤ị - Link 1, output for a single coil: char array
           ¤  - nilad followed by link(s) as a nilad
“4ṘƝ;þ¦Ɱ’     - base 250 number, 13140239220751650
          ®   - retrieve from register (14 from main link)
         b    - convert to base, [1,2,7,10,11,12,13,8,6,5,4,3,7,9,0]
            ị - index into the char array

;⁶x14©¤s®ṖÇ€ - Main link: theString
      ¤      - nilad followed by link(s) as a nilad
 ⁶           - a space character
  x          - repeated
   14©       - place 14 into the register and yield 14
;            - concatenate theString with the 14 spaces
       s     - split into chunks of length
        ®    -     retrieve from register (14)
         Ṗ   - pop last entry from the result (removes the space only last entry of 14 chars or less)
          Ç€ - call the last link (1) as a monad for €ach
             - implicit print

5

Python 2,104 102 98字节

f=lambda t:''.join((t+' '*13)[ord(x)-97+y*14]for y in range(len(t)/14+1)for x in'abgjklmhfedcgin')

感谢您的评论帮助!

https://tio.run/#2VDVy

原版的:

t=raw_input()+' '*13
print''.join(t[ord(x)-97+y*14]for y in range(len(t)/14)for x in'abgjklmhfedcgin')

您可以只使用input()和接受格式的输入"<stuff>"
HyperNeutrino

伟大的第一场高尔夫球!正如Alex L.指出的那样,我们允许输入使用引号。您也可以使用a lambda来提供匿名函数而不是程序-这通常更短
xnor

出现带有IndexError的空字符串测试用例失败。我认为您可能需要将13更改为14并弹出最终值(很像我的果冻答案)。
乔纳森·艾伦

...将+13to +14和the +1to 更改即可+(len(t)%14>0),但是必须有更短的方法。
乔纳森·艾伦

3

JavaScript(ES6),79个字节

f=
s=>s.replace(/.{1,14}/g,s=>'0169abc7543268d'.replace(/./g,c=>s['0x'+c-0]||' '))
<input oninput=o.textContent=f(this.value)><pre id=o>

十六进制字符串从@ETHproductions中被无耻地偷走了。


@ETHproductions谢谢,已修复。
尼尔

那太好了!
dodov '17

片段如何让您在输入结果时看到结果真是
太好了-MildlyMilquetoast


2

的JavaScript(ES7),144个 143 141 114 104 103字节

感谢ETHProductions节省10B!

a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``

f=a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``
f('abcdefghijklmnopqrstuvwxyz')

输出量

abgjklmhfedcginopuxyz vtsrquw 

非常好。您可以通过将数组转换为十六进制字符串并使用+('0x'+whatever)将其转换为数字来节省一些字节:(_,c)=>b[(c/15|0)*14+ +('0x'+'0169abc7543268d'[c%15])]
ETHproductions

聪明的把戏。我已经在考虑其他写数组的方法,但是我什么也没想出来。我仍然可以通过先放置十六进制数然后乘以乘法来缩短该间隔,从而使该空间变得不必要。
路加福音

您甚至可以'0x'+'...'[c%15]-0+(c/15|0)*14为自己保留一对括号:-)
ETHproductions'Jan

你是对的。添加。
路加福音

2

Perl 6,61个字节

{S:g/(.)**1..14/{[~] $0["abgjklmhfedcgin".ords X-97]X//" "}/}

这个怎么运作

基本结构是这样的:

{                                  }  # A lambda.
 S:g/(.)**1..14/{                }/   # Regex-replace segments of 1-14 characters, with:
                     $0               #   The single-char submatches captured by the parens.
                       [  ]           #   Index them using certain indices (see below).
                           X//" "}    #   Replace each undefined element with a space.
                 [~]                  #   Concatenate the characters.

用于索引每个14个字符段的表达式为"abgjklmhfedcgin".ords X- 97,其工作方式如下:

  1. 采取硬编码的字符串abgjklmhfedcgin
  2. 获取其代码点:97 98 103 106 107 108 109 104 102 101 100 99 103 105 110
  3. 从每个数字中减去97 :0 1 6 9 10 11 12 7 5 4 3 2 6 8 13

Perl 6,64个字节

{[~] .comb(14)».comb»[0,1,6,9..12,7,5...2,6,8,13].flat X//" "}

在线尝试!

这个怎么运作

基本结构是这样的:

{                                    }  # A lambda.
     .comb(14)                          # Split the argument into substrings of <= 14 chars.
              ».comb                    # Split each substring into a list of characters.
                    »[  ]               # Index each list using the same indices (see below).
                         .flat          # Flatten the resulting nested list.
                               X//" "   # Replace each undefined element with a space.
 [~]                                    # Concatenate the list to get a string again.

与上面相同的索引,但是由于.flat无论如何我们都在调用,因此我们可以为它们使用嵌套(但短1个字节)的表达式:0,1,6,9..12,7,5...2,6,8,13

(看似琐碎,但实际上依赖于Rakudo Perl 6的特殊解析,这可能是一个bug。要在不利用该bug的情况下编写它,就必须在5...2。周围添加parens 。)


2

Befunge-93,97个字节

<>0>v%2g3\p89:-1+*"!"!:+1<_@#`0:~
,^\,_\:98g\9p1+:76+`#v_:~^
^,,g96g98g9+67,,,,,$$_
==    =  ====

在线尝试!

这是源代码的细分,突出了各个组成部分。

突出显示执行路径的源代码

*主循环从右向左开始执行,环绕到游戏场的右侧。这是我们从stdin读取第一个字符的地方,如果它是EOF,则终止。
*下一节将确保使用公式将所有EOF字符转换为空格c = c + 31*!(c+1)。尽管这不适用于第一次迭代,但可以在后续遍历中发生。
*字符的副本将保存到临时存储器中,然后在第四行(*)的表上查找当前索引,以确定是否应输出字符。
*如果需要输出字符,则转到左侧分支。这里执行交换以取消下一步将要发生的交换,然后将零推入以强制分支正确。
*如果没有输出字符,我们将其向下交换到索引计数器下方的堆栈中(这是在左分支中被取消的交换)。在这两种情况下,我们都将字符存储在当前索引偏移处的内存中,增加索引,并检查它是否大于13。
*如果不是,则从stdin中读取下一个字符并重复内部循环。
*如果是这样,我们将完成一组14个字符的输出,其中7个已输出(abgjklm),其余7个在堆栈中(cdefhin)。我们放下过去两年,输出剩余的5( hfedc),然后检索和输出的特殊情况gin从内存中。
*这使我们回到主循环的开始,在此我们对接下来的14个字符再次重复该过程。


很好的解释,做得很好
MildlyMilquetoast

1

Mathematica,77 72字节

感谢JungHwan Min节省了5个字节!

Join@@Partition[#,14,14,{1,1}," "][[;;,LetterNumber@"abgjklmhfedcgin"]]&

未命名函数,将字符列表作为输入并返回字符列表。Partition[#,14,14,{1,1}," "]将输入分成长度为14的子列表,必要时用空格填充。LetterNumber@"abgjklmhfedcgin"的计算结果为{1,2,7,10,11,12,13,8,6,5,4,3,7,9,14},表示进入每个length-14子列表的顺序(适当地重复第7个元素)。然后[[;;,...]]按该顺序获取所有length-14个子列表的元素,并将Join@@答案连接在一起。

先前提交的内容:

Join@@Partition[#,14,14,{1,1}," "][[All,83224017339955102~IntegerDigits~16]]&

1
LetterNumber@"abgjklmhfedcgin"是压缩列表的一种较短方法。也;;代替All保存一个字节。
JungHwan Min

很棒的建议!
格雷格·马丁


0

PHP,94字节

foreach(str_split($argv[1],14)as$s)for($i=0;$c=abgjklmhfedcgin[$i++];)echo$s[ord($c)-97]??" ";

将命令行参数拆分为14个字节的块,并循环通过转换字符串作为子字符串的索引。用运行php -nr '<code>' <string>

我很高兴发现它??也接受空字符串(对于“无效”索引)为null。


0

Ruby,83个字节

->s{v="";(s+" "*13).scan(/.{14}/){|y|"0169:;<7543268=".chars{|o|v+=y[o.ord-48]}};v}

第一个想法是使用十六进制数字,但是ord-48保存了另一个字节(从throx的答案中窃取了)。

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.