!插入!n!b!e!t!w!e!n!


24

这里发布。

这个问题高度“提炼”了这个问题。特别感谢@Akababa!

在此任务中,您应该在字符串的开头和每个字符之后插入一个感叹号。

规则

  • 始终会有一个非空字符串输入。输入也将不包含选项卡。您可以假定输入仅包含不可扩展的ASCII可打印字符和换行符。
  • 只要您的语言无法检测到换行符,输入内容就不会包含尾随的换行符。
  • 这是一场比赛;最短的答案应该会赢。

例子

  • 4个换行符导致5个换行符分隔的感叹号。很难将其作为Markdown文本,因此改为声明。
1 2 3 4 5 6
129591 129012 129127 129582

0

产出

1!!2!!3!!4!!5!!6!
!1!2!9!5!9!1!1!2!9!0!1!2!!1!2!9!1!2!7!!1!2!9!5!8!2!
!
!0!
asd afjoK ak:e
kPrLd
    fOJOE;
    KFO
KFkepjgop sgpaoj faj

产出

!!!!a!f!j!o!K!!a!k!:!e!
!k!P!r!L!d!
!!!!f!O!J!O!E!;!
!!!!!K!F!O!
!K!F!k!e!p!j!g!o!p!s!g!p!a!o!j!!!f!a!j!

一个只有一个字符的基本测试用例:

一种

产出

!一种!

(自动完成!只是在开玩笑,没有这样的东西。)包含感叹号:

!!
!!
!!
!!
!!

输出:

!!!!!
!!!!!
!!!!!
!!!!!
!!!!!


7
我真的不明白反对意见-这是一个清晰明确的挑战。回复:是重复的-不是(在'!'前面有很大的不同),而且我不相信有人建议这样做(没有近距离票数)。
乔纳森·艾伦

1
如果语言不能告诉之间的区别a\na,我们可以要求,没有尾随换行符?
朱塞佩

13
就像在挑战中所描述的那样,在每个上投票之间插入下票。
A̲̲

2
是死了。
V. Courtois

Answers:



12

Python 3,27个字节

lambda s:f"!{'!'.join(s)}!"

在线尝试!

老实说,我希望有人可以给我展示一个很酷的方法来减少字节数。


这不能正确处理空行情况

@flakes是什么意思?如果您的意思是一个空字符串:我们不需要处理一个空字符串(无论!!在这种情况下输出什么,这对我来说都是有意义的)。如果您指的是字符串\n:那就这样做了,因为正确的输出是!\n!
乔纳森·艾伦

3
@JAD据我所知,示例中没有空字符串。不仅如此,第一个规则从字面上说“总是会有一个非空的字符串输入”。
恢复莫妮卡

1
啊,我错了。第一个示例在输入的中间有一个空行。但是,此答案将可以将感叹号放在中间!\n!\n!。做得好。
剥落






8

JavaScript(ES6),19个字节

将输入作为字符数组。

s=>`!${s.join`!`}!`

在线尝试!


JavaScript(ES6), 23个  20字节

@ShieruAsakoto节省了3个字节

将输入作为字符串。

s=>[,...s,,].join`!`

在线尝试!


JavaScript(ES6),22个字节

@tjjfvi建议

将输入作为字符串。

s=>s.replace(/|/g,"!")

在线尝试!



@tjjfvi漂亮的一个!
Arnauld

5
我为您的23 s=>[,...s,,].join`!`
点准备

7

R,25个字节

function(x)gsub("","!",x)

在线尝试!

接受并返回字符向量的函数。


由函数形式切换到能刮胡子3个字节scan(,''),像这样tio.run/##K/r/P724NElDSUlHSVFJpzg5MU9DR11dU/O/...
Sumner18

@ Sumner18谢谢。我从那开始,但是它在空格处分割了输入。
尼克·肯尼迪

1
@ Sumner18挑战要求使用换行符来处理输入,这是不能做到的scan(但是尼克的解决方案可以处理换行符,至少如果您使用cat。显示输出)
Robin Ryder

7

8086机器代码,.COM格式(MS-DOS 2 +),32字节

(-1取决于仿真器:请参见下文)

为了获得最佳结果,请从文件中重定向标准输入,因为由于没有缓冲,键入会产生看起来很奇怪的输出。另外,换行符看起来有点怪异,因为它们存储为CR LF,并且该CR部分使输出混乱。

该程序在实际的MS-DOS仿真中表现良好(例如PCjs),但DOSBox似乎与Ctrl + Z EOF有关(请参见程序集列表中的注释),因此,除非您使用DOSBox,否则不要尝试使用控制台输入输入添加额外的支票!

BB 01 00 53 59 BA 0B 01 B4 40 CD 21 4A 4B B4 3F CD 21 85 C0 74 09 B4 40 43 41 CD 21 49 EB EE C3

一些有趣的地方:

  • 我通过重用已经执行的内存来节省了一些数据空间(21Hin INT 21H恰好是!

  • 几乎可以使用在“ BCD指令的隐藏力量”页面上找到的一个有趣技巧,该技巧可以让我使用AAA而不是标准TEST来比较AL0,从而节省了一个字节。不幸的是,这没有完整记录,因此我不能依靠它:例如,PCjs除了进位标志和辅助进位标志之外什么也不能调整。:-(

汇编代码(TASM理想模式):

IDEAL
MODEL   TINY

CODESEG
ORG 100H

;; DOSBox (tested with 0.74-2) didn't seem to handle Ctrl-Z as EOF
;; so uncomment the ";;" lines to run it there.
MAIN:
    MOV     BX,1
    PUSH    BX
    POP     CX
    MOV     DX,OFFSET MAIN_1+1  ; The 21H in INT 21H
    MOV     AH,40H
MAIN_1:
    INT     21H
    DEC     DX
    ;;PUSH  DX
    ;;POP   SI
IO_LOOP:
    DEC     BX
    MOV     AH,3FH
    INT     21H
    ;;; This should work on an non-emulated PC. 
    ;;;AAA      ; AL=0?
    TEST    AX,AX
    JZ      DONE
    ;;CMP   [BYTE PTR SI],1AH
    ;;JZ    DONE
    MOV     AH,40H
    INC     BX
    INC     CX
    INT     21H
    DEC     CX
    JMP     IO_LOOP
DONE:
    RET
ENDS
END MAIN


6

佩佩,47个字节

REREEeRErEErREeeEeeeeEREEeeREEeereeREEEEeeEReee

在线尝试!

说明:

REREEeRE # Push 0,then input (str),then 0 -> (R)
         # The zeroes are pushed to correct the inserting
rEE # Begin loop labelled 0 -> (r)
  rREeeEeeeeE # Push "!" -> (R)
              # r flag inserts it instead of pushing
  REEeeREEee # Move pointer pos 2 steps forward -> (R)
ree # Loop while (R) != 0
REEEEeeE # Remove characters of (R) that are in stack of (r)
         # Removes the 0 in (R)
Reee # Output (R)

您如何编写此代码?您使用一些代码转换器吗?尝试写作似乎很疯狂
Cruncher

1
@Cruncher 1)我以此为指导。2)不,我不使用代码转换器,我只是使用指南来编写代码。
u_ndefined

6

迷宫 19 11 10  9字节

33
..
",@

在线尝试!

怎么样?

我们进入迷宫在左上方,右对着无穷零。

                         I / O    stack
                                  0,0,0,...
3 - pop * 10 + 3                  3,0,0,0,...
  - 2 neighbours, forward
3 - pop * 10 + 3                  33,0,0,0,...
  - 2 neighbours, forward
. - pop & print chr          !    0,0,0,...
  - T junction from the side
  -   TOS==0, forward
, - read chr or -1       L        76,0,0,0,...   or   -1,0,0,0
  - T junction from the base
  -   if TOS > 0 right:
" -     no-op                     76,0,0,0,...
  -     2 neighbours, forward
. -     pop & print chr      L    0,0,0,...
  -     T junction from the side
  -       TOS==0, forward
3 -       ...back to the start
  -   elif TOS == -1 left:
@ -     exit                                          we're out!


  * right, but on the first occasion (from above) we hit the wall and turn
    around, so that's like a left

幸运的是,我们不需要处理不可打印的内容,否则第一个零字节将使我们转身,并造成严重破坏。



4

Zsh,32个字节

for c ('' ${(s::)1})echo -nE $c!

在线尝试!

(s::)拆分为字符,''在开头添加一个空元素,然后回显echo -nE $c!每个元素,后跟一个!


4

Perl 5 -p0, 17 6个字节

s,,!,g

在线尝试!

我最初的答案是-p$_='!'.s,.,$&!,gr。感谢@Nahuel Fouilleul削减了11个字节,并感谢@Grimy给了-p0小费。



1
@NahuelFouilleul -lp为测试用例提供了错误的输出\n\n\n\n(返回4个换行符,!而不是指定的5个)。-p0正常工作。
Grimmy

4

6502,12个字节(如果使用Apple II,则为13个字节)

6502

机器码假定一对零页面位置连接到字符输入($ FE)和输出(FF)硬件。许多基于6502的系统都以这种方式简化I / O,尽管I / O地址通常不在零页中。

为了简单起见,我使用了Py65,这是一个用Python编写的6502微型计算机系统模拟器。

这是来自Py65的内存转储。您可以在零页的任何位置加载以下代码,以使其不会与$ FE和$ FF重叠。

       PC  AC XR YR SP NV-BDIZC
6502: 0000 00 00 00 ff 00110010
.mem 0:b
0000:  a9  21  85  ff  a5  fe  f0  fc  85  ff  d0  f4

在Windows命令窗口中运行,您可以粘贴(Ctrl + V)所需的任何文本,也可以直接键入。如果键入,请按Ctrl + J换行(相同的ASCII字符)。按Ctrl + C中断处理器并返回Py65命令提示符。

自然,汇编代码更易于阅读。

       PC  AC XR YR SP NV-BDIZC
6502: 0000 00 00 00 ff 00110010
.d 00:0b
$0000  a9 21     LDA #$21
$0002  85 ff     STA $ff
$0004  a5 fe     LDA $fe
$0006  f0 fc     BEQ $0004
$0008  85 ff     STA $ff
$000a  d0 f4     BNE $0000

为了清楚起见,这是CBA65格式的汇编代码。

; ASSEMBLE:
; cba65 bangit
;
; LOAD/RUN
; python3 py65/monitor.py -i 00fe -o 00ff -l bangit.bin
; goto 0000

        .FILES  BIN=256

; I/O LOCATIONS
GETC    .EQU    $FE             ; (1) MOVING PY65'S GETC TO ZP SHAVES 1 BYTE
PUTC    .EQU    $FF             ; (1) MOVING PY65'S PUTC TO ZP SHAVES 2 BYTES

        .ORG    $0000

VROOM   LDA     #'!'
        STA     PUTC
VROOM2  LDA     GETC
        BEQ     VROOM2
        STA     PUTC
        BNE     VROOM

        .END

苹果II

上面的代码假定为null表示没有输入,因此继续轮询直到返回非null值。

为了进行比较,Apple I和Apple II通过设置键盘I / O地址的第7位来通知新字符的可用性,然后在提取字符后需要将其清除。在那些系统上,字符I / O通常是通过调用系统监视器例程来执行的,而不是直接访问硬件。

通过调用RDKEY($ FD0C)和COUT($ FDED),上述等同于Apple II的代码可以用13个字节编码,并且可以在RAM中的任何位置运行。这是我在Apple // e模拟器a2ix中运行的代码 Android 2上的。

按回车键与换行符具有相同的效果。

*300L

0300-   A9 A1       LDA   #$A1
0302-   20 ED FD    JSR   $FDED
0305-   20 0C FD    JSR   $FD0C
0308-   20 ED FD    JSR   $FDED
030B-   F0 F3       BEQ   $0300

您是否注意到使用#$ A1代替感叹号的常规ASCII值#$ 21?这是因为将标准ASCII值发送到COUT会导致它们以“反模式”(黑底白字)显示。在普通白底黑字上显示ASCII要求在调用COUT之前将#$ 80添加到累加器中的字符值。因为RDKEY返回带有高位集的字符,所以汇编程序通常在使用字符之前清除字符的位以获取其ASCII值。


1
欢迎光临本站!:)
Rahul Bharadwaj

谢谢你,@ Rahul!

4

Bash,36个字节

while read -n1 c;do printf \!$c;done

在线尝试!

这指望换行符终止最后一个输入!标记。


欢迎!请考虑添加解释或指向解释器的链接或其他内容,因为仅代码的答案会自动标记为低质量。
mbomb007

@ mbomb007,谢谢您的指导。

1
不幸的是,这并没有!在输入的末尾添加。
Kritixi Lithos

@Cowsquack:在我的终端上,终止输入的换行符得到了!添加。在tio.run上,需要使用回车符终止输入。我已经更新了“在线试用”的链接以反映这一点。

4

马里奥朗95 94 90 89 69字节

++++++
======< >)
>+++++++",+[
=======<.==<
>+++++++!(.-
========#===

在线尝试!

第一次尝试MarioLANG,这很有趣!

感谢Jo King的-20个字节

说明:

因此,顾名思义,MarioLANG的执行类似于Super Mario Bros的游戏。它的运行方式与BF类似,内存排列在一个单元带中。有些运算符可以递增,递减,打印(ascii或数字)并读入当前存储单元,而运算符可以在磁带上向左或向右移动。

Mario(指令指针)始终从程序的左上角单元开始,其预期的运动方向设置为右侧。如果Mario在他下面没有地板状的物体(=,“或#”),他将跌倒直到到达地板状的物体。如果Mario离开程序空间,则由于Game Over :(

这个特定的程序基本上可以分为两部分:设置和循环。

   Setup                          Loop
-----------------------------------------------
                       |
++++++                 |          
======<                |          >)
>+++++++               |          ",+[
=======<               |          .==<
>+++++++               |          !(.-
========               |          #===

在“设置”部分,我们仅递增第一个存储单元,直到达到33-“!”的ASCII值。很容易;如果可以打高尔夫球,那完全是形状问题。马里奥从左上方开始,捡起10个硬币,在捡起第11个硬币时开始掉落,切换方向,然后重复。他拿起最后11个硬币,没有切换方向。他在最右下角的“ +”结束设置部分。

在循环部分,马里奥首先到达电梯。“!” 操作员让他停止运动,以便他留在电梯上。在向上的过程中,它将相应的ASCII字符打印到当前存储单元的值(此始终为33,“!”),然后切换到内存中的下一个单元。马里奥(Mario)到达顶部,并将其方向设定为右侧。他跌倒了,并从输入中读取一个字符作为其ASCII值(如果没有字符,则为-1)。之所以增加,是因为MarioLANG中唯一的控制措施是在当前存储单元的值为0时跳过一条指令。如果是,我们将跳过更改Mario方向的操作,因此他将直接从下一层走到他的厄运。如果没有,我们将方向设置为左;否则,我们将方向设置为左。从下面的地板左移,将当前单元格递减回其先前的值,


先前版本(89字节):

+++++++++++>,
==========@"+
+++++++++++)[
@==========.==<
+++++++++++!(.-
===========#===

通过使用乘法循环而不是仅计数器来获得62个字节
Jo King

好吧,那真酷。我将在有时间重做解释时尽快进行更新,非常感谢!
恢复莫妮卡

1
啊哈!60字节乘以5 * 6 + 3而不是8 * 4 + 1
Jo King

伙计,我知道这不完全是您的第一个牛仔竞技表演,但这确实令人印象深刻。xD
恢复莫妮卡

实际上,这是我第一次打高尔夫球MarioLANG。我只是有一些关于Brainfuck以及其他2D语言的经验
Jo King

4

Perl 6的16 11个字节

{S:g/<(/!/}

在线尝试!

用惊叹号替换所有零宽度的匹配项。不允许使用正则表达式为空,因此我们使用捕获标记不捕获任何内容



3

05AB1E,4 个字节

€'!Ć

I / O作为字符列表。

在线尝试。

说明:

'!  '# Prepend a "!"-item before each character in the (implicit) input-list
   Ć  # Enclose (append the first character of the list at the end of it)
      # (after which the result is output implicitly)


3

三角形15 13字节

B\3;#*~.,</@<

在线尝试!

记住Triangular具有条件暂停运算符后的-2个字节。

我相信这和它一样短。三角确实具有条件方向改变算子,但不幸的是它们的工作原理不同于其他条件。当所有其他命令检查ToS <= 0时,方向更改条件检查ToS!=0。如果不是这种情况,我们将有10个字节,形式为Bq3~#*/@<<

取消高尔夫:

    B
   \ 3
  ; # *
 ~ . , <
/ @ <
----------------------------------------------------
B3*              - Push 11 and 3, then pop both and push their product.
    <,<          - Change directions 3 times (to save 2 bytes on last line)
        @/       - Print Top of Stack value as a character, do not pop
          ~;\    - Push a character from input to ToS. Halt if ToS <= 0. Change Direction.
              #  - Print ToS as a character and pop

先前版本(15字节):

B.3\.*#).(/?~@<

3

SimpleTemplate,23个字节

这是我写的一种语言,应该用于模板,但是很好。

!{@eachargv.0}{@echo_}!

一旦您看到了不完整的代码,应该几乎是不言自明的:

!{@each argv.0 as char} {@echo char}!{@/}

并给出一个解释:

  • !-打印文字!字符
  • {@each argv.0 as char}-循环遍历每个字符,并将值设置为变量char可选,默认变量为_)。
    argv.0是传递给的第一个参数render() method of the compiler.
  • {@echo char}!-输出char变量和文字!字符。
    对于高尔夫球版本,默认变量_ is used instead.
  • {@/}-关闭循环(可选

SimpleTemplate解决方案:

{@fn x}!{@eachargv.0}{@echo_}!{@/}{@/}

创建一个功能 x that outputs the same result.

您可以像这样使用它:

{@call x "this is an example"}

您可以尝试以下所有方法: http://sandbox.onlinephpfunctions.com/code/f6baff8d411fc8227ece81eccf05b6e7d3586bfa

在908行,您可以使用变量$golfed$ungolfed$fn测试所有版本。



但是,如果允许使用字符数组,则会简化代码(20字节):

!{@echoj"!" argv.0}!

和无高尔夫球场:

!{@echo separator "!" argv.0}!

基本上,输出数组中的所有项目,由,连接"!",用literal包围!
Due to limitations in the compiler class, the space is mandatory (in the golfed version).

在纯SimpleTemplate中也很难使用此代码(以该函数为例):

{@fn x}!{@echoj"!" argv.0}!{@/}

{@// alternative: @call str_split into a "a char array"}
{@set a "a", " ", "c", "h", "a", "r", " ", "a", "r", "r", "a", "y"}

{@call x a}

The @call can call a function that exists in PHP, which means that it isn't a pure SimpleTemplate solution.



2

Gema, 11 characters

\A=\!
?=?\!

Unfortunately ! starts a comment in Gema, so must be escaped.

Sample run:

bash-5.0$ echo -ne '1 2 3 4 5 6\n129591 129012 129127 129582\n\n0' | gema '\A=\!;?=?\!'
!1! !2! !3! !4! !5! !6!
!1!2!9!5!9!1! !1!2!9!0!1!2! !1!2!9!1!2!7! !1!2!9!5!8!2!
!
!0!

Try it online!


2

Jelly, 5 bytes

Ż”!ṁż

A full program accepting a string, which prints the result.

Try it online!

How?

Ż”!ṁż - Main Link: list of characters, s   e.g. "abc"
 ”!   - character '!'                           '!'
   ṁ  - mould like:
Ż     -   s with a zero prepended              "!!!!"
    ż - zip together with s                    ["!a","!b","!c",'!']
      - implicit (smashing) print              !a!b!c!

2

Japt, 4 bytes

rP'!

Try it

r      Replace
 P     all empty strings "" with
  '!   An exclamation mark (If '!' wasn't a special character in Japt I could remove the quote)

You'd only be able to ditch the ' if the replacement were a number.
Shaggy

2

Japt, 4 bytes

rP'!

Try it

Japt -P, 7 bytes

Unfortunately ! is a reserved character, necessitating the quotation marks.

ï'! i'!

Try it

Not much to explain: ï is Cartesian product and i prepends.


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.