Удалить все вхождения первой буквы строки из всей строки


24

Учитывая входную строку , содержащей только символы A-Z, a-zи пробела, удалить все вхождения прописных и строчных версии первого символа строки (если первый символ Aудалить все Aс и 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 или более действительных символов.
  • Вывод никогда не будет пустой строкой.

Нужно ли обрабатывать случай, когда выходные данные являются пустой строкой? Что если input - пустая строка?
lirtosiast

@ThomasKwa Вы можете предположить, что вывод всегда будет 2 или более символов
GamrCorps

@ThomasKwa и выходные данные никогда не будут пустыми
GamrCorps

Ответы:


9

Pyth, 7 байт

-zrBhz2

Попробуйте онлайн: демонстрация или тестовый набор

Ницца. Новый оператор Bifurcate (всего 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

брейкфук, 219 байт

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

(Требуется лента, которая позволяет указателю переходить к минусам или петлям до конца, если он пытается. Также требует ,возврата 0 в EOF. По моему опыту, большинство интерпретаторов удовлетворяют этим требованиям по умолчанию.)

На самом деле это оказалось довольно легко! Я не был бы удивлен, если это пригодно для игры в гольф (у меня есть некоторое представление о том, где могут быть потраченные впустую байты, но я не супер уверен, удастся ли это удастся). Тем не менее, заставить его работать на самом деле не было проблемой вообще.

Этот код обрабатывает все со значением 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

Считая Шебанг как единое, ввод берется из стандартного ввода.


Образец использования

$ 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но, конечно, вы придумали гораздо лучший способ!
Хоббс

Почему вы считаете hashbang одним байтом?
Зерегес

@Zereges строка shebang не обязательна, если скрипт вызывается как perl -p script.pl. Параметры командной строки обычно учитываются как один байт каждый, по крайней мере, на этом сайте.
Примо

@ primo Понятно, спасибо.
Зерегес

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 просто смешна. минус (строка, строка) выполнение удаления за символ не является основной операцией на любом другом языке, с которым я столкнулся.
Спарр

@Sparr APL имеет такой же встроенный. ( ~Хотя это называется .)
Деннис

7

Pyth, 8 байт

-zr*2hz3

Попробуйте онлайн

Использует Python-версию Python str.titleдля преобразования строки первой буквы дважды в форму "<Upper><Lower>". Затем он удаляет каждый элемент из ввода, который находится в этой строке. Пространства работают нормально, потому что они не затронуты str.title.



5

JavaScript (ES6), 38 36 байт

Это не зависит от flagsпараметра, который зависит от Mozilla.

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')короче.
Нил


3

Perl, 27 байт

Это полная программа, хотя она основана на двух регулярных выражениях, которые, вероятно, могут быть скопированы в программу Retina для сохранения байтов при вводе / выводе.

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

Изменить: Похоже, что это уже было побито с кем-то, используя эту -pопцию. Ох, и использовать $&вместо $1.


1
Даже если будет подсчитан весь шебанг (то есть «полная» программа), #!perl -pон все равно будет на два байта короче $_=<>;print.
Примо

@ primo Я никогда не использовал ни одного из вариантов в своих гольфах. Я просто погуглил, что -pделает опция. На самом деле я не могу внести какие-либо правки в свой ответ, просто сделав его идентичным вашему.
PhiNotPi

3

Минколанг 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 байтов

Редактирование текста? Если вы сомневаетесь, используйте текстовый редактор и COrrecter!

После долгих проб и ошибок (в основном ошибок), я думаю, что это самая короткая универсальная программа 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.

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

Рубин, 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 Или, похитив из раствора Pyth FryAmTheEggman, в (x[0]*2).title().
xnor

@xnor Да, я обнаружил это, когда прочитал их несколько часов назад.
lirtosiast

lambda x:x.replace(x[0].upper(),'').replace(x[0].lower(),'')- 60 байтов
Мего

2

Уроборос , 61 байт

Эй, это короче, чем C ++! Ха.

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

В Уроборосе каждая строчка программы представляет собой змею с хвостом во рту. Управление потоком осуществляется путем поедания или регургитации участков хвоста с помощью общего стека для синхронизации между змеями.

Змея 1

i.читает символ из ввода и дублирует его. .91<\64>*32*толкает, 32если символ был заглавной буквой, в 0противном случае. +При преобразовании этого символа в верхний регистр преобразуются строчные буквы, а строчные буквы и пробелы остаются неизменными. Все это происходит в стеке snake 1, поэтому теперь мы помещаем значение в общий стек ( m) для обработки snake 2. Наконец, 1(ест последний символ хвоста змеи 1. Так как именно там находится указатель инструкции, змея умирает.

Змея 2

)не имеет эффекта в первый раз. L!34*толкает, 34если общий стек пуст, 0иначе. Затем мы .копируем и (едим столько персонажей.

  • Если общий стек был пуст, это ставит конец змеи сразу после того, как (мы только что выполнили. Таким образом, управление возвращается к началу строки, где )регургитирует только что съеденные символы (предварительно выдвинув лишнюю копию 34) и повторяет тест длины стека.
  • Если общий стек не был пустым, никакие символы не съедаются, ';' отбрасывает лишнее 0, и выполнение продолжается:

Siпереключается на общий стек и вводит другой символ. .1+!24*толкает, 24если этот символ был -1 / EOF, в 0противном случае. На EOF (глотает 24 символа - включая IP - и змея умирает. В противном случае выполнение продолжается.

Yвозвращает копию вершины общего стека (символ, который мы только что прочитали) в собственный стек Snake 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

1
Да. Он компилируется на моей машине (с предупреждениями) и работает. Вы также можете проверить это на этой странице: golf.shinh.org/check.rb
xsot

Да, это так; +1
Abr001am

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|~ Переключите регистр первого символа (фактически на 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%, но я потратил на это более шести часов, и это, кажется, самое короткое из возможных решений.

Чтобы проверить это с помощью ввода не прописными буквами (или ввести его в свой калькулятор), создайте другую программу с содержимым AsmPrgmFDCB24DEC9и запустите ее, Asm([whatever you named it]чтобы включить режим ввода строчных букв.



1

Common 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)

Ungolfed

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

Вы не можете использовать &&putchar(c)вместо ?putchar(c):0?
Нил

@Neil Спасибо, теперь у меня меньше 100 байтов!
Зерегес

@ThomasKwa Конечно, могу, спасибо.
Зерегес

1
Вы можете сделать f-c&31как в ответе С?
Lirtosiast

1

AppleScript, 209 201 байт

Мое единственное утешение в том, что я победил Брейнфак.

установить a (отобразить диалог "" ответ по умолчанию "") возвращаемый текст
установить n в число символов а
установить в ""
повторить н
если не символ a, то n = символ 1, тогда установите o в символ a n & o.
установите n в n-1
конец
о

Как это работает, я принимаю ввод a, получаю длину aи отмечаю ее как n, и устанавливаю выходную переменную o. Для каждого найденного символа, который не содержит первый символ ( a's character 1), я присоединяю его к o. Последняя строка печатается o.

Примечание: это автоматически поддерживает все Unicode. с:


3
My only consolation is that I beat Brainfuck.Похоже, мне лучше поиграть в гольф;)
подземный

1

Сетчатка , 16 байт

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

Сохраните код с завершающим переводом строки и запустите его с -sфлагом.

Как это работает: завершающий перевод строки делает это этапом замены, так что любые совпадения данного регулярного выражения заменяются пустой строкой. В iочереди на режиме без учета регистра , который также делает обратные_связь нечувствительна к регистру. Наконец, регулярное выражение просто сопоставляет и захватывает отдельные символы, а затем проверяет, является ли первый символ в строке одинаковым (с учетом регистра), используя обратную ссылку.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.