Remova todas as ocorrências da primeira letra de uma sequência de caracteres da seqüência inteira


24

Dada uma cadeia de entrada contendo apenas os personagens A-Z, a-ze espaços, remova todas as ocorrências das versões maiúsculas e minúsculas do primeiro caractere da string (se o primeiro caractere é Aremover todos os As e as, se o primeiro personagem é (espaço) remove todos os espaços) e imprima a saída.

Casos de exemplo:

  • 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

Este é o , o código mais curto em bytes vence!

Notas:

  • A entrada sempre terá 2 ou mais caracteres válidos.
  • A saída nunca será uma sequência vazia.

Precisamos lidar com o caso em que a saída é a string vazia? E se a entrada for a string vazia?
lirtosiast

@ThomasKwa você pode assumir saída será sempre ser de 2 ou mais caracteres
GamrCorps

Saída @ThomasKwa e nunca estará vazia
GamrCorps

Respostas:


9

Pitão, 7 bytes

-zrBhz2

Experimente on-line: Demonstration or Test Suite

Agradável. O novo operador de bifurcação (com apenas 8 dias) ajuda aqui a economizar um caractere. Eu acho que este é o primeiro código, que usa esse recurso.

Explicação

-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
Legal, não sabia disso. +1
FryAmTheEggman 24/10/2015

14

brainfuck, 219 bytes

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

(Requer fita que permita que o ponteiro vá para os negativos ou faça um loop até o fim, se tentar. Também exige ,retornar 0 no EOF. Na minha experiência, a maioria dos intérpretes atende a esses requisitos por padrão.)

Isso acabou sendo bastante fácil! Eu não ficaria surpreso se fosse jogável (tenho uma idéia de onde pode haver bytes desperdiçados, mas não tenho muita certeza se isso ocorrerá). Ainda assim, fazê-lo funcionar não foi realmente um desafio.

Esse código trata tudo com um valor ASCII abaixo de 97 como um caractere maiúsculo. Se o primeiro caractere for espaço, ele tentará remover quaisquer ocorrências de um "espaço em minúsculas" (ou chr(32+32)seja @) da string. Tudo bem, porque apenas letras e espaços estarão presentes.

Com comentários:

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

]

Por favor, não jogue isso muito baixo . c: Eu trabalhei tanto ...
Addison Crump

13

Perl, 13 bytes

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

Contando o shebang como um, a entrada é obtida de stdin.


Uso da amostra

$ 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

Agradável. Eu estava pensando em como o Perl provavelmente se sairia mal por causa da necessidade de escrever, substrmas é claro que você criou uma maneira muito melhor!
Hbbs #

Por que você conta o hashbang como um byte?
Zereges

@Zereges a linha shebang não é necessária, se o script for chamado como perl -p script.pl. As opções de linha de comando costumam ser contadas como um byte cada, pelo menos neste site.
Primo

@primo Entendo, obrigado.
Zereges

10

CJam, 8 bytes

q(_32^+-

Experimente online no intérprete CJam .

Como funciona

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.

Originalmente, criei esse desafio para aprender CJam e nunca soube da coisa do XOR!
GamrCorps 24/10/2015

2
Pessoalmente, acho surpreendente que qualquer idioma - com exceção de talvez sed - possa superar o perl nesse desafio.
primo

@primo - Você não percebeu que CJam e / ou Pyth praticamente venceram 99% deles? Perl se saiu muito bem, considerando que é o único que não foi projetado especificamente como idioma de golfe.
Darrel Hoffman

A sobrecarga de operador de Pyth e CJam é ridícula. menos (string, string) executar a remoção por caractere não é uma operação principal em nenhum outro idioma que encontrei.
Sparr

O @Sparr APL possui o mesmo recurso. (Chama-se ~embora.)
Dennis

7

Pitão, 8 bytes

-zr*2hz3

Experimente online

Usa a versão do Pyth str.titlepara converter uma string da primeira letra duas vezes no formulário "<Upper><Lower>". Em seguida, ele remove cada elemento da entrada que está nessa sequência. Os espaços funcionam bem porque não são afetados str.title.



5

JavaScript (ES6), 38 36 bytes

Isso não depende do flagsparâmetro específico do Mozilla.

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

CoffeeScript, 39 37 bytes

Pela primeira vez, é mais curto em JS do que em CoffeeScript!

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

3
Pelo menos nos navegadores que tentei, o newé opcional, e RegExp(x[0],'gi')é mais curto.
Neil


3

Perl, 27 bytes

Este é um programa completo, embora seja baseado apenas em 2 regexes que provavelmente poderiam ser copiados em um programa Retina para salvar bytes na E / S.

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

Edit: Parece que isso já foi espancado com alguém usando a -popção. Ah, e usando em $&vez de $1.


11
Mesmo que o shebang inteiro seja contado (ou seja, um programa "completo"), #!perl -painda é dois bytes menor que $_=<>;print.
Primo

@primo Eu nunca usei nenhuma das opções nos meus campos de golfe. Eu apenas pesquisei no Google o que a -popção faz. Não há realmente nenhuma edição que eu possa fazer na minha resposta sem torná-la idêntica à sua.
PhiNotPi 24/10/2015

3

Tamanho 0.9 , 23 33 bytes

De jeito nenhum isso vai ganhar, mas eh, é divertido!

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

Experimente aqui.

Explicaçã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

(Isso pode falhar em alguns casos extremos, como se o primeiro caractere fosse um símbolo.)


3

TECO , 15 14 bytes

Editando texto? Em caso de dúvida, use o Editor de texto e o controlador!

Após muitas tentativas e erros (principalmente erros), acho que este é o programa TECO genérico mais curto que fará o trabalho.

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

Ou, de forma legível por humanos

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.                                      !

$representa a tecla de escape e ^Erepresenta a sequência CTRL+ E. Dependendo do sabor do TECO que você está usando, ele pode reconhecer essas substituições ASCII ou não.

De acordo com o manual, alguns dialetos do TECO aceitam esta versão de 13 bytes (usando um comando find-and-delete em vez de comandos "find" e "delete" separados):

0,1XA<FD^EQA$>

3

Pip, 8 bytes

aR-Xa@0x

Toma a string como argumento da linha de comando (precisará ser citado se contiver espaços). Explicação:

          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)

Esta solução tem a vantagem adicional de trabalhar em seqüências contendo quaisquer caracteres ASCII imprimíveis. (O Xoperador faz uma barra invertida - escapa qualquer coisa que não seja alfanumérica.)


3

Python, 66 caracteres

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

5
@ThomasKwa, que tal não?
TheDoctor

3

Julia, 34 bytes

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

Isso cria uma função sem nome que aceita uma string e retorna uma string. Ele constrói uma expressão regular que não diferencia maiúsculas de minúsculas do primeiro caractere na entrada e substitui todas as ocorrências disso por uma sequência vazia.



2

R, 43 bytes

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

Este é um programa completo que lê uma linha de STDIN e grava o resultado modificado em STDOUT.

Ungolfed:

# 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 bytes

Função anônima:

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

Prgram completo, 29 bytes:

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

2

Python, 61 bytes (muitos)

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

Imagino que exista uma maneira melhor de fazer isso, mas não consigo encontrá-lo. Alguma idéia sobre como remover o "".join(...)?


11
@ThomasKwa talvez você deva enviar isso como sua própria resposta; parece muito diferente do meu para contar como minha submissão.
cole

@ThomasKwa Mais curto para fazer x[0]+x[0].swapcase().
Xnor

11
@ThomasKwa Ou, roubando a solução Pyth de FryAmTheEggman (x[0]*2).title(),.
Xnor

@ xnor sim, descobri que quando li o deles há algumas horas atrás.
lirtosiast

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

2

Ouroboros , 61 bytes

Ei, é mais curto que C ++! Ha.

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

Em Ouroboros, cada linha do programa representa uma cobra com o rabo na boca. O fluxo de controle é realizado ao comer ou regurgitar seções da cauda, ​​com uma pilha compartilhada para sincronizar entre cobras.

Cobra 1

i.lê um caractere da entrada e o duplica. .91<\64>*32*empurra 32se o caractere for uma letra maiúscula, 0caso contrário. +Isso significa que o caractere converte letras maiúsculas em minúsculas, mantendo as letras minúsculas e os espaços inalterados. Tudo isso está ocorrendo na pilha da cobra 1, então agora transferimos o valor para a pilha compartilhada ( m) para a cobra 2 processar. Finalmente,1( come o último caractere do rabo da cobra 1. Como é aí que está o ponteiro das instruções, a cobra morre.

Cobra 2

)não tem efeito na primeira vez. L!34*empurra 34se a pilha compartilhada estiver vazia, 0caso contrário. Em seguida, .enganamos e (comemos tantos personagens.

  • Se a pilha compartilhada estava vazia, isso coloca o fim da cobra logo após o (que acabamos de executar. Portanto, o controle volta ao início da linha, onde )regurgita os caracteres que acabamos de comer (depois de enviar uma cópia extra de34 ) e repita o teste de tamanho da pilha.
  • Se a pilha compartilhada não estiver vazia, nenhum caractere será consumido, ';' descarta o extra 0e a execução continua:

Sialterna para a pilha compartilhada e insere outro caractere. .1+!24*empurra 24se esse caractere for -1 / EOF, 0caso contrário. Um de,( engole 24 caracteres - incluindo o IP - e a cobra morre. Caso contrário, a execução continuará.

Ypuxa uma cópia do topo da pilha compartilhada (o personagem que acabamos de ler) na própria pilha de 2 para uso futuro. Em seguida, .@@.@=@.@32-=\@+2*calcula se o novo caractere é igual ao primeiro caractere ou ao primeiro caractere menos 32, pressionando 2se sim e 0não. Nós .duplicar e (comer que muitos personagens:

  • Se os personagens corresponderem, voltamos direto para a cabeça da cobra, onde (regurgitamos os 2 caracteres que acabamos de comer e a execução prossegue com o próximo personagem.
  • Caso contrário, retiramos yo personagem da pilha de snake 2, outilizamos e depois fazemos o loop.

Veja em ação



2

Python 2, 43

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

Isso é um pouco baseado na minha resposta Pyth, mas também está relacionado a alguns comentários de ThomasKwa e xnor daqui . Principalmente postando porque eu queria que essa resposta existisse.


2

Vim, 30 pressionamentos de tecla

Desculpe desenterrar, mas não vejo nenhuma resposta Vim D:

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

Explicação:

  1. If<Right>xh@x.<Esc>
    Escreva uma macro (recursiva) ao redor do primeiro caractere É necessário
    mover para a esquerda ( h) para permanecer à esquerda do próximo caractere não lido.
    Adicionando qualquer caractere (. ) no final, caso o segundo precise ser removido.
  2. "xy0 Copie a macro no registro x
  3. 7| Mover para o sétimo caractere
  4. @x Execute a macro de x
  5. 2|~ Alterne entre maiúsculas e minúsculas (primeiro na segunda posição)
  6. 0"xd7| Cortar a macro no registro x
  7. @x Execute a macro de x
  8. 0x Retire o marcador .

11
:DEu sempre votei no vim!
DJMcMayhem

1

Haskell, 52 bytes

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

2
Compreensão da lista salva 1 byte: r(h:s)=[c|c<-s,t c/=t h].
N /

1

TI-BASIC, 164 bytes

Para calculadoras gráficas da série 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

O TI-BASIC é claramente a ferramenta errada para o trabalho.

  • Ele não possui um comando para remover caracteres, portanto, precisamos percorrer a string e acrescentar caracteres se eles não corresponderem ao que deve ser removido.
  • Ele não suporta seqüências de caracteres vazias; portanto, precisamos iniciar a sequência com as duas letras a serem removidas, criar a saída até o final e cortar os dois primeiros caracteres.
  • Ele não possui comandos de mudança de maiúsculas e minúsculas, portanto, precisamos codificar o alfabeto inteiro ...
    • duas vezes...
    • Mencionei que letras minúsculas ocupam dois bytes cada na codificação TI-BASIC?

Não tenho 100% de certeza, mas passei mais de seis horas nisso e parece ser a solução mais curta possível.

Para testar isso com entradas não maiúsculas (ou digitá-lo na sua calculadora), crie um programa diferente com o conteúdo AsmPrgmFDCB24DEC9e execute-o usando Asm([whatever you named it]para ativar o modo de digitação em minúsculas.


1

Lua, 93 78 bytes

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

1

Lisp comum, 77

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

Amaldiçoe esses nomes de função longos (e parênteses (mas eu ainda os amo mesmo assim (: 3))).


1

C, 65 bytes

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

Compila com avisos. Lê a string de argv[1]. Exemplo online


11
Você pode reduzir main(int c,char**v)para main(c,v)char**v;e (**v-c)%32para **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);}

Apenas mais um byte para ficar abaixo de 100. getchar()retorna -1quando lê o final do fluxo, é por isso que o ciclo ~está em forandamento. (~-1 == 0 )

Ungolfed

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

Você não pode usar em &&putchar(c)vez de ?putchar(c):0?
Neil

@ Neil Obrigado, agora estou com menos de 100 bytes!
Zereges

@ThomasKwa Claro que posso, obrigado.
Zereges

11
Você pode fazer f-c&31como na resposta C?
lirtosiast

1

AppleScript, 209 201 bytes

Meu único consolo é que venci Brainfuck.

defina o texto de a para (exibir "" resposta padrão "") retornado
defina n como o número de caracteres de
defina o como ""
repita n
se não o caractere de a, n = o caractere 1, defina o como o caractere a, n & o
defina n para n-1
fim
o

Como isso funciona é que eu passo a entrada a, obtenho o comprimento ae o marco como n, e defino uma variável de saída o. Para cada caractere que considero que não contém o primeiro caractere de a ( a's character 1), concateno-o para o. A linha final é impressa o.

Nota: Isso suporta automaticamente todos os Unicode. c:


3
My only consolation is that I beat Brainfuck.parece que é melhor eu jogar golfe;) #
undergroundmonorail

1

Retina , 16 bytes

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

Salve o código com um avanço de linha à direita e execute-o com o -s bandeira.

Como funciona: o avanço de linha à direita faz deste um estágio de substituição, de forma que quaisquer correspondências do regex especificado sejam substituídas por uma sequência vazia. As ivoltas no modo case-insensitive que também faz case-insensitive backreferences. Por fim, a regex simplesmente corresponde e captura um único caractere e, em seguida, verifica se o primeiro caractere da sequência é o mesmo (conforme o caso) usando uma referência anterior.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.