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


27

Ваш ввод будет английским предложением, фразой или словом. Это будет только содержать a-zA-Z' -,.!?. Ваша задача - взять входные данные, удалить пробелы, а затем перераспределить заглавные буквы так, чтобы заглавные буквы в индексах, которые были заглавными до (и только буквы в индексах, которые были заглавными).

Например, если введено A Quick Brown Fox Jumped Over The Lazy Dog, индексы заглавных букв (на основе 0) 0, 2, 8, 14, 18, 25, 30, 34, 39. Далее, удалить пробелы из входа: AQuickBrownFoxJumpedOverTheLazyDog. Далее, в нижнем регистре все буквы, но прописные те на 0, 2, 8, 14, 18, 25, 30, 34, 39: AqUickbrOwnfoxJumpEdovertHelazYdog, что ваш выход.

вход

Ваш ввод будет английским предложением, фразой или словом. Он может содержать только строчные буквы, прописные буквы, дефисы, апострофы, запятые, точки, вопросительные знаки, восклицательные знаки и пробелы.

Выход

Ввод с удаленными пробелами, в нижнем регистре-d, с буквами в индексе заглавных букв во вводе в верхнем регистре-d.

ПРИМЕЧАНИЕ. Ваша программа не может аварийно завершить работу (ошибка, такое выполнение прекращается) с помощью IndexOutOfRange или аналогичной ошибки.

Тестовые случаи

Hi! Test!
Hi!tEst!

A Quick Brown Fox Jumped Over The Lazy Dog
AqUickbrOwnfoxJumpEdovertHelazYdog

testing TESTing TeStING testing testing TESTING
testingtESTIngteStInGTEstingtestingtestiNG

TESTING... ... ... success! EUREKA???!!! maybe, don't, NOOOOO
TESTING.........success!eureKA???!!!maybe,don't,nooooo

Enter        PASSWORD ---------
Enterpassword---------

A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Z z
AabbCcddEeffGghhIijjKkllMmnnOoppQqrrSsttUuvvWwxxZz

  TEST
teST


«Например, если вводится« Быстрая коричневая лиса, перепрыгнувшая через ленивую собаку », то заглавными буквами (на основе 0) указываются 0, 2, 8, 14, 18, 23, 27, 32« Они есть0, 2, 8, 14, 18, 25, 30, 34, 39
Люк Савчак,

@LukeSawczak спасибо, мой плохой
Стивен

Я полагаю, пробелы запрещены.
Луис Мендо

@ LuisMendo ваше предположение верно. Это код-гольф, верно? : P
Стивен

Ответы:


7

Желе , 14 13 байт

nŒlTɓḲFŒlŒuṛ¦

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

Как это работает

nŒlTɓḲFŒlŒuṛ¦  Main link. Argument: s (string)

 Œl            Convert s to lowercase.
n              Perform character-wise "not equal" comparison.
   T           Get the indices of all truthy elements, i.e., the indices of all
               uppercase letters in s. Let's call the resulting array J.
    ɓ          Begin a dyadic chain with left argument s and right argument J.
     ḲF        Split s at spaces and flatten, removing the spaces.
       Œl      Convert s to lowercase.
            ¦  Sparse application:
         Œu        Convert s to uppercase.
           ṛ       Take the resulting items of the uppercased string at all indices
                   in J, the items of the lowercased string at all others.


7

Python 2 , 114 байт

x=input()
X=x.replace(' ','')
print''.join([X[i].upper()if x[i].isupper()else X[i].lower()for i in range(len(X))])

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

Эквивалентное:

Python 2 , 114 байт

lambda x:''.join([[str.lower,str.upper][x[i].isupper()](x.replace(' ','')[i])for i in range(len(x)-x.count(' '))])

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


''.join([(X[i].lower,X[i].upper)[x[i].isupper()]()for i in range(len(X))])для -5 байтов.
овс

5

Python 3 , 78 75 72 байта

s=input()
for c in s:s=s[c>' '!=print(end=(c+c).title()[s<'@'or'['<s]):]

Спасибо @xnor за удаление 6 байтов!

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


Вы можете просто сравнить sвместо s[0]?
xnor

Да, конечно. Благодарность!
Деннис

1
(c*2).title()Вы можете получить оба случая, хотя и переключаются.
xnor

Еще 3 байта. Еще раз спасибо!
Деннис

Tricky! Мне потребовалось время, чтобы понять, что c>' '!=f()эквивалентно (c>' ') and (' '!=f()).
Час Браун

5

05AB1E , 15 14 байтов

-1 байт благодаря Emigna

ðKuvy¹Nè.lil}?

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

ðK             # Remove spaces
  u            # Convert to uppercase
   vy          # For each character...
     ¹Nè       #   Get the character at the same index from the original input
        .lil}  #   If it was a lowercase letter change this one to lowercase
             ? # Print without a newline

Вы сохраняете байт, если в верхнем регистре убираете пробел, а в условии строчные
Эминья

5

Haskell , 98 95 89 88 81 байт

Спасибо @name, @nimi, @Zgarb и @Laikoni за помощь в сокращении всего 14 байт

import Data.Char
\s->zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s

Ungolfed:

import Data.Char
\sentence -> zipWith (\oldChar newChar ->
                        if isUpper oldChar
                        then toUpper newChar
                        else toLower newChar)
                     sentence
                     (filter (/= ' ') sentence)

На мобильном телефоне, но, похоже, вы можете сэкономить несколько байтов с фильтром (/ = '')
Генри

Да, конечно, может. Пропущена часть спецификации, где отмечалось, что пробелы были единственным пробелом, который нужно было удалить.
Джулиан Вольф

1
filter(>' ')за один байт меньше
Ними

2
Я думаю, что тело лямбды может быть сокращено доlast(toLower:[toUpper|isUpper p])c
Zgarb

Переключение аргументов zipWithдолжны сохранить один байт больше: f s=zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s.
Лайкони

4

V , 24 байта

ÄVuÓó
ejlDò/¥2lõ
vuk~òGd

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

Такого рода задачи - именно то, для чего был создан V. :)

Объяснение:

Ä           " Duplicate this line
 Vu         " Convert it to lowercase
   Óó       " Remove all spaces
e           " Move to the end of this line
 j          " Move down a line (to the original)
  l         " Move one char to the right
   D        " And delete the end of this line
    ò       " Recursively:
     /      "   Search for:
         õ  "     An uppercase character
      ¥2l   "     On line 2
            "     (This will break the loop when there are no uppercase characters left)
vu          "   Convert it to lowercase
  k         "   Move up a line
   ~        "   Convert this to uppercase also
    ò       " Endwhile
     G      " Move to the last line
      d     " And delete it

@DLosc Хорошие вопросы! Символы новой строки сигнализируют об окончании команды регулярного выражения, такой как команда замены (удаления) или поиска. Более подробно на этой странице: github.com/DJMcMayhem/V/wiki/Regexes
DJMcMayhem

4

Python 2, 100 байт

s=input()
print"".join([c.lower(),c.upper()][s[i].isupper()]for i,c in enumerate(s.replace(" ","")))

3
Добро пожаловать в PPCG и очень хороший первый ответ!
ETHproductions

3

Алиса , 32 байта

/..- ~l+u~mSloy
\ia''-y.'Qa.+a@/

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

объяснение

Это стандартный шаблон для программ, которые работают полностью в обычном режиме. Развернутая программа выглядит следующим образом:

i.' -l.uQm.lay.a-'~y+'~aS+o@

i       take input as string
.       duplicate
' -     remove spaces from copy
l.u     create all-lowercase and all-uppercase versions
Q       reverse stack, so original string is on top
m       truncate original string to length of spaces-removed string
.lay    convert everything except uppercase characters to \n
.a-'~y  convert everything except \n (i.e., convert uppercase characters) to ~
+       superimpose with lowercase string
        \n becomes the corresponding lowercase character, and ~ remains as is
'~aS    convert ~ to \n
+       superimpose with uppercase string
        lowercase in existing string stays as is because it has a higher code point
        \n becomes corresponding uppercase character
o       output
@       terminate

3

JavaScript (ES6), 94 91 85 байт

s=>s.replace(/./g,c=>c==" "?"":c[`to${"@"<s[x]&s[x++]<"["?"Upp":"Low"}erCase`](),x=0)
  • 6 байтов сохранено с помощью ETHproductions & Arnauld.

Попытайся

o.innerText=(f=

s=>s.replace(/./g,c=>c==" "?"":c[`to${"@"<s[x]&s[x++]<"["?"Upp":"Low"}erCase`](),x=0)

)(i.value="Hi! Test!");oninput=_=>o.innerText=f(i.value)
<input id=i><pre id=o>



Не могли бы вы сделать '@'<s[i]&s[i]<'['??
ETHproductions

@ StepHen: Оу, чувак, не видел этого прошлой ночью, пока я работал над этим.
Лохматый

@ETHproductions: Мне было интересно, может ли это быть короче, но я был слишком ленив, чтобы посмотреть, какие символы мне нужно использовать: D Оказывается, это да, но экономит байт; Спасибо.
Лохматый

3

Retina , 77 71 байт

.+
$&¶$&
T`L `l_`.+$
+`((.)*)[A-Z].*(¶(?<-2>.)*)
$1$3 
.+¶

T`l `L_` .?

Попробуйте онлайн! Ссылка включает тестовый набор. Объяснение: На первом этапе дублируется строка, а на втором этапе строчные буквы дублируются и удаляются пробелы. Затем третий этап проходит по каждой заглавной букве справа налево и пытается поставить пробел перед соответствующим символом во второй строке. Первая строка удаляется, а пробелы используются в верхнем регистре соответствующих символов результата. Изменить: Сохранено 6 байтов благодаря @Kobi.


Маленький вопрос: Является ли (.?)и $4детали нужны? Похоже, что дополнительная группа в конце ничего не делает.
Коби

@ Коби Ничего маленького в этом вопросе! Первоначально это было частью попытки использовать обходные пути для сопоставления символов, которые должны быть прописными непосредственно, вместо того, чтобы переводить их как отдельный шаг.
Нил

3

Perl 95 94 + 1 = 95 байт

+1 байтный штраф за -n

Сохранить один байт путем замены от s/\s//gдоs/ //g

$s=$_;s/ //g;$_=lc($_);while(/(.)/gs){$p=$&;$p=uc($p)if(substr($s,$-[0],1)=~/[A-Z]/);print$p;}

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

Объяснение:

  1. Сделайте копию входной строки.

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

  3. Затем начните цикл над каждой буквой. Проверьте букву в той же позиции в сохраненной строке в верхнем регистре. Если оно верхнее - сделать текущую букву заглавной. Распечатать письмо.

Обратите внимание, что Perl должен быть запущен с ключом командной строки "-n"


Добро пожаловать в PPCG! Если хотите, вы можете добавить ссылку на Try It Online: tio.run/# (я бы добавил, но не знаю, Perl 5 или Perl 6)
Стивен

1
Я думаю, что вам нужно посчитать +1байт для -nфлага. Кроме того, это выглядит хорошо! Добро пожаловать на сайт! :)
DJMcMayhem

@ StepHen это Perl 5, colud ты добавляешь ссылку? Я не смог запустить свой код там более корректным способом.
Вейтсель

Рад видеть нового игрока в Perl! Я добавил ссылку TIO в ваш ответ и улучшил форматирование.
Дада


2

Python 3 , 117 байт

s=input()
y=list(s.replace(' ','').lower())
i=0
for c in y:
 if s[i].isupper():y[i]=c.upper()
 i+=1
print(''.join(y))

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

Это в значительной степени мой первый гольф-код, поэтому, скорее всего, он будет плохим, за исключением помощи из комментариев ниже!

PS Да, глупо, что определение и увеличение iсохраняют байты в диапазоне (len (y)). Ну что ж.


1
Добро пожаловать в PPCG! Хорошая первая подача! Однако, в соответствии со стандартами ввода / вывода нашего сайта, ваша отправка должна быть либо функцией строки, либо принимать ввод; Вы не можете предполагать, что вход находится в переменной. Надеюсь, вам понравится ваше пребывание! :)
HyperNeutrino

Благодарность; отредактировал функцию, но также сохранил 5 байтов в теле: D
Люк Савчак,

1
@LukeSawczak сэкономьте тонну байтов, изменив один пробел на отступ, и, возможно, добавьте Try It Online! ссылка, если вы хотите
Стивен

1
Вы можете удалить пространство после return.
CalculatorFeline

@ LukeSawczak как это? tio.run/…
Стивен


2

Древесный уголь , 33 байта

A⁰χFLθ¿⁼§θι A⁺¹χχ¿№α§θ⁻ιχ↥§θι↧§θι

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

Поскольку я до сих пор не знаю, как передать строку с пробелами в качестве единственного входного параметра в код Charcoal, я просто назначаю в заголовке тестовую строку переменной Charcoal, которая представляет собой первый вход ( θ):

AA Quick Brown Fox Jumped Over The Lazy Dogθ

Таким образом, код имеет такое же количество байтов, как если бы строка была передана в качестве первого ввода.

Вы можете увидеть здесь подробную версию кода.


1
Я сказал в другом ответе, но на тот случай, если вы забудете, просто введите как массив Python с одним элементом
только ASCII

Мне просто нужно, чтобы ввод имел завершающий перевод строки.
Нил

2

PHP, 181 байт

Я пытаюсь получить младшие числа байтов, это мой код:

<?php
$s=readline();
preg_match_all('/[A-Z]/',$s,$m,PREG_OFFSET_CAPTURE);
$s=strtolower(str_replace(' ','',$s));
while($d=each($m[0]))$s[$d[1][1]]=strtoupper($s[$d[1][1]]);
echo $s;

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


Вместо константы PREG_OFFSET_CAPTUREвы можете использовать значение 256, $argnэто более короткая переменная, как readline()для ввода, и я думаю, ctype_upperи использование, lcfirstи ucfirstсэкономит много байтов с одним циклом и использованием $$iи троичного оператора
Jörg Hülsermann

2

Java 8, 184 177 161 байт

s->{String r="";for(int i=0,j=i,t,u;i<s.length;){t=s[i++];if(t>32){u=s[j++];r+=(char)(t<65|t>90&t<97|t>122?t:u>64&u<91?t&~32:u>96&u<123|u<33?t|32:t);}}return r;}

Определенно можно сыграть в гольф еще ..
- 16 байтов благодаря @ OlivierGrégoire , приняв вход char[]вместо String.

Объяснение:

Попробуй это здесь.

s->{                           // Method with char-array parameter and String return-type
  String r="";                 //  Result-String
  for(int i=0,j=i,t,u;         //  Some temp integers and indices
      i<s.length;){            //  Loop over the String
    t=s[i++];                  //   Take the next character and save it in `t` (as integer)
                               //   and raise index `i` by 1
    if(t>32){                  //   If `t` is not a space:
     u=s[j++];                 //   Take `u` and raise index `j` by 1
     r+=                       //   Append the result-String with:
      (char)                   //    Integer to char conversion of:
       (t<65|t>90&t<97|t>122?  //     If `t` is not a letter:
        t                      //      Simply use `t` as is
       :u>64&u<91?             //     Else if `u` is uppercase:
        t&~32                  //      Take `t` as uppercase
       :u>96&u<123|u<33?       //     Else if `u` is lowercase or a space:
        t|32                   //      Take `t` as lowercase
       :                       //     Else:
        t);                    //      Take `t` as is
    }
  }                            //  End of loop
  return r;                    //  Return result-String
}                              // End of method

1
Возьмите char[]вместо String для этого, вы сэкономите много байтов!
Оливье Грегуар

С другой стороны, я тоже ответил другим алгоритмом. И здесь я принимаю противоположные аргументы: in = String, out = char[]:-)
Оливье Грегуар

2

Common Lisp, 104 байта

(defun f(s)(map'string(lambda(x y)(if(upper-case-p x)(char-upcase y)(char-downcase y)))s(remove #\  s)))

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

Необычно короткий для многословного Common Lisp!

Простой код:

(defun f (s)                     ; receive the string as parameter
  (map 'string                   ; map the following function of two arguments
       (lambda (x y)             ; x from the original string, y from the string with removed spaces
         (if (upper-case-p x)    ; if x is uppercase
             (char-upcase y)     ; get y uppercase
             (char-downcase y))) ; else get y lowercase
       s
       (remove #\  s)))

2

Java (OpenJDK 8) , 150 117 113 97 байт

s->{for(int i=0,j=0,c;i<s.length;)if((c=s[i++]&95)>0)System.out.printf("%c",c^(s[j++]|~c/2)&32);}

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

Во время игры в гольф я получил 102 байта:

s->{for(int i=0,j=0,c;i<s.length;)if((c=s[i++]&95)>0)System.out.printf("%c",c<64?c|32:c|s[j]&32,j++);}

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

Но я вспомнил, что это начинало выглядеть как ответ Дениса С, поэтому я просто перенес его немного в тупик и ... волшебство произошло. Большая выгода от порта - удаление веток и повторений внутри них.


@ceilingcat, который не работает: Hi! Test!должен стать Hi!tEst!, но с вашим решением это становится Hi!Test.
Оливье Грегуар

2

Google Sheets, 213 байтов

=ArrayFormula(JOIN("",IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Z]"),MID(UPPER(SUBSTITUTE(A1," ","")),ROW(OFFSET(A1,0,0,LEN(A1))),1),MID(LOWER(SUBSTITUTE(A1," ","")),ROW(OFFSET(A1,0,0,LEN(A1))),1))))

Вход находится в ячейке, A1и формула разбивается следующим образом:

  • ArrayFormula()позволяет нам оценить каждый член ROW()независимо
  • JOIN() объединяет все эти независимые результаты в одну строку
  • IF(REGEXMATCH(),UPPER(),LOWER() это то, что делает его чередующимся, используя верхний или нижний регистр в зависимости от того, что регистр был в этой позиции на входе
  • ROW(OFFSET())возвращает массив значений 1в A1.lengthкоторые могут быть введены в MID()функцию , так что мы можем оценить каждый символ в свою очередь ,

Результаты тестовых случаев: (легче прочитать, если перейти к более крупной версии.)

TestCases



2

Perl, 92 байта

$p[$i++]=$-[0]while s/[A-Z]/lc($&)/e;s/\s//g;for$c(@p){substr($_,$c,1)=~tr[a-z][A-Z]};print;

Объяснение:

$p[$i++]=$-[0]while s/[A-Z]/lc($&)/e;   #get locations of caps into an array at the same time converting letters to lowercase

s/\s//g;   #delete all spaces

for$c(@p){substr($_,$c,1)=~tr[a-z][A-Z]};   #convert lowercase letters to uppercase where uppercase letters were present

print;   # print (of course) :)

1
Добро пожаловать в PPCG! :)
Стивен

Вы должны добавить -nфлаг, чтобы ваш ответ был действительным. Несколько вещей в гольфе: s/ //gдостаточно (не нужно \s), y/a-z/A-Z/это то же самое tr[a-z][A-Z], что вы можете использовать -pфлаг, чтобы вам не понадобилось последнее print, вам не нужны круглые скобки lc$&.
Дада



1

Python 2, 106 105 байт

s=input()
print''.join(map(lambda(c,u):[c.lower,c.upper][u](),zip(s.replace(' ',''),map(str.isupper,s))))

Редактировать: сохранить один байт через print ''.join=> print''.join.

Лямбда-форма, 99 байт

lambda s:''.join(map(lambda(c,u):[c.lower,c.upper][u](),zip(s.replace(' ',''),map(str.isupper,s))))


1

q / kdb +, 49 байтов

Решение:

{@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}

Примеры:

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"Hi! Test!"
"Hi!tEst!"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"A Quick Brown Fox Jumped Over The Lazy Dog"
"AqUickbrOwnfoxJumpEdovertHelazYdog"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"testing TESTing TeStING testing testing TESTING"
"testingtESTIngteStInGTEstingtestingtestiNG"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"TESTING... ... ... success! EUREKA???!!! maybe, don't, NOOOOO"
"TESTING.........success!eureKA???!!!maybe,don't,nooooo"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"Enter        PASSWORD ---------"
"Enterpassword---------"

q){@[a;(&)(#:[a:lower x except" "]#x)in .Q.A;upper]}"A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Z z"
"AabbCcddEeffGghhIijjKkllMmnnOoppQqrrSsttUuvvWwxxZz"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"  TEST"
"teST"

Объяснение:

Найдите индексы, в которых ввод upperвводится в верхнем регистре, а затем примените функцию к этим индексам в строчной версии строки ввода, удаленной от пробела. Обратите внимание, что мы не можем применить функцию за пределами длины строки, поэтому используйте take ( #), чтобы обрезать входную строку до длины строчной, удаленной версии.

{@[a;where count[a:lower x except " "]#x in .Q.A;upper]} / ungolfed
{                                                      } / lambda function
 @[ ;                                           ;     ]  / apply FUNC to VAR at INDICES: @[VAR;INDICES;FUNC]
                                                 upper   / uppercase, upper["abc"] -> "ABC"
                                       x in .Q.A         / boolean list where input is in uppercase alphabet ABC..XYZ
                                      #                  / take this many elements from list on the right (ie truncate)
           count[                    ]                   / returns length of the stuff inside the brackets, count["ABC"] -> 3                                        
                         x except " "                    / remove " " from string
                   lower                                 / lowercase, lower["ABC"] -> "abc"
                 a:                                      / save in variable a
     where                                               / returns indices where true where[101b] -> 0 2
   a                                                     / our lowercased, space-stripped input

Бонус:

Прочитав ответы, я подумал, что я бы попробовал решение, в котором я перебрал бы входные данные, пока я управлял только 53-байтовым решением:

{a{$[y in .Q.A;upper x;x]}'#:[a:lower x except" "]#x}


1

Perl 5 , 40 байт

37 байт кода + -Fфлаг. (обратите внимание, что в старых версиях Perl может потребоваться добавить -anфлаги)

print$F[$i++]=~/[A-Z]/?uc:lc for/\S/g

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

Пояснения:
Спасибо -F, @Fсодержит список всех символов ввода.
for/\S/gперебирает каждый непробельный символ ввода. Мы используем $iдля подсчета, на какой итерации мы находимся. Если $F[$i++]это символ верхнего регистра ( /[A-Z]/), то мы печатаем текущий символ верхнего регистра ( uc), иначе мы печатаем его в нижнем регистре ( lc) Отметьте это ucи lcверните их аргумент без изменений, если это не буква.


Предыдущая версия (меньше гольфа: 47 байт):

 s/ //g;s%.%$_=$&;$F[$i++]=~/[A-Z]/?uc:lc%ge

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

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