Видаліть пробіли, підтримуючи капіталізацію


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, 2, 8, 14, 18, 23, 27, 320, 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 байти. Знову дякую!
Денніс

Хитрий! Зайняв у мене час, щоб зрозуміти, що c>' '!=f()це рівнозначно (c>' ') and (' '!=f()).
Час Браун

5

05AB1E , 15 14 байт

-1 байт завдяки Еміньї

ð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

Безголівки:

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

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

Сітківка , 77 71 байт

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

T`l `L_` .?

Спробуйте в Інтернеті! Посилання включає тестовий набір. Пояснення: Перший етап дублює рядок, а другий етап реєструє дублікат та видаляє його пробіли. Потім третій етап проходить через кожну верхню літеру справа наліво та намагається розмістити пробіл перед відповідним символом у другому рядку. Перший рядок видаляється, а пробіли використовуються для великого регістра відповідних символів результату. Редагувати: Збережено 6 байт завдяки @Kobi.


Невелике запитання: чи потрібні (.?)та $4деталі? Схоже, що необов'язкова група в кінці нічого не робить.
Кобі

@Kobi Нічого маленького в цьому питанні! Спочатку це було частиною спроби використання lookarounds для відповідності символів, які мають бути великими великими літерами, замість того, щоб перекладати їх як окремий крок.
Ніл

3

Perl, 95 94 + 1 = 95 байт

+1 байтовий штраф за -н

Збережіть один байт, замінивши 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! Якщо ви хочете, ви можете додати посилання на спробувати його онлайн: tio.run/# (я б додав його, але я не знаю, чи це Perl 5 чи Perl 6)
Stephen

1
Я думаю, що вам потрібно порахувати +1байт для -nпрапора. Крім цього, це виглядає добре! Ласкаво просимо на сайт! :)
DJMcMayhem

@StepHen це Perl 5, ви додаєте посилання? Мені не вдалося запустити свій код там пропперним способом.
Veitcel

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

1
Ви можете видалити пробіл після return.
CalculatorFeline

@LukeSawczak як це? tio.run/…
Стівен


2

Вугілля деревне , 33 байти

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

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

Оскільки я досі не знаю, як передавати рядок з пробілами як єдиний вхідний параметр в код деревного вугілля, я просто призначаю в заголовку тестову рядок змінної Charcoal, яка представляє, що буде першим входом ( θ):

AA Quick Brown Fox Jumped Over The Lazy Dogθ

Отже, код має таку ж кількість байтів, як якщо б рядок був переданий як перший вхід.

Ви можете побачити тут багатослівну версію коду.


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

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

Лист звичайний, 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++);}

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

Але я згадав, що це починало виглядати як відповідь Денніса на C, тому я просто переніс його перекрут, і ... магія сталася. Великий прибуток від порту - це видалення гілок та повторень всередині них.


@ceilingcat, який не працює: Hi! Test!повинен стати Hi!tEst!, але з вашим рішенням це стане Hi!Test.
Олів'є Грегоар

2

Google Таблиці, 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()функцію , так що ми можемо оцінити кожен символ в свою чергу ,

Результати тестових випадків: (Легше читати, якщо натиснути на більшу версію.)

Тест-справи



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.