文字列全体から文字列の最初の文字をすべて削除します


24

文字のみを含む入力文字列が与えられA-Za-z最初の文字がある場合は、スペースは、(文字列の最初の文字の大文字と小文字のバージョンの出現をすべて削除Aすべて削除A秒とa、最初の文字がある場合には、Sを(スペース)削除は、すべてのスペース)、および出力を印刷します。

例:

  • 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つ以上の有効な文字になります。
  • 出力が空の文字列になることはありません。

出力が空の文字列である場合を処理する必要がありますか?入力が空の文字列の場合はどうなりますか?
リスト管理者

@ThomasKwa出力は常に2文字以上になると想定される場合があります
-GamrCorps

@ThomasKwaと出力が空になることはありません
-GamrCorps

回答:


9

Pyth、7バイト

-zrBhz2

オンラインで試す:デモンストレーションまたはテストスイート

いいね 新しい分岐演算子(わずか8日前)は、ここで1文字を節約するのに役立ちます。これがこの機能を使用する最初のコードだと思います。

説明

-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

14

brainfuck、219バイト

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

(ポインターがネガに移動するか、試行する場合は最後までループするテープが必要です。また、 , 0を返すます。私の経験では、ほとんどのインタープリターはデフォルトでこれらの要件を満たしています。)

これは実際には非常に簡単であることが判明しました!ゴルフ可能かどうかは驚くことではありません(無駄なバイトがどこにあるかはある程度わかっていますが、パンアウトするかどうかはよくわかりません)。それでも、それを機能させることは、本当に難しいことではありませんでした。

このコードは、97未満のASCII値を持つすべてを大文字として扱います。最初の文字がスペースの場合、「小文字のスペース」(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

シバングを1つとしてカウントすると、入力は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が、もちろん、もっと良い方法を思いついたのです!
ホッブズ

ハッシュバンを1バイトとして数えるのはなぜですか?
ゼレゲス

@Zeregesは、スクリプトがとして呼び出される場合、シェバン行は必要ありませんperl -p script.pl。少なくともこのサイトでは、コマンドラインオプションは通常1バイトとしてカウントされます。
プリモ

@primoなるほど、ありがとう。
Zereges

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-CJamおよび/またはPythがこれらの99%をほとんど獲得していることに気付いていませんか?しかし、Perlはゴルフ言語として特別に設計されていない唯一のものであることを考慮して、かなりうまくいきました。
ダレルホフマン

PythとCJamのオペレーターのオーバーロードはばかげています。文字ごとの削除を実行するminus(string、string)は、私が遭遇した他の言語のコア操作ではありません。
スパー

@Sparr APLには同じビルトインがあります。(~しかしと呼ばれます。)
デニス

7

Pyth、8バイト

-zr*2hz3

オンラインで試す

Pythのpythonのバージョンを使用してstr.title、最初の文字の文字列を2回形式に変換します"<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バイト

1つのコマンドライン引数を取ります。PHP <5.4では、短いオープンタグを有効にする必要があります。

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

1
あなたは含む変数を宣言することによって、それを短縮することができます$argv[1]<?=str_ireplace(($a=$argv[1])[0],'',$a);
ブノワEsnard

3

Perl、27バイト

これは完全なプログラムですが、2つの正規表現に基づいているだけで、おそらくRetinaプログラムにコピーしてI / Oのバイト数を節約できます。

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

編集:この-pオプションを使用している誰かに既にthisられているようです。ああ、$&代わりに使用します$1


1
たとえシバン全体がカウントされたとしても(つまり、「完全な」プログラム)、#!perl -pそれでも2バイトより短くなり$_=<>;printます。
プリモ

@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バイトバージョンを受け入れます(個別の「find」コマンドと「delete」コマンドの代わりにfind-and-deleteコマンドを使用)。

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

Python、66文字

a=raw_input()
print a.replace(a[0],'').replace(a[0].swapcase(),'')

5
@ThomasKwaどうですか。
-TheDoctor

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

ルビー、25バイト

匿名関数:

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

完全なグラム、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は、おそらくあなた自身の答えとしてそれを提出する必要があります。私の提出物と見なすには、私とはあまりにも違うようです。
コール

@ThomasKwa短縮するにはx[0]+x[0].swapcase()
-xnor

1
@ThomasKwaまたは、FryAmTheEggmanのPythソリューションから盗み(x[0]*2).title()ます。
xnor

@xnorええ、数時間前に彼らの記事を読んだときに見つけました。
リスト管理者

lambda x:x.replace(x[0].upper(),'').replace(x[0].lower(),'')-60バイト
-Mego

2

ウロボロス、61バイト

ねえ、それはC ++よりも短い!ハ。

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

ウロボロスでは、プログラムの各行は、口を尻尾にした蛇を表しています。制御フローは、ヘビ間で同期するための共有スタックを使用して、尾の部分を食べたり逆流させたりすることで実現されます。

ヘビ1

i.入力から文字を読み取り、複製します。文字が大文字の場合は.91<\64>*32*プッシュし320そうでない場合はプッシュします。+これを文字に変換すると、大文字と小文字が変換されますが、小文字とスペースは変更されません。これはすべてスネーク1のスタックで行われているmため、スネーク2が処理するために値を共有スタック()にプッシュします。最後に、1(蛇1の尾の最後のキャラクターを食べます。それが命令ポインタがある場所なので、ヘビは死にます。

ヘビ2

)初回は効果がありません。共有スタックが空の場合はL!34*プッシュし340そうでない場合はプッシュします。それから私たちはその数のキャラクターを.ダップして(食べます。

  • If the shared stack was empty, this puts the end of the snake right after the ( we just executed. Therefore, control loops back to the beginning of the line, where ) regurgitates the characters we just ate (having previously pushed an extra copy of 34) and repeat the stack-length test.
  • If the shared stack was not empty, no characters are eaten, ';' drops the extra 0, and execution continues:

Si共有スタックに切り替えて、別の文字を入力します。その文字が-1 / EOFの場合は.1+!24*プッシュし240そうでない場合はプッシュします。EOFでは(、IPを含む24人のキャラクターを飲み込み、ヘビが死にます。それ以外の場合、実行は継続します。

Y共有スタックの最上部(今読んだ文字)のコピーを、将来の使用のためにスネーク2自身のスタックにヤンクします。次に.@@.@=@.@32-=\@+2*、新しい文字が最初の文字に等しいか、最初の文字から32を引いたものに等しいかを計算し、2そうで0あればプッシュします。その数のキャラクターを.複製して(食べます:

  • キャラクターが一致した場合、ヘビの頭にまっすぐ戻り、(食べたばかりの2人のキャラクターを逆流させ、次のキャラクターに実行を進めます。
  • If not, we yank the character back from snake 2's stack, output it, and then loop.

See it in action


2

C, 60 bytes

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

Edit: Fixed a bug which caused a null byte to be printed at the beginning


does it even compile ?
Abr001am

1
Yes. It compiles on my machine (with warnings) and works. You can also test it on this page: golf.shinh.org/check.rb
xsot

yes it does; +1
Abr001am

2

Python 2, 43

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

This is somewhat based on my Pyth answer, but it's also related to some comments from ThomasKwa and xnor from here. Mostly posting because I wanted this answer to exist.


2

Vim, 30 Keystrokes

Sorry to unearth, but i don't see any Vim answer D:

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

Explanation:

  1. If<Right>xh@x.<Esc>
    Write a (recursive) macro around the first character
    Moving left (h) is needed to stay at the left of the next unread character
    Adding any character (.) at the end is needed in case the second must be removed
  2. "xy0 Copy the macro in the register x
  3. 7| Move to the 7th char
  4. @x Run the macro from x
  5. 2|~ Switch the case of the first char (actually at the 2nd position)
  6. 0"xd7| Cut the macro in the register x
  7. @x Run the macro from x
  8. 0x Remove the place-holder .

1
:D I always upvote vim!
DJMcMayhem

1

Haskell, 52 bytes

import Data.Char
t=toUpper
r(h:s)=filter((t h/=).t)s

2
List comprehension saves 1 byte: r(h:s)=[c|c<-s,t c/=t h].
nimi

1

TI-BASIC, 164 bytes

For TI-83+/84+ series graphing calculators.

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 is clearly the wrong tool for the job.

  • It doesn't have a command to remove characters, so we need to loop through the string and append characters if they don't match what is to be removed.
  • It doesn't support empty strings, so we need to start the string with the two letters to be removed, build the output onto the end, and chop the first two characters off.
  • It doesn't have case-change commands, so we need to hardcode the entire alphabet...
    • twice...
    • Did I mention lowercase letters take two bytes each in the TI-BASIC encoding?

I'm not 100% sure, but I spent over six hours on this, and it seems to be the shortest possible solution.

To test this with non-uppercase inputs (or to type it into your calculator), make a different program with the contents AsmPrgmFDCB24DEC9, and run it using Asm([whatever you named it] to enable lowercase typing mode.


1

Lua, 93 78 Bytes

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

1

Common Lisp, 77

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

Curse these long function names (and parentheses (but I still love them anyway (:3))).


1

C, 65 61 bytes

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

Compiles with warnings. Reads string from argv[1]. Online example


1
You can shorten main(int c,char**v) to main(c,v)char**v;, and (**v-c)%32 to **v-c&31.
Dennis

1

C++, 100 99 98 bytes

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

Just one more byte to get under 100. getchar() returns -1 when it reads end of stream, so that's why the ~ is in for cycle. (~-1 == 0)

Ungolfed

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

Can't you use &&putchar(c) instead of ?putchar(c):0?
Neil

@Neil Thank you, now I am under 100 bytes!
Zereges

@ThomasKwa Of course I can, thanks.
Zereges

1
Can you do f-c&31 as in the C answer?
lirtosiast

1

AppleScript, 209 201 bytes

My only consolation is that I beat Brainfuck.

set a to(display dialog""default answer"")'s text returned
set n to a's characters's number
set o to""
repeat n
if not a's character n=a's character 1 then set o to a's character n&o
set n to n-1
end
o

How this works is that I take input through a, get the length of a and mark it as n, and set an output variable o. For every character that I find that does not contain the first character of a (a's character 1), I concatenate it to o. The final line prints o.

Note: This automatically supports all Unicode. c:


3
My only consolation is that I beat Brainfuck. looks like i'd better get golfing ;)
undergroundmonorail

1

Retina, 16 bytes

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

Save the code with a trailing linefeed and run it with the -s flag.

How it works: the trailing linefeed makes this a replacement stage, such that any matches of the given regex are replaced with an empty string. The i turns on case-insensitive mode which also makes backreferences case-insensitive. Finally, the regex simply matches and captures a single characters and then checks whether the first character in the string is the same (up to case) using a backreference.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.