制作“收款人”程序


95

一旦我编写了一个JavaScript程序,它将一个字符串和一个字符作为输入,并将一个一个一个地删除除第一个字符和输入字符之外的所有字符。

例如,使用输入codegolf.stackexchange.come字符计算得出:

codegolf.stackexchange.com
cdegolf.stackexchange.com
cegolf.stackexchange.com
ceolf.stackexchange.com
celf.stackexchange.com
cef.stackexchange.com
ce.stackexchange.com
cestackexchange.com
cetackexchange.com
ceackexchange.com
ceckexchange.com
cekexchange.com
ceexchange.com
ceechange.com
ceehange.com
ceeange.com
ceenge.com
ceege.com
ceee.com
ceeecom
ceeeom
ceeem
ceee

它保留第一个字符和所有es。所有其他字符将被一一删除。

您的任务是编写一个接受两个输入和输出(或返回)一个字符串的程序(或函数),以完成此操作。

技术指标

  • 您可以假定该字符串将不包含任何换行符。
  • 第二个输入将始终是一个字符。
  • 如果答案是函数形式,则可以返回包含输出中每一行的字符串数组。
  • 输出可以包含尾随换行符。

测试用例

Test Casess

Test Cases
Tst Cases
Ts Cases
TsCases
Tsases
Tsses
Tsss

Make a "Ceeeeeeee" programe

Make a "Ceeeeeeee" program
Mke a "Ceeeeeeee" program
Me a "Ceeeeeeee" program
Mea "Ceeeeeeee" program
Me "Ceeeeeeee" program
Me"Ceeeeeeee" program
MeCeeeeeeee" program
Meeeeeeeee" program
Meeeeeeeee program
Meeeeeeeeeprogram
Meeeeeeeeerogram
Meeeeeeeeeogram
Meeeeeeeeegram
Meeeeeeeeeram
Meeeeeeeeeam
Meeeeeeeeem
Meeeeeeeee

Hello World!!

Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!

Hello World!z

Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!
H

alphabeta

alphabet
aphabet
ahabet
aabet
aaet
aat
aa

upperCASEe

upperCASE
uperCASE
uerCASE
ueCASE
ueASE
ueSE
ueE
ue

这是,因此最短的代码(以字节为单位)获胜。


27
Kinda随机,但+1
TuxCrafting '16

25
+1Meeeeeeeeegram
FlipTack

在返回数组的情况下,每个元素是否都必须包含尾随换行符?
布拉德·吉尔伯特b2gills's

@ BradGilbertb2gills号
硕果累累

4
Meeeeeeeeeeeeemem
Mathime '16

Answers:


5

V,12个字节

òYpó.“„a]òd

在线尝试!

十六进制转储:

00000000: f259 70f3 2e93 8412 615d f264            .Yp.....a].d

在挑战赛之前,我已经使用最新版本的V进行了测试,并且一切正常运行,使该答案具有竞争性。

说明:

ò         ò    " Recursively:
 Yp            "   Duplicate this line
   ó           "   Remove:
    .a]      "     A compressed regex
            d  " Delete our extra line

压缩的正则表达式转换为

.\zs[^e]

意思是

.           " Any character
 \zs        " Leave the previous character out of the selection
    [^e]    " Any character except for 'e' (Or whatever is given for input)

非竞争版本(11字节)

此版本使用了Yp发布此挑战时不可用的快捷方式。


@ challenger5太棒了!我将签出一个旧版本并验证它是否可以正常工作。我可能需要稍作修改。更新后,我会对其进行ping操作。
DJMcMayhem

@ Challenger5我已经编辑了答案,并验证了发布挑战时该版本是否有效。
DJMcMayhem

如何在Linux系统上执行存储在文件中的一堆Vim命令?我cat filename | vim还是会做其他事情?
ckjbgames

31

Vim,27,26,25字节

DJqqYp:s/.\zs[^<C-r>-]<CR>@qq@qD

在线尝试!

输入格式如下:

e
codegolf.stackexchange.com

我幼稚的第一种方法是将三个字节长:

i:s/.\zs[^<Right>]<Esc>"addqqYp@a@qq@qdd

我对这个答案也很满意,因为它以我的名字开头。

DJqq:t$|s/.\zs[^<C-r>"]<CR>@qq@qD
DJMcMayhem

看到相似之处吗?嗯

不太成功的方法:

i:s/.\zs[^<Right>]<Esc>"addqqYp@a@qq@qdd
i:s/.\zs[^<Right>]<CR>@q<Esc>"adkqqYp@aq@qdd
DJ:s/.\zs[^<C-r>"]<CR>uqqYp@:@qq@qdd
DJqq:t.|$s/.\zs[^<C-r>"]<CR>@qq@qdd

说明:

D                                   " Delete everything on this first line
 J                                  " Remove this empty line
  qq                                " Start recording into register 'q'
    Y                               " Yank this line
     p                              " And paste it
      :s/                           " Run a substitute command on the last line in the buffer. Remove:
         .                          "   Any character
          \zs                       "   Move the selection forward (so we don't delete the first one)
             [^<C-r>-]              "   Followed by anything *except* for the character we deleted
                      <CR>          " Run the command
                          @q        " Call register 'q'
                            q       " Stop recording
                             @q     " Run the recursive macro
                               D    " Delete our extra line

1
我认为您在这里输入有k太多错字了:)
geisterfurz007

@ geisterfurz007我不确定我是否明白你的意思?
DJMcMayhem

它说(...)comk在第5行。
geisterfurz007,2016年

没有理由在:t这里使用。正常Yp会节省一个字节。<C-R>-当然,您必须切换到。典型PPCG规则是令人沮丧的,因为对于任何合理的测试案例,:t.|s99@:,甚至999@:会是正确的,但有没有什么好办法来得到一个无限重复的方式。您被迫使用不太有趣的策略。
udioica '16

22

MATL20 16字节

y-f1X-"t[]@X@q-(

在线尝试!或验证测试情况:12345

奖金

修改后的代码可以看到字符串逐渐缩小(离线编译器):

y-f1X-"tt.3Y.XxD[]@X@q-(].3Y.XxDvx

在此处输入图片说明

或在MATL Online上尝试

说明

y        % Implicitly input string and char. Duplicate string onto top
-        % Subtract. Gives nonzero for chars in the input string that are
         % different from the input char
f        % Array of indices of nonzero values
1X-      % Remove 1 from that array. This gives an array of the indices of 
         % chars to be removed from the string
"        % For each
  t      %   Duplicate previous string
  []     %   Push empty array
  @      %   Push index of char to be removed. But this index needs to be 
         %   corrected to account for the fact that previous chars have
         %   already been removed...
  X@q-   %   ... So we correct by subtracting the 0-based iteration index
  (      %   Assign empty array to that position, to remove that char
         % Implicitly end for each
         % Implicitly display

3
GIFS!gif很酷!
Brain Guided'Nov

20

Haskell,50个字节

w@(a:x)%c|(d,_:y)<-span(==c)x=w:(a:d++y)%c|0<1=[w]

定义一个(%)返回字符串列表的函数。

说明

(%)被称为w%c,与w被输入字符串,并c保持字符。简而言之,此定义的工作方式是将w第一个字符(a)和其余部分(x)分开x,在第一次出现除以外的其他字符时进行拆分c,然后递归地调用该自身并删除该字符。

w@(a:x)%c              -- define (%) with w separated into a and x.
 |(d,_:y)<-span(==c)x  -- split x; bind the string of `c` to d, and the rest
                       -- to _:y, dropping first character and calling the rest y.
  =w:(a:d++y)%c        -- if there was a character to drop, cons w onto the
                       -- sequence gained by recursively calling (%) with that
                       -- character removed (i.e. call with a:d++y).
 |0<1=[w]              -- if nothing needed to be dropped, the result sequence is
                       -- simply the one-element list [w]

3
你能解释一下代码吗?
bli

1
@bli完成!希望这会有所帮助吗?
dianne

14

视网膜28 27字节

字节数假定为ISO 8859-1编码。

;{G*1`
R1r`(?!^|.*¶?\1$)(.)

在线尝试!

说明

;{G*1`

这里有很多配置。阶段本身实际上是just G1`,它仅保留第一行,并丢弃输入字符。*将其转换为空运行,这意味着将在不实际更改字符串的情况下打印结果(即字符串的第一行)。{告诉Retina循环运行两个阶段,直到字符串停止更改并;阻止在程序结束时输出。

R1r`(?!^|.*¶?\1$)(.)

这将丢弃第一个字符,其中a)不在输入的开头,b)不等于单独的输入字符。


10

22 26 24 22字节

Lv+#Paa@oQb?++oPaRA:ox

将string作为第一个命令行参数,将character作为第二个命令行参数。在线尝试!

说明

循环输入的字符;如果该字符等于特殊字符,则转到下一个字符;如果不是,请将其删除并打印字符串。

一个ungolfed版本(ab得到CMDLINE ARGS; o用的值开始1x""):

P a         Print a
L #a-1      Loop len(a)-1 times:
 I a@o Q b   If a[o] string-eQuals b:
  ++o         Increment o
 E {         Else:
  a RA: o x   In-place in a, Replace char At index o with x (i.e. delete it)
  P a         Print a
 }

高尔夫技巧:

  • 的循环标头L仅计算一次,因此我们可以在其中偷偷摸摸地打印初始图像。#Pa-1因为P低优先级(它将解析为#P(a-1))而无法工作,但是我们可以v+#Pa使用v预初始化为的变量将其重新排列为-1
  • RA:运算符返回的新的价值a,所以我们可以打印出表达而不是一个单独的Pa声明。
  • 现在,if语句的两个分支都是单个表达式,因此我们可以改用三元运算符?

10

Perl 5,29个字节

我用Strawberry Perl得到了35个字节:31个字节,加上1 -nE代替-e,加上3表示空格+ -i(用于单字母输入;更长的字符串来自STDIN)。

chomp;say;s/(.)[^$^I]/$1/&&redo

但是,毫无疑问,不chomp;使用<<<29字节的,这是可行的,即使我自己无法使用Strawberry进行测试。

say;s/(.)[^$^I]/$1/&&redo

从而:

perl -im -nE'say;s/(.)[^$^I]/$1/&&redo' <<< "example"

您可以只指定“输入中没有换行符”(这是第二个程序的工作方式)。如果您非常需要删除输入中的换行符,请查看该-l选项,该选项将打开自动换行符处理模式,在该模式中,将print打印一条额外的换行符(此处不相关),并且-p/ -n输入会删除换行符(非常相关)。此外,它已被弃用,但我认为您可以用^I文字控件I 代替,以节省更多字节。最后,我认为s/.\K[^$^I]/redo/e应该短一个字符,尽管我不是100%确信放一个的合法位置redo

@ ais523,感谢换行建议,但我想我已经很好地解决了这个问题。从字面上看^I,对于大多数控制字母变量而言,这都是正确的,但对于IIRC而言并非如此。重新\K并把redo在置换/e,谢谢!如果有机会,我会进行测试。
msh210 '16

...而且它不起作用。@ ais523
msh210 '16

8

Perl 6的 47个40  38字节

->\a,\b{a,{S/^(."{b}"*:)./$0/}...^{$^a eq $^b}}
->\a,\b{a,{S/^(."{b}"*:)./$0/}...^&[eq]}
{$^b;$^a,{S/^(."$b"*:)./$0/}...^&[eq]}

展开:

{       # lambda with two placeholder parameters 「$a」 and 「$b」

  $^b;    # declare second parameter

  $^a,    # declare first parameter, and use it to seed the sequence

  {       # bare block lambda with implicit parameter 「$_」
    S/      # string replace and return
      ^       # beginning of string
      (       # capture into 「$0」
        .       # the first character
        "$b"*   # as many 「$b」 as possible
        :       # don't allow backtracking
      )
      .       # any character ( the one to be removed )

    /$0/      # put the captured values back into place
  }

  ...^      # repeat that until: ( and throw away the last value )

  &[eq]     # the infix string equivalence operator/subroutine

}

之所以...^使用它,...是因为直到重复最后一个值才&[eq]返回True


7

05AB1E26 25字节

¬ˆ[¦Ðg_#¬²k0Qi²ˆë¯J?,]¯J?

¬ˆ                         Put the first character into an array
  [                        While true
   ¦                       Remove the first character
    Ð                      Triplicate
     g_#                   if the string is empty, break
        ¬²k0Qi             if the first character is equal to the one specified in the input
              ²ˆ           Add it to the array
                ë          Else
                 ¯J?       Display the array
                    ,      Display the remaining string
                     ]     End while
                      ¯J?  Display the last string

在线尝试!

请注意,这¬²k0Q可能会被重写¬²Q,但是由于某些原因,当当前字符是一个引号时,它将不起作用:Q返回实际的字符串而不是布尔值,这会导致无限循环。

由于该代码¯J?重复,因此可以进一步进行打标。在循环中移动此部分将删除重复项,也将允许删除右方括号。


DˆćUΔD²KRнõ.;DXìˆ}¯¨»为21,但使用新命令。
魔术章鱼缸

7

Python 2,71 66个字节:

f,m=input();k=f[0]
while f:a=f[0]==m;k+=f[0]*a;f=f[1+a:];print k+f

完整的程序。通过STDIN以格式输入2个输入'<String>','<Char>'

另外,这是当前140字节的递归解决方案:

Q=lambda c,p,k='',j=1,l=[]:c and Q(c[1:],p,k+c[0]*(j<2)+c[0]*(c[0]==p),j+1,l+[k+c])or'\n'.join(sorted({*l},key=l.index))+('\n'+k)*(k not in l)

此格式应以格式调用print(Q('<String>','<Char>'))


我不是python buff,但这不应该只打印一行吗?
科纳·奥布赖恩

@ ConorO'Brien是的,我之前看错了帖子。现在已修复。
R. Kap

7

Python 3,72个字节

def e(i,k):
 for r in i:
  if r!=k:i=i[0]+i[1:].replace(r,'',1);print(i)

在线尝试!

e('😋🥕🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆','🥓')

节食:

😋🥕🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🍅🍄🍆
😋🥓🥓🥓🥓🍄🍆
😋🥓🥓🥓🥓🍆
😋🥓🥓🥓🥓

6

JavaScript(ES6),74个字节

(s,c)=>[...t=s.slice(1)].map(d=>c!=d?s+=`
`+s[0]+(t=t.replace(d,``)):s)&&s

我认为这会产生错误的输出f('test cases', 's')(以结尾stss,而不是tsss)。我认为这是因为replace删除了第一次出现,所以它删除了循环的第四次迭代中的第一次t而不是第二tmap
Lmis

@Lmis感谢您指出这一点,我认为我能够以“仅” 7个字节的罚款来修复我的一个版本。
尼尔

5

Ruby,148 139 97 90 83 77 62字节

a,c=$*;p s=""+a;i=1;while d=s[i];(d!=c)?(s[i]="";p s):i+=1;end

不知道这次交换是否接受了业余代码,但是尽管我对此感到很糟糕,但我对学习高尔夫代码感兴趣,这对我如何使该程序看起来像这里的其他程序一样有用吗?

编辑:

用p替换了看跌期权

借助Wheat Wizard,删除了一吨的空白并正确计数了字节

由于challenger5从去s=gets.chop;c=gets.chop;s,c=gets.chop,gets.chop;

更换then;gets.chopgets[0]感谢Mhutter!

现在将输入作为命令行变量,例如。 prog.rb helloworld l

多亏了jeroenvisser101的大量改进a=s.dups=""+a并用之前的if语句if s[i]!=c;s[i]="";p s;else i+=1;end进行了(d!=c)?(s[i]="";p s):i+=1;巨大的改进!


欢迎光临本站!我不是Ruby打高尔夫球的专家,但是您似乎有多余的空格。特别是在=s 附近。有关更全面的提示,请访问我们的提示页面
精神分裂症O'Zaic,2016年

例如,删除字节的最简单方法是消除多余的空格s=gets.chomp。我不确定您是否可以在Ruby中执行此操作,但是在某些语言(如Python)中,您可以将多个分配组合到一个语句中,例如a,b,c=0,1,2
硕果累累

嘿,感谢您提供有关空格的技巧,请阅读ruby文档,并意识到分号可以将其替换为结尾语句:'),就像使s = gets.chop和c = gets.chop不能使s,c = gets.chop一样这样的不幸吗更有绝对的代码中最大的一部分,我想删除洋洋万言..
本HILI

你仍然有一些额外的空间尤其关键字之前(dothenend),和周围的第四=
精神分裂症O'Zaic,2016年

看来您正在改变字节数。我自己只计算90个字节。
精神分裂症O'Zaic,2016年

4

C90,129个 125字节

带空格:

main(q, x)
{
    for (char **v = x, *a = v[1], *b = a, *c;*b++;)
        for (c = a; c == a | *c == *v[2] && *b != *v[2] && putchar(*c),
            ++c != b || *b != *v[2] && !puts(b););
}

没有空格:

main(q,x){for(char**v=x,*a=v[1],*b=a,*c;*b++;)for(c=a;c==a|*c==*v[2]&&*b!=*v[2]&&putchar(*c),++c!=b||*b!=*v[2]&&!puts(b););}

松散

#include <stdio.h>
int main(int argc, char **argv)
{
    char *a = argv[1];
    for (char *b = a + 1; *b; b++) {
        if (*b == *argv[2]) {
            continue;
        }
        putchar(*a);
        for (char *c = a + 1; c != b; c++) {
            if (*c == *argv[2]) {
                putchar(*c);
            }
        }
        puts(b);
    }
}

这需要一个指向字符串开头的指针,并进行循环,迭代该指针直到它到达字符串的末尾。在循环中,它先打印第一个字符,然后在字符串的开头和指针之间找到第二个参数的所有实例。之后,它调用放置在指针上的puts,打印出字符串的其余部分。

这必须在sizeof(int)== sizeof(char *)的系统上编译。否则+3个字节。

这是我第一次尝试在此处进行代码打高尔夫球,因此我确定需要进行一些优化。


3

Dyalog APL,27 字节

{×i←⊃1+⍸⍺≠1↓⎕←⍵:⍺∇⍵/⍨i≠⍳≢⍵}

是排除的字符,是初始字符串

打印参数 查找i一个字符之后的第一个非索引。如果找到,则递归调用并i删除


3

Mathematica,64个字节

Most@FixedPointList[StringReplace[#,b_~~Except@a:>b,1]&,a=#2;#]&

匿名函数。将两个字符串作为输入,并返回一个字符串列表作为输出。通过重复删除字符的第一个非实例来工作。


我肯定会开始使用FixedPointList
ngenisis '16

3

PHP,88 84 86 85 82 81 78字节

@IsmaelMiguel节省了1个字节,@ user59178节省了3个字节,@ user59178启发了3个字节

while($b=substr("$argv[1]\n",$i++))$a>""&$b[0]!=$argv[2]?print$a.$b:$a.=$b[0];

从命令行参数获取输入;与php -r <code> '<string>' <character>


  • 在输入中添加换行符以隐式最终打印。
    这会增加5 4个字节的代码,但会节省输出和一个额外的echo$a;

1
$argv[1]."\n"可以写成"$argv[1]\n"
Ismael Miguel

1
只要$b添加一个换行符,只要它的长度> = 1,它就总是真实的。因此,这""<是不必要的。
user59178 '16

您可以通过在中使用三进制substr()而不是分配来保存另一个字节$b
user59178

@ user59178我并没有真正抓住您:我需要substr条件和条件的结果print;所以我应该把它分配到某个地方。但是你启发了我。
泰特斯

我的意思是,for(;$b=substr($b?:".$argv[1]\n",1);)但是您现在拥有的更好。
user59178 '16

3

05AB1E,26 24 23字节

感谢@Kade 2个字节!
感谢@Emigna 1个字节!

¬UDvy²k0Êiy¡¬s¦yý«Xs«=¦

使用CP-1252编码。在线尝试!

y²k0Ê可能是,y²Ê"搞砸了。

这可能会打更多,因为«重复了两次。如果您有任何建议或更多建议,请发表评论。


3

爪哇10,155个 140 139 124字节

c->s->{var r=s+"\n";for(int i=0;++i<s.length();)if(s.charAt(i)!=c)r+=(s=s.substring(0,i)+s.substring(i--+1))+"\n";return r;}

在线尝试。

说明:

c->s->{          // Method with character and String parameters and String return-type
  var r=s+"\n";  //  Result-String, starting at the input-String with trailing new-line
  for(int i=0;++i<s.length();)
                 //  Loop over the characters of the String, skipping the first
    if(s.charAt(i)!=c)
                 //   If the current character and the input-character are equal
      r+=(s=s.substring(0,i)+s.substring(i--+1))
                 //     Remove this character from the String `s`
         +"\n";  //     And append the new `s` with trailing new-line to the result-String
  return r;}     //  Return the result-String

旧的139字节递归答案:

void c(String s,int c){System.out.println(s);for(int i=1;i<s.length();)if(s.charAt(i++)!=c){c(s.substring(0,i-1)+s.substring(i),c);break;}}

-1个字节,感谢@Eugene。(下一次请发表评论,而不要编辑别人的帖子。)

在线尝试。

说明:

void c(String s,int c){     // Method with String and integer parameters and no return-type
  System.out.println(s);    //  Print the input-String with trailing new-line
  for(int i=1;i<s.length();)//  Loop over the characters of the String, skipping the first
    if(s.charAt(i++)!=c){   //   If the current character and the input-character are equal
      c(s.substring(0,i-1)+s.substring(i),c); 
                            //    Remove this character, and do a recursive call
      break;}}              //    And stop the loop

不理会char []而只使用s.charAt()是否会更短呢?
dpa97 '16

@ dpa97啊,你是完全正确的。我最初使用了foreach循环,但将其更改为常规的for循环。忘记删除字符数组。谢谢。
凯文·克鲁伊森

2

C#,122个 117 112字节

IEnumerable F(string s,char c){for(int i=0;i<s.Length;++i)if(i<1||s[i]!=c)yield return i>0?s=s.Remove(i--,1):s;}

松散

public IEnumerable F(string s, char c) {
    for (int i = 0; i < s.Length; ++i) {
        if (i < 1 || s[i] != c)
            yield return i > 0 ? s = s.Remove(i--, 1) : s;
    }
}

返回字符串的集合。


1
使用非通用集合的好技巧。但是,如果last char不是特殊的char,它将无法工作c。在这种情况下,循环将永远尝试。
paldir '16

1
@paldir糟糕,您是对的!这次打开我的大脑,发现了更好的方法(也更短!)。
Psycho

您可以删除for循环的括号以节省2个字节。
PmanAce '16

@PmanAce对不起,您是什么意思?哪个括号?
psycho

公共IEnumerable F(string s,char c){for(int i = 0; i <s.Length; ++ i)if(i <1 || s [i]!= c)yield return i> 0?s = s.Remove(i--,1):s; }
PmanAce's

2

TSQL,127个字节(不包括变量定义)

DECLARE @1 VARCHAR(100)='codegolf.stackexchange.com'
DECLARE @2 CHAR(1) = 'o'

DECLARE @ char=LEFT(@1,1)WHILE patindex('%[^'+@2+']%',@1)>0BEGIN SET @1=STUFF(@1,patindex('%[^'+@2+']%',@1),1,'')PRINT @+@1 END

格式:

DECLARE @1 VARCHAR(100) = 'codegolf.stackexchange.com'
DECLARE @2 CHAR(1) = 'o'
DECLARE @ CHAR = LEFT(@1, 1)

WHILE patindex('%[^' + @2 + ']%', @1) > 0
BEGIN
    SET @1 = STUFF(@1, patindex('%[^' + @2 + ']%', @1), 1, '')

    PRINT @ + @1
END

很好地使用patindex,但alphabet示例似乎不太正确,它一直显示aaphabetaaa。还值得一提的是,它应该在区分大小写的排序规则的服务器或数据库上运行,否则该upperCASE示例也将失败,并显示ueE在其最后一行。
BradC

2

C#,135个 138 :( 137字节

打高尔夫球:

IEnumerable<string>F(string s,char c){int i=1,l;for(;;){yield return s;l=s.Length;while(i<l&&s[i]==c)i++;if(i==l)break;s=s.Remove(i,1);}}

取消高尔夫:

    IEnumerable<string> F(string s, char c)
    {
        int i = 1, l;

        for (;;)
        {
            yield return s;

            l = s.Length;

            while (i < l && s[i] == c)
                i++;

            if (i == l)
                break;

            s = s.Remove(i, 1);
        }
    }

函数返回字符串的集合。

EDIT1:@psycho注意到算法未正确实施。

EDIT2:为创建了变量s.Length。@TheLethalCoder节省了一个字节。


1
如果输入的char连续出现多次,将不起作用。例如:codeegolf e会给予ce代替cee
Psycho

if与@psycho交换,while它可以工作。
paldir '16

更好!但是它可以更短。我会贴自己的!
psycho

1
创建一个变量s.Length以保存一个字节:int i=1,l;for(;;){yield return s;l=s.Length;while(i<l&&s[i]==c)i++;if(i>=l)break;s=s.Remove(i,1);}}
TheLethalCoder

2

Python 2-65 73字节

lambda s,c:[s[0]+c*s[1:i].count(c)+s[i+1:]for i in range(len(s))]

还有一个76字节的递归解决方案,因为尽管比第一个更长,但我还是更喜欢它:

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

2

拍子194字节

(let p((s s)(n 1)(t substring)(a string-append))(displayln s)(cond[(>= n(string-length s))""]
[(equal? c(string-ref s n))(p(a(t s 0 n)(t s n))(+ 1 n)t a)][else(p(a(t s 0 n)(t s(+ 1 n)))n t a)]))

取消高尔夫:

(define (f s c)
  (let loop ((s s)
             (n 1))
    (displayln s)
    (cond
      [(>= n (string-length s))""]
      [(equal? c (string-ref s n))
       (loop (string-append (substring s 0 n) (substring s n))
             (add1 n))]
      [else
       (loop (string-append (substring s 0 n) (substring s (add1 n)))
             n)])))

测试:

(f "Test cases" #\s)
(f "codegolf.stackexchange.com" #\e)

输出:

Test cases
Tst cases
Tst cases
Ts cases
Tscases
Tsases
Tsses
Tsses
Tsss
Tsss
""
codegolf.stackexchange.com
cdegolf.stackexchange.com
cegolf.stackexchange.com
cegolf.stackexchange.com
ceolf.stackexchange.com
celf.stackexchange.com
cef.stackexchange.com
ce.stackexchange.com
cestackexchange.com
cetackexchange.com
ceackexchange.com
ceckexchange.com
cekexchange.com
ceexchange.com
ceexchange.com
ceechange.com
ceehange.com
ceeange.com
ceenge.com
ceege.com
ceee.com
ceee.com
ceeecom
ceeeom
ceeem
ceee
""

2

JavaScript(ES6),64 69

用换行符返回单个字符串

s=>c=>[...s].map((x,i,z)=>i&&x!=c&&(z[i]='',s+=`
`+z.join``))&&s

F=
s=>c=>[...s].map((x,i,z)=>i&&x!=c&&(z[i]='',s+=`
`+z.join``))&&s
  

function update() {
  var s=S.value,c=C.value[0]
  O.textContent=F(s)(c)
}

update()
<input id=S value='Hello world!' oninput='update()'>
<input id=C value='!' oninput='update()'>
<pre id=O></pre>


有点奇怪的是,它不需要两个参数,而是一个参数,然后在需要提供第二个参数的地方返回另一个函数。我不确定这是否是预期的行为。
MT0

@ MT0我很奇怪,但是它被具有2个参数的函数接受,因为它节省了1个字节。我会给你参考的。这是meta.codegolf.stackexchange.com/a/8427/21348
edc65 '16

很棒的技术,我没有意识到修改第三个参数.map是累积的。我看到了,.map().filter()并以为“这将使数组理解变得更好!”,但是数组理解中缺乏索引杀死了它,并且它的长度相同:(s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]顺便说一句,我为所有这些计数了68个字节。)
ETHproductions

1
实际上,通过重新排列参数,您可以将数组理解降至66:([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
ETHproductions 2016年

@ETHproductions不能相信我是错误的字节数再次。无论如何,多亏了让我再考虑一下,所以我得到了64的标准ES6
edc65 '16

2

迅速3 - 151个 147字节

Swift不是打高尔夫球的理想语言,尤其是在与字符串索引相关的时候。这是我能做的最好的事情:

func c(a:String,b:String){print(a);var q=Array(a.characters),i=1;while i<q.count{if "\(q[i])" != b{q.remove(at:i);c(a:String(q),b:b);break};i=i+1}}

不幸的是,Swift需要周围有空格!=(但不是==),而Swift 3删除了++运算符。这两种技巧都在于将其转换为允许整数索引的字符数组,并使用字符的字符串内插将其转换回String"\(c)")。

取消高尔夫:

func c(a:String, b:String) {
    print(a)
    var q = Array(a.characters)
    var i = 1
    while i < q.count {
        if "\(q[i])" != b {
            q.remove(at:i)
            c(a: String(q), b: b)
            break
        }
        i=i+1
    }
}

以前的非递归解决方案

func c(a:String,b:String){var q=Array(a.characters),e={q.removeFirst()},z="\(e())";print(a);while !q.isEmpty{"\(e())"==b ? z=z+b : print(z+String(q))}}
func c(a:String, b:String) {
    var q = Array(a.characters)
    var z = "\(q.removeFirst())"
    print(a)
    while !q.isEmpty {
        if "\(q.removeFirst())" == b {
            z = z + b
        }else{
            print(z + String(q))
        }
    }
}

欢迎来到PPCG!可以删除代码末尾的一些空白吗?
ETHproductions 2016年

不幸的是,@ ETHproductions不是,三元运算符和while需要编译的空间。我还玩过typealiasing String并尝试将其设置print为闭包,但是它们没有节省任何空间。
rabidaudio

2

Pyke,26 19 17字节

jljjhF3<Q/Q*jih>s

在这里尝试!

                  - Q = input
j                 - j = input_2
 ljjhF3           - for (i, j, j[0]) for i in range(len(j))
       <          -     j[:i]
        Q/        -    ^.count(Q)
          Q*      -   ^*Q
                s -  sum(j[0], ^, V)
            jih>  -   j[i+1:]

你能补充一个解释吗?
硕果累累

@ Challenger5完成并打了2个字节!
2016年


1

JavaScript ES6,89个字节

我以为这是一个容易的挑战,但是我敢肯定我在这里遗漏了一些东西。

使用递归并返回字符串数组

(c,i=1,r)=>f=a=>a[i]?a[i++]==c?f(a):f(g=a.slice(0,i-1)+a.slice(i--),(r=r||[a]).push(g)):r

F=
  (c,i=1,r)=>f=a=>a[i]?a[i++]==c?f(a):f(g=a.slice(0,i-1)+a.slice(i--),(r=r||[a]).push(g)):r

G=_=>A.value.length>1 && (O.innerHTML = F(E.value)(A.value).join`
`)

G()
<input id=A oninput='G()' value='alphabet'>
<input id=E oninput='G()' value='a'>
<pre id=O>


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.