从整个字符串中删除所有出现的字符串首字母


24

给定仅包含字符A-Za-z和的输入字符串,请删除该字符串的第一个字符的A所有大小写形式(如果第一个字符被删除,则所有As和as,如果第一个字符是(space)remove)所有空格),然后打印输出。

示例案例:

  • Testing Testing One Two Three -> esing esing One wo hree
  • Programming Puzzles and Code Golf -> rogramming uzzles and Code Golf
  • How much wood would a woodchuck chuck if a woodchuck could chuck wood -> ow muc wood would a woodcuck cuck if a woodcuck could cuck wood
  • {space}hello world -> helloworld
  • welcome to WATER WORLD -> elcome to ATER ORLD

这是,最短的代码以字节为单位!

笔记:

  • 输入将始终是2个或更多有效字符。
  • 输出永远不会是一个空字符串。

我们需要处理输出为空字符串的情况吗?如果输入为空字符串怎么办?
lirtosiast 2015年

@ThomasKwa,您可能会假设输出将始终是2个或更多字符
GamrCorps,2015年

@ThomasKwa和输出永远不会为空
GamrCorps

Answers:


9

Pyth,7个字节

-zrBhz2

在线尝试:演示测试套件

真好 新的分叉运算符(仅8天大)可以帮助您节省一个字符。我认为这是使用此功能的第一个代码。

说明

-zrBhz2   implicit: z = input string
    hz    take the first character of z
  rB  2   B generates a list, containing the original char and the  
          result of r.2 applied to the char, which swaps the case
-z        remove these two chars from z and print the result 

2
整洁,对此一无所知。+1
FryAmTheEggman 2015年

14

脑干,219字节

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

(要求使用磁带,该磁带要么允许指针转到负数,要么在尝试时循环到末尾。还要求,在EOF处返回0。以我的经验,大多数解释器默认情况下都满足这些要求。)

事实证明这很容易!如果它是可打高尔夫球的,我不会感到惊讶(我对可能会浪费字节的地方有所了解,但我不确定它是否会成功使用)。尽管如此,让它开始工作并不是真正的挑战。

此代码将ASCII值小于97的所有内容都视为大写字符。如果第一个字符是空格,它将尝试从字符串中删除所有出现的“小写空格”(chr(32+32)@)。可以,因为只会出现字母和空格。

有评论:

to make comments shorter: everywhere it says "fc" means "first character"

#################################### GET FC ####################################

+[+[>+<+<]>]        shortest way to get 96
                    any number above 89 and less than 97 would work because this
                    is only for figuring out if the first character is capital

,[<+<+>>-]          create two copies of the first character


### current tape: | fc | fc | 000 | 096 | ###
###      pointer:              ^          ###

########################### FIND MAX(FC MINUS 96; 0) ###########################


>[                  96 times:

  <<                  go to the cell with the first char

  [->]                if not 0: sub one and move right


  ### current tape: | fc | char being worked on | 000 | 096 | ###
  ###      pointer:                           ^ OR ^          ###      


  >[<]>               collapse the wavefunction; sync the branches

-]


### current tape: | fc | fc is lowercase ? nonzero : zero | 000 | 000 | ###
###      pointer:                                                  ^    ###

############################# GET BOTH CASES OF FC #############################

++++[<++++++++>-]   get 32 (add to uppercase character to get lowercase)

<<[                 if the character is already lowercase:

  [-]                 clear the lowercase flag

  ----[>-<----]>-     sub 64 from the cell with 32

<]

<[>+>+<<-]          add fc to the 32 or minus 32 to get both cases


### current tape: | 000 | fc | other case of fc | ###
###      pointer:    ^                            ###

###################### LOOP THROUGH REMAINING CHARACTERS #######################

<,[                 for each character:

  [>+>>>+>>+>+<<<<<<<-]
                      make four copies
                      (only 3 are strictly needed; 4th will resync a branch)

  >>                  go to the first case of fc

  [<<+>>-]<<[>->+<<-] subtract one case of fc from one copy

  >[[-]+<]            if the result is nonzero set it to 1

  >[>]<<              go to the other case of fc (and resync branches)

  [>>+<<-]>>[<-<+>>-] subtract other case of fc from other copy

  <[[-]+>]            if the result is nonzero set it to 1

  >>[<]               resync branches using extra copy

  <<<<[>>>+<<<-]>>>   add results together

  -                   subtract 1

   if the character exactly matched either case: 1 plus 0 minus 1 = 0
  if the character exactly matched neither case: 1 plus 1 minus 1 = 1
    if the character exactly matched both cases: impossible

  [                   if the result is 1:

    >>.<<               output character

    -                   set cell to 0 to kill loop

  ]

  >>>[[-]<]           clean up remaining copies

  <<<<<,              get next character; or end loop if done

]

请不要高尔夫球下来太多太多。c:我非常努力……
艾迪生·克伦普

13

Perl,13个字节

#!perl -p
/./,s/$&//gi

将shebang视为一个,输入来自stdin。


样品用量

$ echo Testing Testing One Two Three | perl remove-first.pl
esing esing One wo hree

$ echo \ Testing Testing One Two Three | perl primo-remove.pl
TestingTestingOneTwoThree

真好 我在考虑Perl可能会因为需要编写substr而表现不佳,但是您当然想出了一种更好的方法!
hobbs 2015年

为什么将hashbang视为一个字节?
Zereges

如果脚本以方式调用,则@Zereges不需要shebang行perl -p script.pl。通常,至少在此站点上,命令行选项通常每个字节计为一个字节。
primo

@primo我明白了,谢谢。
Zereges 2015年

10

CJam,8个字节

q(_32^+-

CJam解释器中在线尝试。

怎么运行的

q        e# Read all input from STDIN.
 (       e# Shift out the first character.
  _32^   e# Push a copy and XOR its character code with 32.
         e#   For a letter, this swaps its case.
         e#   For a space, this pushes a null byte.
      +  e# Concatenate these two characters.
       - e# Remove all occurrences of both from the input string.

我最初是为了学习CJam而提出这个挑战的,但我从来不了解XOR!
GamrCorps

2
我个人感到惊讶的是,在此挑战中,除sed之外的任何语言都可以击败perl。
primo

@primo-您没有注意到CJam和/或Pyth几乎赢得了其中的99%吗?Perl的表现相当不错,因为它是唯一未专门设计为高尔夫语言的语言。
Darrel Hoffman

Pyth和CJam的运算符重载是荒谬的。minus(string,string)执行每个字符的删除不是我遇到的任何其他语言的核心操作。
Sparr

@Sparr APL具有相同的内置功能。(~尽管这样。)
丹尼斯

7

Pyth,8个字节

-zr*2hz3

在线尝试

使用Pyth的python版本str.title将第一个字母的字符串两次转换为form "<Upper><Lower>"。然后,它从该字符串中的输入中删除每个元素。空间工作正常,因为它们不受的影响str.title



5

JavaScript(ES6),38 36字节

这不依赖于Mozilla特定的flags参数

f=x=>x.replace(RegExp(x[0],'gi'),'')

CoffeeScript,39 37字节

有一次它在JS中比CoffeeScript短!

f=(x)->x.replace RegExp(x[0],'gi'),''

3
至少在我尝试过的浏览器中,new是可选的,因此RegExp(x[0],'gi')较短。
尼尔

4

PHP,41字节

接受一个命令行参数。需要为PHP <5.4启用短开放标签。

<?=str_ireplace($argv[1][0],'',$argv[1]);

1
您可以通过声明一个包含$argv[1]以下内容的变量来缩短它:<?=str_ireplace(($a=$argv[1])[0],'',$a);
Benoit Esnard 2015年

3

Perl,27个字节

这是一个完整的程序,尽管它仅基于2个正则表达式,可能会复制到Retina程序中以将字节保存在I / O上。

$_=<>;m/(.)/;s/$1//gi;print

编辑:看起来这已经被使用该-p选项的人打败了。哦,用$&代替$1


1
即使计算了整个shebang(即“完整”程序),#!perl -p也仍比短了两个字节$_=<>;print
primo的

@primo我从没有在高尔夫球中使用任何选项。我只是谷歌搜索该-p选项的作用。在不与您的答案完全相同的情况下,我实际上无法对答案进行任何修改。
PhiNotPi

3

Minkolang 0.923个 33字节

这绝对不会赢,但是,这很有趣!

" Z"od0c`1c*-$I[odd0c`1c*-2c=?O].

在这里尝试。

说明

" Z"                                 Makes it easier to uppercase
    od                               Take first character of input and duplicate
      0c`1c*-                        Uppercase if needed
             $I[               ]     Loop over the input
                odd                  Take character from input and duplicate twice
                   0c`1c*-           If it's lowercase, uppercase it.
                          0c=?       Check to see if it's equal to first character
                              O      If not, output as character
                                .    Exit

(这在某些情况下可能会失败,例如第一个字符是符号。)


3

TECO15 14字节

编辑文字?如有疑问,请使用文本编辑器和更正器!

经过反复试验(多数是错误)后,我认为这是可以完成这项工作的最短的通用TECO程序。

0,1XA<S^EQA$-D>

或者,以人类可读的形式

0,1XA    ! Read the first character of the string into the text area of !
         ! Q-buffer A.                                                  !
<        ! Loop,                                                        !
S^EQA$   ! searching for the text in Q-buffer A in either lowercase or  !
         ! uppercase,                                                   !
-D       ! and deleting it,                                             !
>        ! until the search fails.                                      !

$代表转义键,并^E代表序列CTRL+ E。根据您使用的TECO的风格,它可能会识别出这些ASCII替代,也可能无法识别。

根据手册,某些TECO的方言接受此13字节的版本(使用查找和删除命令而不是单独的“查找”和“删除”命令):

0,1XA<FD^EQA$>

3

点数,8个字节

aR-Xa@0x

将字符串作为命令行参数(如果包含空格,则需要用引号引起来)。说明:

          a gets cmdline arg; x is "" (implicit)
    a@0   First character of a
   X      Convert to regex
  -       Make regex case-insensitive
aR     x  Replace all matches of that regex in a with empty string
          Autoprint (implicit)

该解决方案具有处理包含任何可打印ASCII字符的字符串的额外好处。(X运算符反斜杠转义任何非字母数字的字符。)



3

朱莉娅,34个字节

s->replace(s,Regex(s[1:1],"i"),"")

这将创建一个未命名的函数,该函数接受一个字符串并返回一个字符串。它从输入的第一个字符构造一个不区分大小写的正则表达式,并用空字符串替换所有出现的正则表达式。



2

R,43个字节

cat(gsub(substr(s,1,1),"",s<-readline(),T))

这是一个完整的程序,可从STDIN读取一行并将修改后的结果写入STDOUT。

取消高尔夫:

# Read a line from STDIN
s <- readline()

# Replace all occurrences of the first character with an empty
# string, ignoring case
r <- gsub(substr(s, 1, 1), "", s, ignore.case = TRUE)

# Write the result to STDOUT
cat(r)

2

Ruby,25个字节

匿名函数:

->s{s.gsub /#{s[0]}/i,""}

完整的prgram,29个字节:

puts gets.gsub /#{$_[0]}/i,""

2

Python,61个字节(太多)

lambda x:"".join(map(lambda y:(y.lower()!=x[0].lower())*y,x))

我想有一个更好的方法可以执行此操作,但是我似乎找不到它。关于删除的任何想法"".join(...)


1
@ThomasKwa也许您应该将其提交为自己的答案;似乎与我的差异太大,无法算作我的提交。
2015年

@ThomasKwa做得更短x[0]+x[0].swapcase()
xnor

1
@ThomasKwa或者,从FryAmTheEggman的Pyth解决方案偷,(x[0]*2).title()
xnor

@xnor是的,几小时前我读了他们的书后发现。
lirtosiast

lambda x:x.replace(x[0].upper(),'').replace(x[0].lower(),'')-60字节
Mego 2015年

2

衔尾蛇,61字节

嘿,它比C ++短!哈。

i..91<\64>*32*+m1(
)L!34*.(;Si.1+!24*(Y.@@.@=@.@32-=\@+2*.(yo

在Ouroboros中,程序的每一行代表一条蛇,其尾巴在嘴里。控制流是通过吃掉或反流尾巴的部分来实现的,并使用共享堆栈在蛇之间进行同步。

蛇1

i.从输入中读取字符并将其复制。.91<\64>*32*32如果字符是一个大写字母,0否则。+将字符转换为大写字母可将小写字母转换为小写,同时保留小写字母和空格不变。所有这些都已经在蛇1的堆栈上进行了,因此我们现在将值压入共享堆栈(m)中以供蛇2处理。最后,1(吃掉蛇1的尾巴的最后一个字符。因为那是指令指针所在的地方,所以蛇死了。

蛇2

)第一次没有效果。如果共享堆栈为空,则L!34*推送340否则。然后我们将其.复制并(吃掉那么多字符。

  • 如果共享堆栈为空,则在(我们刚刚执行完之后,这条蛇就结束了。因此,控制循环返回到该行的开头,在该行中)对我们刚刚吃过的字符进行反义(之前已推送的一个额外副本34)并重复堆栈长度测试。
  • 如果共享堆栈不为空,则不吃任何字符';' 删除多余的0,执行继续:

Si切换到共享堆栈并输入另一个字符。.1+!24*24,如果该字符为-1 / EOF,0否则。在EOF上,(吞下24个字符(包括IP),然后蛇死。否则,执行将继续。

Y将共享堆栈顶部的副本(我们刚刚读取的字符)移到蛇2自己的堆栈上,以备将来使用。然后.@@.@=@.@32-=\@+2*计算新字符是否等于第一个字符或等于第一个字符减32,2如果是则按,0否则按。我们.复制并(吃了那么多字符:

  • 如果字符匹配,我们直接回到蛇的头部 (重新给刚吃过的2个字符反义,然后执行下一个字符。
  • 如果不是,我们y将角色从蛇2的栈中退回,o输出,然后循环。

实际观看


2

C,60字节

n,c,d;main(){for(;read(0,&c-n,1);n=2)d-c&31&&n&&putchar(d);}

编辑:修复了导致在开始时打印空字节的错误


它甚至可以编译吗?
Abr001am 2015年

1
是。它可以在我的机器上编译(带有警告)并可以工作。您也可以在此页面上对其进行测试:golf.shinh.org/check.rb
xsot

是的,它确实; +1
Abr001am 2015年

2

Python 2,43

lambda s:s.translate(None,(s[0]*2).title())

这在某种程度上基于我Pyth的答案,但它也涉及到从ThomasKwa从一些意见和XNOR 这里。主要是发布,因为我希望这个答案存在。


2

Vim,30个按键

很抱歉,我找不到Vim的答案D:

If<Right>xh@x.<Esc>"xy07|@x2|~0"xd7|@x0x

说明:

  1. If<Right>xh@x.<Esc>
    在第一个字符周围编写一个(递归)宏。需要
    向左移动(h),以保持在下一个未读字符的左侧。如果必须删除第二个
    字符.,则需要在最后添加任何字符()
  2. "xy0 将宏复制到寄存器中 x
  3. 7| 移至第7个字符
  4. @x 从运行宏 x
  5. 2|~ 切换第一个字符的大小写(实际上在第二个位置)
  6. 0"xd7| 在寄存器中剪切宏 x
  7. @x 从运行宏 x
  8. 0x 删除占位符 .

1
:D我总是支持vim!
DJMcMayhem


1

TI-BASIC,164字节

适用于TI-83 + / 84 +系列图形计算器。

Input Str1
1→X
"sub(Str1,X,1→u
"ABCDEFGHIJKLMNOPQRSTUVWXYZ zyxwvutsrqponmlkjihgfedcba
u+sub(Ans,54-inString(Ans,u),1
For(X,2,length(Str1
If 2<inString(Ans+Str1,u
Ans+u
End
sub(Ans,3,length(Ans)-2

TI-BASIC显然是错误的工作工具。

  • 它没有删除字符的命令,因此我们需要遍历字符串,并在字符与要删除的字符不匹配时追加字符。
  • 它不支持空字符串,因此我们需要从要删除的两个字母开始以字符串开头,将输出构建到末尾,然后将前两个字符切掉。
  • 它没有大小写更改命令,因此我们需要对整个字母进行硬编码...
    • 两次...
    • 我是否提到过TI-BASIC编码中的小写字母每个占用两个字节?

我不确定100%,但是我花了六个多小时来解决这个问题,这似乎是最短的解决方案。

要使用非大写输入进行测试(或将其键入计算器),请使用content创建另一个程序AsmPrgmFDCB24DEC9,然后使用Asm([whatever you named it]启用小写输入模式来运行它。


1

Lua,93 78字节

a=io.read()m=a:sub(1,1):upper()print(({a:gsub("["..m..m:lower().."]","")})[1])

1

常见的Lisp,77

(princ(let((x(read-char)))(remove-if(lambda(y)(char-equal x y))(read-line))))

诅咒这些长函数名(和括号(但无论如何我还是爱它们(:3)))。


1

C,65 61字节

main(c,v)char**v;{for(c=**++v;*++*v;**v-c&31&&putchar(**v));}

编译警告。从读取字符串argv[1]在线示例


1
您可以缩短main(int c,char**v)main(c,v)char**v;,并(**v-c)%32**v-c&31
丹尼斯

1

C ++,100 99 98字节

#include<ios>
int main(){for(int c,f=getchar();~(c=getchar());)tolower(c)-tolower(f)&&putchar(c);}

只是多一个字节到100下获得getchar()的回报-1时,它读取数据流的结束,所以这就是为什么~for周期。(~-1 == 0

不打高尔夫球

#include <ios>
int main()
{
    for (int c, f = getchar(); ~(c = getchar()); )
        tolower(c) - tolower(f) && putchar(c);
}

您不能使用&&putchar(c)代替?putchar(c):0吗?
尼尔

@Neil谢谢,现在我不到100个字节!
Zereges 2015年

@ThomasKwa当然可以,谢谢。
Zereges

1
你能f-c&31像在C答案中那样吗?
飞鸟

1

AppleScript,209 201字节

我唯一的安慰是我击败了Brainfuck。

设置返回到(显示对话框““默认答案”“)的文本
将n设置为a的字符数
设置为“”
重复n
如果不是a的字符n = a的字符1,则将o设置为a的字符n&o
将n设置为n-1
结束
Ø

这是如何工作的,我将输入输入a,获取长度a并将其标记为n,然后设置输出变量o。对于我发现的每个不包含(a's character 1)第一个字符的字符,我将其连接为o。最后一行打印o

注意:这会自动支持所有Unicode。C:


3
My only consolation is that I beat Brainfuck.看起来我最好去打高尔夫球;)
Undergroundmonorail

1

视网膜,16字节

i`(.)(?<=^\1.*)

使用尾随换行符保存代码,并使用-s标志运行它。

工作原理:尾随换行符使它成为替换阶段,以便将给定正则表达式的所有匹配项替换为空字符串。在i不区分大小写的模式,这也使得反向引用不区分大小写的转弯。最后,正则表达式简单地匹配并捕获单个字符,然后使用反向引用检查字符串中的第一个字符是否相同(根据情况)。

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.