전체 문자열에서 문자열의 첫 문자를 모두 제거


24

문자 만 포함하는 입력 문자열을 감안할 때 A-Z, a-z첫 번째 문자 인 경우, 공백이, (문자열의 첫 번째 문자의 대문자와 소문자 버전을 모두 제거 A모두 제거 As와 a, 첫 번째 문자 인 경우들 (공간) 제거가 모든 공백)을 입력하고 출력을 인쇄하십시오.

사례 예 :

  • 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

@ThomasKwa 당신은 출력이 항상 2 자 이상이라고 가정 할 수 있습니다
GamrCorps

@ThomasKwa 출력은 비어하지 않습니다
GamrCorps

답변:


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

14

brainfuck, 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 : 나는 열심히 일했다 ...
Addison Crump

13

펄, 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

좋은. 나는 필자가 글을 써야하기 때문에 아마도 펄이 어떻게 나쁜 짓을할지 생각하고 substr있었지만 물론 훨씬 더 나은 방법을 생각 해냈다!
hobbs

왜 hashbang을 1 바이트로 계산합니까?
Zereges

스크립트가로 호출되는 경우 @bang은 shebang 행이 필요하지 않습니다 perl -p script.pl. 명령 줄 옵션은 적어도이 사이트에서 최소한 1 바이트로 계산됩니다.
primo

@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를 제외한 모든 언어 가이 도전에서 펄을 이길 수 있다는 것이 놀랍 습니다.
primo

@primo-CJam 및 / 또는 Pyth가 99 %를이기는 것을 보지 못했습니까? Perl은 골프 언어로 특별히 설계되지 않은 유일한 것을 고려하면 꽤 잘했습니다.
Darrel Hoffman

Pyth와 CJam의 운영자 과부하는 말도 안됩니다. 문자 당 제거를 수행하는 빼기 (문자열, 문자열)는 내가 본 다른 언어의 핵심 작업이 아닙니다.
Sparr

@Sparr APL에는 동일한 내장 기능이 있습니다. ( ~하지만 호출 됩니다.)
Dennis

7

Pyth, 8 바이트

-zr*2hz3

온라인으로 사용해보십시오

Pyth의 python 버전을 사용 str.title하여 첫 번째 문자의 문자열을 양식으로 두 번 변환합니다 "<Upper><Lower>". 그런 다음 해당 문자열에있는 입력에서 각 요소를 제거합니다. 공간은에 영향을받지 않기 때문에 제대로 작동합니다 str.title.



5

자바 스크립트 (ES6), 38 36 바이트

이것은 Mozilla 고유 의 flags매개 변수에 의존하지 않습니다 .

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

CoffeeScript, 39 37 바이트

한 번만 CoffeeScript보다 JS에서 짧습니다!

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

3
적어도 내가 시도한 브라우저에서는 new선택 사항이므로 RegExp(x[0],'gi')짧습니다.
Neil

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

3

펄, 27 바이트

이것은 완전한 프로그램이지만 I / O에 바이트를 저장하기 위해 Retina 프로그램에 복사 할 수있는 2 개의 정규 표현식을 기반으로합니다.

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

편집 :이 -p옵션을 사용하여 누군가와 이미 이겼습니다 . 아, $&대신 사용 합니다 $1.


1
전체 shebang이 계산 되더라도 (즉, "완전한"프로그램) #!perl -p여전히 2 바이트보다 짧습니다 $_=<>;print.
primo

@primo 나는 골프에서 어떤 옵션도 사용한 적이 없다. 방금 -p옵션의 기능을 봤습니다 . 실제로 답변과 동일하게 만들지 않고 답변을 수정할 수있는 것은 없습니다.
PhiNotPi

3

Minkolang 0.9 , 23 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

TECO , 15 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

파이썬, 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,""}

전체 prgram, 29 바이트 :

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

2

파이썬, 61 바이트 (너무 많이)

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

나는 이것을하는 데 더 좋은 방법이 있다고 생각하지만 그것을 찾을 수없는 것 같습니다. 제거에 대한 아이디어가 "".join(...)있습니까?


1
@ThomasKwa 아마도 당신은 그것을 당신 자신의 답변으로 제출해야합니다; 내 제출물로 계산하기에는 내 것과 너무 다른 것 같습니다.
cole

@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

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*푸시 34합니다 0. 우리는 다음 .DUP와 (많은 문자를 먹는다.

  • 공유 스택이 비어 있으면 (방금 실행 한 직후 뱀의 끝을 놓습니다 . 따라서 제어는 줄의 시작 부분으로 되돌아갑니다. 여기서 )방금 먹은 문자 (이전에 추가 사본을 푸시 한 문자)를 역류 34시키고 스택 길이 테스트를 반복합니다.
  • 공유 스택이 비어 있지 않으면 ';' extra를 삭제 0하고 실행이 계속됩니다.

Si공유 스택으로 전환하고 다른 문자를 입력합니다. 해당 문자가 -1 / EOF이면 .1+!24*푸시 24합니다 0. EOF에서는 (IP를 포함하여 24자를 삼키고 뱀은 죽습니다. 그렇지 않으면 실행이 계속됩니다.

Y나중에 사용할 수 있도록 공유 스택의 상단 (방금 읽은 문자)의 복사본을 뱀 2의 자체 스택에 복사합니다. 그런 다음 .@@.@=@.@32-=\@+2*새 문자가 첫 번째 문자와 같거나 첫 번째 문자 빼기 32와 같은지 계산 2하고, 0그렇지 않은 경우 밀어 냅니다. 우리는 그 많은 문자를 .복제하고 (먹습니다.

  • 문자가 일치하면 뱀의 머리로 똑바로 돌아가서 (방금 먹은 두 문자를 역류시키고 다음 문자로 실행을 진행합니다.
  • 그렇지 않다면, 우리 y는 뱀 2의 스택에서 캐릭터를 다시 고정 o시키고, 입력 한 다음 반복합니다.

실제로보기


2

C, 60 바이트

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

편집 : 처음에 null 바이트가 인쇄되는 버그가 수정되었습니다.


심지어 컴파일합니까?
Abr001am

1
예. 내 컴퓨터에서 (경고와 함께) 컴파일되고 작동합니다. 이 페이지에서 테스트 할 수도 있습니다 : golf.shinh.org/check.rb
xsot

그렇습니다. +1
Abr001am

2

파이썬 2, 43

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

이것은 내 Pyth 답변을 기반으로하지만 ThomasKwa의 의견과 xnor here의 의견과 관련이 있습니다 . 이 답변이 존재하기를 원했기 때문에 주로 게시합니다.


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

하스켈, 52 바이트

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

2
리스트 이해는 1 바이트를 절약합니다 : r(h:s)=[c|c<-s,t c/=t h].
nimi

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 인코딩에서 소문자가 각각 2 바이트를 차지한다고 언급 했습니까?

100 % 확신 할 수는 없지만 6 시간 이상이 소요되었으며 가능한 가장 짧은 해결책 인 것 같습니다.

대문자가 아닌 입력으로 이것을 테스트하거나 계산기에 입력하려면 contents로 다른 프로그램을 만들고 소문자 입력 모드를 활성화 AsmPrgmFDCB24DEC9하는 Asm([whatever you named it]데 사용하십시오.


1

루아, 93 78 바이트

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

1

커먼 리스프, 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
Dennis

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

@Neil 감사합니다. 이제 100 바이트 미만입니다!
Zereges

@ThomasKwa 물론 감사합니다.
Zereges

1
f-c&31C 답변에서와 같이 할 수 있습니까 ?
lirtosiast

1

AppleScript, 209201 바이트

나의 유일한 위로는 내가 Brainfuck을 이겼다는 것입니다.

to (display dialog ""default answer "")의 텍스트를 반환하도록 설정
n을 문자 수로 설정
o를 ""로 설정
n 반복
a의 문자가 아닌 경우 n = a의 문자 1이면 o를 a의 문자 n & o로 설정하십시오.
n을 n-1로 설정
종료
영형

이것이 작동하는 방식은 입력을 통해 a길이를 가져 와서 a표시 n하고 출력 변수를 설정하는 것 o입니다. 내가 찾은 모든 문자에 대해 ( a's character 1) 의 첫 번째 문자가 포함되어 있지 않으면에 연결합니다 o. 마지막 줄이 인쇄 o됩니다.

참고 : 이것은 모든 유니 코드를 자동으로 지원합니다. 기음:


3
My only consolation is that I beat Brainfuck.내가 더 나은 골프를 얻는 것처럼 보인다;)
undergroundmonorail

1

망막 , 16 바이트

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

후행 줄 바꿈으로 코드를 저장하고 -s플래그로 실행하십시오 .

작동 방식 : 후행 줄 바꿈은이를 대체 단계로 만들어 주어진 정규 표현식과 일치하는 항목을 빈 문자열로 바꿉니다. i또한 역 참조의 대소 문자를 구별하게 대소 문자를 구별 모드를 켭니다. 마지막으로 정규 표현식은 단순히 단일 문자를 일치시키고 캡처 한 다음 역 참조를 사용하여 문자열의 첫 번째 문자가 동일한 지 (대소 문자까지) 확인합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.