Видаліть усі випадки першої літери рядка з усієї рядка


24

Давши вхідний рядок, що містить лише символи A-Z, a-zта пробіли, видаліть усі випадки верхнього та малого версій першого символу рядка (якщо перший символ Aвидалити всі As та as, якщо перший символ (пробіл) вилучити всі пробіли) та надрукуйте вихід.

Приклади випадків:

  • 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

мозковий ебать, 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

]

Будь ласка, не гольфуйте занадто сильно. в: Я так наполегливо працював ...
Аддісон Кримп

13

Perl, 13 байт

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

Підрахувавши шебанг як один, вхід береться з 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але, звичайно, ти придумав набагато кращий спосіб!
варення

Чому ви рахуєте хешбанг одним байтом?
Зереги

@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 - могла б перемогти перл у цьому виклику.
примо

@primo - Ви ще не помітили, що CJam та / або Pyth в значній мірі виграють 99%? Хоча Perl зробив досить непогано, вважаючи, що це єдиний, не спеціально розроблений як мова для гольфу.
Даррел Гофман

Перезавантаження операторів Pyth і CJam є смішним. мінус (рядок, рядок), який виконує видалення символів, не є основною операцією в будь-якій іншій мові, з якою я стикався.
Спарр

@Sparr APL має таку ж вбудовану. (Це називається, ~хоча.)
Денніс

7

Pyth, 8 байт

-zr*2hz3

Спробуйте в Інтернеті

Використовує версію python's Pyth 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 байт

Це повна програма, хоча вона просто заснована на 2-х регулярних регексах, які, ймовірно, могли скопіювати в програму Retina, щоб зберегти байти на вході / виводу.

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

Редагувати: Схоже, це вже було побито, якщо хтось використовував цю -pопцію. О, і використання $&замість цього $1.


1
Навіть якщо рахувати весь шебанг (тобто "повну" програму), #!perl -pце все-таки на два байти коротше $_=<>;print.
прима

@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 байт

Редагування тексту? Якщо ви сумніваєтесь, використовуйте текстовий редактор та 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.

Безголівки:

# 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інакше. +Якщо символ перетворює великі літери в малі, залишаючи маленькі літери та пробіли незмінними. Все це відбулося в стеці змії 1, тому тепер ми підштовхуємо значення до спільного стека ( m) для змії 2 для обробки. Нарешті,1( з'їдає останнього персонажа хвоста змії 1. Оскільки тут знаходиться вказівник, змія вмирає.

Змія 2

)не має ефекту з першого разу. L!34*натискає, 34якщо спільний стек порожній, 0інакше. Потім ми .копіюємо та (їмо стільки персонажів.

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

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

Yyanks копію верхньої частини спільного стека (персонаж, який ми щойно прочитали), щоб передати власний стек 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

Пітон 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 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

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.