Дубликат и чехол

34

Цель состоит в том, чтобы, взяв строку в качестве входных данных, продублировать каждую латинскую букву и «переключить» ее регистр (т.е. верхний регистр становится строчным и наоборот).

Пример входов и выходов:

Input      Output
bad        bBaAdD
Nice       NniIcCeE
T e S t    Tt eE Ss tT
s E t      sS Ee tT
1!1!1st!   1!1!1sStT!
n00b       nN00bB     
(e.g.)     (eE.gG.)
H3l|@!     Hh3lL|@!

Ввод состоит из печатных символов ASCII.

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

nicael
источник
17
Это очень хорошая, простая, но не тривиальная задача.
Мего

Ответы:

10

Желе, 5 байт

żŒsQ€

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

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

żŒsQ€  Main link. Argument: s (string)

 Œs    Yield s with swapped case.
ż      Zip s with the result.
   Q€  Unique each; deduplicate each pair of characters.
Деннис
источник
17

Python, 56 54 байта

lambda s:''.join(c+c.swapcase()*c.isalpha()for c in s)

Проверьте это на Ideone .

Деннис
источник
Dang! Гольфил меня на 4 байта ...
Р. Кап
Как это поддерживает не-буквенные символы? Я думаю, они будут отображаться как пустые строки.
атласолог
@atlasologist Как вы можете видеть на Ideone, они этого не делают. *имеет более высокий приоритет, чем +, поэтому он влияет только на cрегистр с заменой.
Деннис
Ох, хорошо, я не думал об этом так. Ницца.
атласолог
16

JavaScript ES6, 70 68 66 64 байта

Сохранено 2 байта благодаря @Kevin Lau - не Кенни

Сохранено 2 байта благодаря @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

s=>s.replace(/[A-Z]/gi,l=>l+l[`to${l<"a"?"Low":"Upp"}erCase`]())

объяснение

Это использует действительно hacky:

l[`to${l<"a"?"Low":"Upp"}erCase`]()

Который является негольфом:

l[`to${
   l < "a" ?
   "Low" : 
   "Upp"
}erCase`]()

В основном l < "a"проверяет, меньше ли кодовая точка буквы, чем кодовая точкаa (следовательно, является заглавной буквой). Если это так, он будет делать то, to + Low + erCaseчто стало l['toLowerCase']()и делает символ строчными. `кавычки допускают форматирование строк, так что по сути вы можете думать о:

`to${l < "a" ?"Low" : "Upp"}erCase`

as: "to" + (l<"a" ? "Low" : "Upp") + "erCase"генерирует вызываемую функцию (строчная или прописная строка). Мы поставили это в квадратных скобках[ ... ] что позволяет нам получить доступ к свойству, указанному в виде строки. Это возвращает соответствующую функцию, а затем мы просто вызываем ее.

Downgoat
источник
3
/[A-Z]/giэто более короткое регулярное выражение: 3
Value Ink
@ KevinLau-notKenny ой хороший улов, спасибо!
Downgoat
1
to${l<"a"?"Lower":"Upper"}Caseкto${l<"a"?"Low":"Upp"}erCase
Конор О'Брайен
@ CᴏɴᴏʀO'Bʀɪᴇɴ о, хорошо, спасибо!
Вниз
4
l[`to${l<"a"?"Low":"Upp"}erCase`]()Я думаю, что у нас есть новое определение зла.
gcampbell
10

Руби, 37 33 (30+-p флаг) байтов

swapcaseна помощь! Вроде. -4 байта от @Lynn.

gsub(/[a-z]/i){$&+$&.swapcase}
Значение чернил
источник
gsub(/[a-z]/i){$&+$&.swapcase}плюс pфлаг составляет 31 байт.
Линн
1
@ Линн Я полагаю, что консенсус был необходим, чтобы отредактировать разницу со сценарием по умолчанию, поэтому этот pфлаг составляет около (space)-p3 байтов.
Чернила стоимости
8

C 63 60 байт

f(char*s){for(;*s;s++)isalpha(putchar(*s))&&putchar(32^*s);}

Использует тот факт, что 'a' XOR 32 == 'A' и т. Д.

Три байта сохранены благодаря FryAmTheEggman.

Линн
источник
Вы можете переместить s++в последний putchar( &&putchar(32^*s++)), чтобы сохранить один байт
Джакомо Гарабелло
Я думаю, что вы можете заменить &&на *, не так ли?
Aloisdg говорит восстановить Монику
1
Я почти уверен, что оба из них не работают, если я думаю о том, как работает &&короткое замыкание.
Линн
f(char*s){isalpha(putchar(*s))&&putchar(32^*s);*s&&f(1+s);}рекурсивных?
14 м2 18
1
f(char*s){*s&&f(1+s,isalpha(putchar(*s))&&putchar(32^*s));}рекурсивных?
м2
6

CJam, 11 байт

l_el_eu.+.|

Проверьте это здесь.

объяснение

l      e# Read input.
_el    e# Duplicate, convert to lower case.
_eu    e# Duplicate, convert to upper case.
.+     e# Concatenate the two characters in matching positions from those two
       e# strings. E.g. "ab!" "AB!" would give ["aA" "bB" "!!"].
       e# For each character from the original string and the corresponding 
.|     e# string from this list, take the set union (which eliminates duplicates
       e# and keeps the order the values appear in from left to right, so that
       e# the original case of each letter comes first).
Мартин Эндер
источник
5

Pyth , 7 байт

sm{+dr2

Тестовый пакет .

sm{+dr2    input: Q
sm{+dr2dQ  implicit arguments

        Q  input
 m         for each character as d:
     r2d       swapcase
   +d          prepend d
  {            deduplicate
s          join as string
Дрянная Монахиня
источник
Ха-ха, это действительно быстро: D
Никель
5

Haskell, 73 байта

l=['a'..'z']
u=['A'..]
(>>= \c->c:maybe""pure(lookup c$zip l u++zip u l))
Линн
источник
5

Чеддер , 118 104 байта

(s)->s.chars.map((i)->{if String.letters has i.lower{if i<"a"{i+i.lower}else{i+i.upper}}else{i}}).join()

Первый настоящий чеддерский ответ !!! Это гораздо менее болезненно, чем я думал, что это будет ...; _;

Работает с выпуском 1.0.0-бета.9 , не конкурирует.


Как вы можете сказать, я не придумал чеддер для игры в гольф: /

Ungolfed:

(str) -> str.chars.map(
    (i) -> {
        if String.letters has i {
            if i < "a" { // Check char code, meaning it's upper case if true
                i+i.lower
            }
            else {
                i+i.upper
            }
        } else {
            i
        }
    }
).join()

Использование:

var doThing = <code here>;
doThing("input...");

Обновить: 14.07.16 Я закончил троичные, уменьшив до 84 байт

Чеддер, 84 байта

(s)->s.chars.map((i)->String.letters has i.lower?i<"a"?i+i.lower:i+i.upper:i).join()

работает с версии v1.0.0-beta.14

Downgoat
источник
4
Ура! Мы долго ждали этого момента!
DJMcMayhem
С одним или двумя изменениями имени метода, также действует Sidef
кошка
@cat o_o сходство тревожит
Downgoat
Ну, они оба находятся под влиянием Perl, Perl 6, Ruby, Python и т. Д., Поэтому это не так удивительно: P
cat
1
@ Cat О, нет, нет, нет, нет, чеддер не был под влиянием питона
Downgoat
4

Сетчатка, 28 27 21 байт

Это вкладки, а не пробелы.

.
$&  $&
T`lL    p`Ll_`  .

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

Спасибо всем за предложения.

mbomb007
источник
Пространства съедены SE.
Конор О'Брайен
[A-Za-z]->i`[A-Z]
Downgoat
Мы с Мартином разговаривали в чате, и мы придумали: retina.tryitonline.net/…
FryAmTheEggman
@FryAmTheEggman Ах, я забыл о _. Я собираюсь использовать вкладки, чтобы я мог тестировать все тестовые случаи одновременно.
mbomb007
1
Но набор тестов не обязательно должен быть в гольфе: P Обычно достаточно просто оставить записку о том, что «первая строка заставляет его работать отдельно на каждой линии». Здесь это спасет вас от безумия символов табуляции.
FryAmTheEggman
4

С, 87 80

Передайте строку в качестве входных данных f()и выходные данные будут записаны в STDOUT. Строка не изменяется.

f(char*v){for(;*v;++v)putchar(*v),isalpha(*v)?putchar(*v-32+64*!islower(*v)):0;}
owacoder
источник
Можете ли вы предоставить способ попробовать это онлайн?
Aloisdg говорит восстановить Монику
@aloisdg Попробуйте ideone.com
кошка
4

sed, 30 байтов

Код 29 байт + параметр 1 байт -r

s/([a-z])|([A-Z])/&\u\1\l\2/g

Использование:

echo -e 'bad\nNice\nT e S t\ns E t\n1!1!1st!\nn00b\n(e.g.)\nH3l|@!' |\
sed -r 's/([a-z])|([A-Z])/&\u\1\l\2/g'
Marco
источник
4

J, 31 29 байт

[:;]<@~."1@,.tolower,.toupper

объяснение

[:;]<@~."1@,.tolower,.toupper  Input: s
                      toupper  Convert s to all uppercase
             tolower           Convert s to all lowercase
                    ,.         Join them as columns in a 2d array
   ]                           Identity function, get s
           ,.                  Prepend s as a column to the 2d array
      ~."1@                    Take the unique chars on each row
    <@                         Box them
[:;                            Unbox the list of boxes and join their contents and return
миль
источник
4

Haskell, 121, 101, 85, 82

import Data.Char
g n|isLower n=toUpper n|1<2=toLower n
(>>= \x->x:[g x|isAlpha x])
Zylviij
источник
3
Заменив if-then-else на «guard», вы можете сэкономить 15 байтов или около того. И isLowerкороче конструкции с elem, на 5 байтов больше.
Арджанен
1
>>=является concatMap(или concat.map) с аргументами перевернутых: f n = n >>= (\x->if isAlpha x then[x,r x]else[x]). Вы можете пойти pointfree и опустить имя функции и заменить определение fс (>>= \x->if isAlpha x then[x,r x]else[x]).
Ними
1
Вместо otherwiseвы можете использовать любое выражение, которое оценивает True, например 1<2. Вы можете заменить if .. then .. elseсо списком понимания: \x->[x]++[g x|isAlpha x]. О, и есть ошибка: второй toUpperв gдолжно быть toLower.
Ними,
1
О, еще один: [x]++есть x:.
Ними,
4

Perl, 36 байт (35 + -nфлаг)

s/[a-z]/$&.(ord$&<97?lc$&:uc$&)/ige

( -pтег необходим)

(-2 байта благодаря @Dom Hasting)

Краткое объяснение:
ordвозвращает числовое значение символа. ord(any lower case) >= 97и ord(any upper case) <= 90).

Бежать с :

perl -pe 's/[a-z]/$&.(ord$&<97?lc$&:uc$&)/ige'
папа
источник
Вам все еще нужно использовать, /iиначе ваше регулярное выражение будет соответствовать нескольким кодовым точкам между буквами.
Волков Олег Викторович
@ OlegV.Volkov ну да ладно, спасибо, ответ отредактировал.
Дада
Получил еще один байт, используя ваш метод: попробуйте онлайн!
Xcali
4

Рубин, 31 + 1 = 32 30 + 1 = 31 байт

С -pфлагом беги

gsub(/(?<=(.))/){$1.swapcase!}

Использует тот факт, что swapcase!будет возвращать nilчто угодно, кроме буквы ASCII, которая при возврате из gsubблока переводится в пустую строку . @Jordan сохранил байт, захватив предыдущий символ в просмотре.

histocrat
источник
Соответствовать //и затем использовать $`[-1]умно.
Иордания
1
Мне удалось сбрить шесть байтов с помощью lookbehind gsub(/(?<=(.))/){$1.swapcase!}. Однако это та же самая базовая концепция, поэтому не стесняйтесь ее использовать.
Джордан,
Круто! Это выглядит на один байт короче для меня.
гистократ
Э-э, да, один байт. Я думаю, что у меня был дополнительный код, чтобы проверить, что я случайно посчитал.
Джордан
Нет необходимости использовать самоизменяющуюся версию .swapcase!. (Я имею в виду, удалить !.)
manatwork
4

R 191 187 168 156 98 99 байт

99 байт благодаря улучшениям для Giuseppe и MickyT .

paste0(x<-unlist(strsplit(readline(),"")),gsub("[^A-Za-z]","",chartr("a-zA-Z","A-Za-z",x)),collapse="")
rturnbull
источник
98 байт - может быть, когда-нибудь в следующем году, мы сможем найти еще один гольф, хахаха.
Джузеппе
1
Я ненавижу быть носителем плохого нового, но это не удается в тестовых случаях с пробелами. readline()можно использовать, но это будет стоить байта
MickyT
@ MickyT спасибо, исправлено.
rturnbull
@MickyT scanбудет работать с вводом данных, заключенным в кавычки (как это часто бывает в случае аргументов командной строки на других языках)
Giuseppe
@ Giuseppe Извините, я этого не осознавал. Я просто подумал, что он автоматически разбивается на пробельные символы, если вы не укажете непробельный символ. Извините
MickyT
3

05AB1E , 7 байтов

Код:

vyyš«Ù?

Объяснение:

v       # For each in input.
 yyš    # Push y and y swapcased.
    «Ù  # Concatentate and uniquify.
      ? # Print without a newline.

Использует кодировку CP-1252 . Попробуйте онлайн!

Аднан
источник
Может быть, вы могли бы предоставить ссылку на переводчика?
Никель
2
@nicael Это связано ... Это прямо на github.
mbomb007
Так нет онлайн переводчика? :(
Никель
@nicael Затем загрузите его и запустите. Там не должен быть переводчик онлайн , просто переводчик.
mbomb007
1
@nicael Да, пока нет онлайн-переводчика :(. Оффлайн-версия должна работать.
Аднан,
3

На самом деле 8 байтов

`;Öo╔`MΣ

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

Объяснение:

`;Öo╔`MΣ
`;Öo╔`M   for each character in input:
 ;          duplicate the character
  Ö         swap case
   o        append to original character
    ╔       remove duplicated characters
       Σ  concatenate
Mego
источник
3

MATL, 11 9 байт

tYov"@uv!

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

объяснение

        % Implicitly grab input as string
t       % Duplicate the input
Yo      % Swap case of all characters
v       % Vertically concatenate the original and swap-cased versions
"       % For each column (letter in the original)
  @u    % Compute the unique values (without sorting)
  v!    % Vertically concatenate with the existing output and transpose
        % Implicit end of for loop and implicit display
Suever
источник
3

Perl, 28 22 21 байт (20 + -pфлаг)

s/[a-z]/$&.$&^$"/ige
Олег В. Волков
источник
Я полагаю, вы можете сохранить байт, используя $"вместо ' ', но я не проверял.
msh210
@ msh210, хорошо! Как я могу забыть проверить perlvar для строк по умолчанию? Благодарность!
Волков Олег Викторович
3

Stax , 7 6 байт

Спасибо @recursive за сохраненный байт!

┤§ÆP♦■

Запустите и отладьте его на staxlang.xyz! (ссылка на распакованную версию)

Распаковано (7 байт):

c:~\{um

Объяснение:

c:~\{um
c          Copy the top element of the stack (the input, in this case).
 :~        Switch case of each letter in the copy.
   \       Zip. This produces an array of two-character strings.
    { m    Map a block over this array of two-character strings.
     u       Get all unique elements.
           Implicit concatenate and print.
Хулдрасет на'Барья
источник
Спасибо, что попробовали Стакс. Одно простое улучшение, которое вы можете сделать, это использовать uвместо :g. Он получит все уникальные элементы в массиве, а это именно то, что вам нужно в этом случае. Помимо этого, это выглядит хорошо в гольф.
рекурсивный
@recursive Спасибо! Забыл об этом: / Скоро отредактирую.
Хулдрасет на'Барья,
Не работает 123. Возможно, вам придется изменить формат для всех входных данных (т.е. указать их в кавычках). Ссылка тоже битая. Вам нужно заменить m=11на m=2. На staxlang.xyz есть кнопка пост-генерации PPCG, так что вы можете использовать ее.
Вейцзюнь Чжоу
@ WeijunZhou Спасибо, исправлено!
Хулдрасет на'Барья
2

Python, 59 байт

lambda s:''.join((x,x+x.swapcase())[x.isalpha()]for x in s)

Отредактировано, чтобы исправить повторяющиеся не алфавитные символы

atlasologist
источник
2

PHP 4.1, 57 байт

Этот код предполагает доступ через веб-сервер (например, Apache) с использованием конфигурации по умолчанию.

Вы можете передать строку, посылая ключ Sлюбым способом ( POST, GET, COOKIE, SESSION...).

<?for($i=0;$c=$S[$i++];)echo$c,ctype_alpha($c)?$c^' ':'';
Исмаэль Мигель
источник
2

C #, 82 71 байт

s=>string.Concat(s.Select(c=>c+(char.IsLetter(c)?(char)(c^32)+"":"")));

C # лямбда, где вход и выход string. Попробуйте онлайн .

11 байтов благодаря трюку @Lynn.

Aloisdg говорит восстановить Монику
источник
2

Common Lisp (Lispworks), 262 байта

(defun f(s)(let((b""))(dotimes(i(length s))(if(lower-case-p(elt s i))(progn #1=(setf b(concatenate 'string b(string #2=(elt s i))))(setf b(concatenate 'string b(string(char-upcase #2#)))))(progn #1#(setf b(concatenate 'string b(string(char-downcase #2#)))))))b))

ungolfed:

(defun f (s)
  (let ((b ""))
    (dotimes (i (length s))
      (if (lower-case-p (elt s i))
          (progn
           #1=(setf b (concatenate 'string b (string #2=(elt s i))))
           (setf b (concatenate 'string b (string (char-upcase #2#)))))
        (progn
          #1#
          (setf b (concatenate 'string b (string (char-downcase #2#)))))))
    b))

Использование:

CL-USER 1 > (f "abc")
"aAbBcC"

CL-USER 2 > (f "bad")
"bBaAdD"
sadfaf
источник