Переверните строку, сохранив заглавные буквы в тех же местах


28

Цель здесь состоит в том, чтобы просто перевернуть строку одним поворотом:
сохранить заглавные буквы в тех же местах.

Пример ввода 1: Hello, Midnightas
Пример вывода 1:SathginDim ,olleh

Пример ввода 2: .Q
примерный вывод 2:q.

Правила :

  • Вывод в STDOUT, ввод из STDIN
  • Победитель будет выбран 13 июля по Гринвичу + 3 12:00 (одна неделя)
  • Входные данные могут состоять только из символов ASCII, что облегчает работу программ, не использующих какую-либо кодировку, содержащую символы, отличные от ASCII.
  • Любая пунктуация, заканчивающаяся в позиции, где была заглавная буква, должна игнорироваться

Это с надписью или без нее? Это с или без строки?

«Любая пунктуация, заканчивающаяся в позиции, где была заглавная буква, должна игнорироваться». разве второй пример не противоречит этому правилу?
Стефано Санфилиппо

Это согласуется с правилом, поскольку знаки препинания не имеют заглавных букв.

Ответы:


7

TCC - 4 байта

<>ci

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

Объяснение:

     - output is implicit in TCC
<>   - reverse string
  c  - preserve capitalization
   i - get input

9
Это работало с версией tcc.luaдо того, как проблема была опубликована? Учитывая, что вы недавно добавили команды для решения трех других задач, я предполагаю, что это не так. Если для вашего ответа требуется версия языка, который задним числом задал вопрос, вы должны пометить его как неконкурентный в заголовке. Я уберу свое понижение, когда вы добавите метку или предоставите подтверждение того, что ваш код работал в более ранней версии.
Деннис

16

Python, 71 байт

lambda s:''.join((z*2).title()[c.isupper()-1]for c,z in zip(s,s[::-1]))

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

-3 байта от Рууда, плюс вдохновение для еще 2.

Еще 4 байта от FryAmTheEggman


lambda s:''.join([z.lower(),z.upper()][c.isupper()]for c,z in zip(s,s[::-1]))на три байта короче
Арфи

1
@ Рууд Спасибо! Перемещение вызова функции за пределы списка выбора экономит еще 2!
Мего

2
(z*2).title()[c.isupper()-1]должно сработать.
FryAmTheEggman

6
Вы можете выиграть еще один байт ~c.isupper()вместоc.isupper()-1
Lulhum

Это не получает ввод от stdin или вывод на stdout ...
ArtOfWarfare

13

Python 2, 73 байта

Так как в правилах указан ввод данных:

lambda s:''.join([z.lower,z.upper]['@'<c<'[']()for c,z in zip(s,s[::-1]))

Хотя вся заслуга принадлежит @Mego, но у меня не было репутации, чтобы просто комментировать его ответ.


Можете ли вы использовать значения ascii '@' и '[', чтобы получить 2 байта?
Aloisdg говорит восстановить Монику

К сожалению, нет, я должен был бы использовать ord (c), сравнение целых чисел и строк не очень хорошо справляется с Python
Lulhum

Почти то, что я получил, но ты был первым +1
orlp

13

Perl, 31 + 2 (-lp ) = 33 байта

Это решение от @Ton Hospel (на 13 байт меньше, чем у меня).

s%.%(lc$&gt$&?u:l)."c chop"%eeg

Но вам нужно lи pвключается. Чтобы запустить это:

perl -lpe 's%.%(lc$&gt$&?u:l)."c chop"%eeg'

5
Здравствуйте и добро пожаловать в PPCG! Это здорово!
NoOneIsHere

Очень мило на самом деле! Я никогда не использовал -aавтосплит, я чувствую, что мог бы использовать это много раз в прошлом! Я должен помнить это! Я думаю, что вы можете сохранить другой байт, используя map...,...вместо того, map{...}...как у вас $Fв начале, хотя! :)
Дом Гастингс

Сокращенный код (31 + 2 байта):perl -lpe 's%.%(lc$&gt$&?u:l)."c chop"%eeg
Тон Хоспел

Обратите внимание, что -aподразумевается-F
Тон Хоспел

@TonHospel Ничего себе, большое спасибо и хорошо сделано, это довольно хороший код! Что -a-n) подразумевается -F, я читал это некоторое время назад на perlrun, попробовал это, но это не сработало; но я попробовал это снова сейчас, и это прекрасно работает, поэтому я предполагаю, что тогда я сделал что-то не так. Спасибо.
Дада

9

Pyth, 13 11 10 9 байт

Спасибо @FryAmTheEggman за напоминание Vи @LeakyNun за еще один байт.

srV_Qm!/G

Попробуйте онлайн! теперь на мобильном телефоне, немного обновив ссылку


srV_Qm!rId011, но я думаю, что можно сократить эту карту ...
FryAmTheEggman

@FryAmTheEggman Удалите dи вы сохранили байт.
Утренняя монахиня

srV_Qm!/Gдолжен сохранить байт
Leaky Nun

8

Python, 66 байт

f=lambda s,i=0:s[i:]and(s[~i]*2).title()[~('@'<s[i]<'[')]+f(s,i+1)

Рекурсирует по индексам i, беря персонажа s[~i]со спины, а корпус s[i]с фронта. Быть капиталом проверяется как лежащий в непрерывном диапазоне @ABC...XYZ[. Кредит FryAmTheEggman от (_*2).title()хитрости.


5

Retina , 75 67 65 байт

Количество байтов предполагает кодировку ISO 8859-1.

$
±·$`
O$^`\G[^·]

s{T`L`l`±.
T01`l`L`±.*·[A-Z]
±·

±(.)
$1±
·.
·

Попробуйте онлайн! (Первая строка включает набор тестов с несколькими разделенными переводом строк.)


5

JavaScript (ES6), 95 83 байта

s=>[...t=s.toLowerCase()].reverse().map((c,i)=>s[i]==t[i]?c:c.toUpperCase()).join``

Редактировать: благодаря @ edc65 сохранены огромные 12 байтов.


.. s => г = [... л = s.toLowerCase ()] обратное () карта ((с, я) => s [I] = L [I] c.toUpperCase (!):? с) .join`` -10
edc65

@ edc65 Спасибо! (Примечание: в r=этом нет необходимости.)
Нил

5

Пайк, 11 10 9 байт

_FQo@UhAl

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

_         -   reversed(input)
 F        -  for i in ^
   o      -      o+=1
  Q @     -     input[^]
     Uh   -    ^.is_upper()+1
       Al -   [len, str.lower, str.upper, ...][^](i)
          - "".join(^)

Сначала он дал мне ошибку, а затем и правильный ответ. i.imgur.com/uTcH27F.png

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

Ага окей Извините, я не очень хорошо с

Может быть потому, что я единственный парень, который его использует
Blue

4

05AB1E , 19 16 15 13 байт

Спасибо Emigna за сохранение 3 байта!

Наверное, меня побьет Желе ... Код:

Âuvy¹Nè.lil}?

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


S.l_v¹lRNèyiu}?на 1 байт короче
Emigna

@ Emigna Ух ты, спасибо! Это очень умно.
Аднан

Âuvy¹Nè.lilë}?14 лет. Просто рад, что могу помочь тебе на этот раз :)
Emigna

@ Emigna Это удивительно! Очень приятно использовать бифуркат :).
Аднан

Ruvy¹Nè.lil}?на самом деле. Я не использовал раздвоение и забыл удалить остальное. Итак, 13.
Эминья,


3

J , 30 байт

(={"_1 toupper@]|.@,.])tolower

Не поддерживает не ASCII


"toupper" "tolower" вы не можете использовать кодовые точки, чтобы сократить его?
Утренняя монахиня

@LeakyNun Может быть, но я не могу сказать наверняка
мили

3

Брахилог , 28 байт

@lr:?z:1ac.
h@u.,@A@um~t?|h.

объяснение

  • Главный предикат:

    @lr                 Reverse the lowercase version of the Input
       :?z              Zip that reversed string with the Input
          :1a           Apply predicate 1 to each couple [char i of reverse, char i of Input]
             c.         Output is the concatenation of the result
    
  • Предикат 1:

    h@u.,               Output is the uppercase version of the first char of Input
         @A@um~t?       The second char of Input is an uppercase letter
                 |      Or
                  h.    Output is the first char of Input
    

3

TSQL, 175 байт

Golfed:

DECLARE @ varchar(99)='Hello, Midnightas'

,@o varchar(99)='',@i INT=0WHILE @i<LEN(@)SELECT
@i+=1,@o+=IIF(ascii(x)=ascii(lower(x)),lower(y),upper(y))FROM(SELECT
SUBSTRING(@,@i+1,1)x,SUBSTRING(@,len(@)-@i,1)y)z
PRINT @o

Ungolfed

DECLARE @ varchar(99)='Hello, Midnightas'

,@o varchar(99)=''
,@i INT=0

WHILE @i<LEN(@)
  SELECT @i+=1,@o+=IIF(ascii(x)=ascii(lower(x)),lower(y),upper(y))
  FROM
    (SELECT SUBSTRING(@,@i+1,1)x,SUBSTRING(@,len(@)-@i,1)y)z

PRINT @o

скрипка


жесткое кодирование ввода?
кот

@cat это единственный способ. В SQL нет STDIN или ввода команды. Если вы посмотрите на stackoverflow, именно так решаются все вопросы - вы также можете посмотреть мои другие ответы на codegolf
t-clausen.dk

О, да, я точно помню этот разговор с пользователем SQL раньше (возможно, вы). Это странно, но должно быть хорошо.
кот

1
@cat У нас не было этого разговора раньше, но вы помогли мне с подсчетом байтов ранее
t-clausen.dk

3

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

;`úíuY"ùû"E£`M@ùRZ`i@ƒ`MΣ

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

Объяснение:

;`úíuY"ùû"E£`M@ùRZ`i@ƒ`MΣ
;                          create a copy of the input
 `úíuY"ùû"E£`M             for each character in input:
  úíuY                       0-based index in lowercase English letters, or -1 if not found, increment, boolean negate (1 if uppercase else 0)
      "ùû"E£                 `û` if the character is lowercase else `ù` (str.lower vs str.upper)
              @ùRZ         make the other copy of the input lowercase, reverse it, and zip it with the map result
                  `i@ƒ`M   for each (string, function) pair:
                   i@ƒ       flatten, swap, apply (apply the function to the string)
                        Σ  concatenate the strings

3

Haskell, 83 80 75 71 байт

Самый простой способ, который я мог придумать.

import Data.Char
f a|isUpper a=toUpper|1>0=toLower
zipWith f<*>reverse

Если поменять параметры (#), kможно переписать в k=reverse>>=zipWith(#)
бессмысленном

Вторая строка может быть бессмысленной, bпоскольку f a|isUpper a=toUpper|1>0=toLowerэто противоречит улучшению Flonk.
xnor

Вы можете использовать версию XNOR по fи переписать Flonk - х kк zipWith f<*>reverse.
Ними

Вам не нужно исключать параметр s?
Линн

Да, и вы также можете сократить k=.
xnor

3

PowerShell, 154 , 152 , 99 , 86 байт

Спасибо @TimmyD за то, что спасли мне колоссальные 47 байт (я также сохранил дополнительные 6)

Спасибо @TessellatingHeckler за сохранение дополнительных 13 байтов.

Последний:

param($a)-join($a[$a.length..0]|%{("$_".ToLower(),"$_".ToUpper())[$a[$i++]-in65..90]})

Оригинал:

param($a);$x=0;(($a[-1..-$a.length])|%{$_=$_.tostring().tolower();if([regex]::matches($a,"[A-Z]").index-contains$x){$_.toupper()}else{$_};$x++})-join''

Нормальное форматирование:

Последний (выглядит лучше, как две строки на мой взгляд):

param($a)
-join($a[$a.length..0] | %{("$_".ToLower(), "$_".ToUpper())[$a[$i++] -in 65..90]})

Объяснение:

param($a)-join($a[$a.length..0]|%{("$_".ToLower(),"$_".ToUpper())[$a[$i++]-in65..90]})
param($a)
# Sets the first passed parameter to variable $a
         -join(                                                                      )
# Converts a char array to a string
               $a[$a.length..0]
# Reverses $a as a char array
                               |%{                                                  }
# Shorthand pipe to foreach loop
                                  ("$_".ToLower(),"$_".ToUpper())
# Creates an array of the looped char in lower and upper cases
                                                                 [$a[$i++]-in65..90]
# Resolves to 1 if the current index of $a is upper, which would output "$_".ToUpper() which is index 1 of the previous array

Оригинал:

param($a)
$x = 0
(($a[-1..-$a.length]) | %{
    $_ = $_.tostring().tolower()
    if([regex]::matches($a,"[A-Z]").index -contains $x){
            $_.toupper()
        }else{
            $_
        }
        $x++
    }
) -join ''

Первый постер здесь был мотивирован, потому что я редко вижу PowerShell, но на 154 152 байта на этом ... Я понимаю почему! Любые предложения приветствуются.

Я понял, что должен полностью изменить свое мышление, чтобы играть в гольф в коде и это было весело!


Здравствуйте и добро пожаловать в PPCG! Это здорово!
NoOneIsHere

Добро пожаловать в PPCG! Приятно видеть здесь еще одного пользователя PowerShell. Вы можете вырезать совсем немного, заменив их на .tostring()кавычки и используя целочисленные манипуляции ASCII вместо регулярных выражений. Попробуйте следующее, для 105 байтов - param($a)-join($a[$a.length..0]|%{if(($x=$a[$i++])-le90-and$x-ge65){"$_".ToUpper()}else{"$_".ToLower()}}).
AdmBorkBork

Brilliant! Мы можем сделать это еще короче, используя диапазон вместо -le и -ge:param($a)-join($a[$a.length..0]|%{if(65..90-contains$a[$i++]){"$_".ToUpper()}else{"$_".ToLower()}})
ThePoShWolf

X-inYкороче Y-containsX, и вы можете поменять его ifна ложный троичный оператор, чтобы получить 86 байт -param($a)-join($a[$a.length..0]|%{("$_".ToLower(),"$_".ToUpper())[$a[$i++]-in65..90]})
TessellatingHeckler

Чувак, я чувствую, что пропустил множество трюков, никогда не занимаясь гольфом раньше. Это почти как учиться кодировать заново!
ThePoShWolf

2

Дьялог АПЛ , 12 байт

⌽f¨⍨⊢≠f←819⌶

819⌶ это функция складывания корпуса

f←потому что его имя давно, мы относим его к е

⊢≠f Булево, где текст отличается от текста в нижнем регистре

f¨⍨ используйте это (1 означает верхний регистр, 0 означает нижний регистр), чтобы сложить каждую букву ...

... обратного текста

Обрабатывает не ASCII в соответствии с правилами Консорциума Unicode.



2

Ракетка, 146 байтов

(λ(s)(build-string(string-length s)(λ(n)((if(char-upper-case?(string-ref s n))char-upcase char-downcase)(list-ref(reverse(string->list s))n)))))

Ракетка плоха во всей этой игре в гольф.

Пожав плечами, как всегда, любая помощь с сокращением это будет высоко ценится.



2

Джольф, 21 байт

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

Μid?&γ._pXiS=pxHHpxγγ

объяснение

Μid?&γ._pXiS=pxHHpxγγ
Μid                   (Μ)ap (i)nput with (d)is fucntion:
   ?        =pxHH     (H is current element) if H = lowercase(H)
    &γ._pXiS          and set γ to the uppercase entity in the reversed string
                 pxγ  lowercase γ
                    γ else, return γ

(d)is function... жертвовать орфографией ради гольфа!
Стивен Х.


2

C #, 86 85 байт

s=>string.Concat(s.Reverse().Select((c,i)=>s[i]>96?char.ToLower(c):char.ToUpper(c)));

AC # лямбда, где входом и выходом является строка. Вы можете попробовать это на .NetFiddle .


Я изо всех сил пытаюсь понять, почему я не могу достичь, чтобы преобразовать char.ToLower(c)в c+32. Я надеюсь это исправить!

12 байтов сохранено благодаря @PeterTaylor ( c|32чтобы добавить 32 к значению ascii cи c&~32вычесть 32). Результат будет 72 байта (но может не сработать на не альфа-символе).

s=>string.Join("",s.Reverse().Select((c,i)=>(char)(s[i]>96?c|32:c&~32)));

1
Это было бы c|32вместо c+32, но это не будет работать с не-альфа-символами.
Питер Тейлор

@PeterTaylor Отлично работает! Спасибо!
Aloisdg говорит восстановить Монику

1

PHP, 128 байт

$s=$argv[1];$l=strrev($s);for($i=0;$i<strlen($s);++$i){echo(strtolower($s[$i])!==$s[$i]?strtoupper($l[$i]):strtolower($l[$i]));}

Я могу попытаться оптимизировать это дальше, но я просто оставлю это как есть на данный момент.


1

Октава, 51 50 байт

@(s)merge(isupper(s),b=flip(toupper(s)),tolower(b))

@(s)merge(s>64&s<91,b=flip(toupper(s)),tolower(b))

1

VIM, 46 байт

Было бы три байта, g~Gесли бы нам не нужно было читать со стандартного ввода или писать в стандартный вывод, ну да ладно ...

vim -es '+normal! g~G' '+%print|q!' /dev/stdin

Чтобы проверить это, запустите

echo "testString" | vim -es '+normal! g~G' '+%print|q!' /dev/stdin

Это моя первая заявка здесь, я не уверен, является ли такая заявка приемлемой.


Хорошо, я люблю играть в гольф в VIM! Однако эта программа на самом деле не переворачивает строку, она просто переключает использование заглавных букв. Вы можете перевернуть строку с помощью, :se ri<cr>C<C-r>"но тогда вам придется выяснить, как использовать заглавные буквы.
DJMcMayhem

@DrGreenEggsandIronMan Ой человек, я полностью пропустил это! Вернуться к доске для рисования!
DoYouEvenCodeBro

1

Javascript (с использованием внешней библиотеки) (224 байта)

(s)=>{t=_.From(s);var cnt=t.Count();var caps=t.Select(x=>{return x.toUpperCase()===x&&x.toLowerCase()!==x}).ToArray(),i=-1;return t.AggregateRight((a,b)=>{i++;var c=caps[i];return c?a+b.toUpperCase():a+b.toLowerCase()},"");}

Отказ от ответственности: Использование библиотеки, которую я написал, чтобы привести LINQ C # в Javascript

Изображение 1


Вызов человека, который проголосовал против этого без объяснения причин. Есть причина для этого?
applejacks01

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

1
Я не downvoter, но если вы используете внешнюю библиотеку, хотя бы упомяните имя в своем ответе, а для неясной библиотеки, пожалуйста, предоставьте ссылку на хранилище.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1

Sed, 113 + 1 = 114 байт

Зачем? Потому что забавно использовать не тот инструмент, чтобы делать что-то: P

Использование: Запустите sed -rf file, введите текст и нажмите Ctrl+ D(отправить EOF).

Golfed:

s/[A-Z]/\a\l&/g;s/^.*$/\f&\v/;:x;s/\f\a/\a\f/;s/\a\v/\v\a/;s/\f(.)(.*)(.)\v/\3\f\2\v\1/;tx;s/\f|\v//g;s/\a./\U&/g

Ungolfed:

s/[A-Z]/\a\l&/g #Prepend all upper-case letters with a 
                #BEL ASCII character and make them lowercase
s/^.*$/\f&\v/   #Wrap text between a from feed (\f) and a vertical tab (\v)
                #These are used as markers

:x #Define a label named x

s/\f\a/\a\f/;s/\a\v/\v\a/ #Move BEL characters outside of the boundary, so they're not moved later
s/\f(.)(.*)(.)\v/\3\2\1/  #This part does the switching itself
                          #It grabs a character preceded by a form feed and another 
                          #one followed by a vertical tab and swaps them, while keeping the text in-between
                          #and replaces the marker \f and \v

tx             #Conditional jump (t) to label x
               #Jumps to the label x if the last substitution (s command) was successful 
s/\f|\v//g     #Delete markers
s/\a(.)/\u\1/g #Make letters preceded by a BEL upper-case

1

Java 7, 221 217 180 байт

void c(char[]s){int x=0,y=s.length-1;for(char t;x<y;s[x]=s(t,s[y]),s[y]=s(s[y],t),x++,y--)t=s[x];}char s(char a,char b){return(char)(64<a&a<91?96<b&b<123?b-32:b:64<b&b<91?b+32:b);}

Множество байтов сохранено благодаря подходу @LeakuNun .

Ungolfed и тестовые случаи:

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

class Main{
  void c(char[] s){
    int x = 0,
        y = s.length-1;
    for(char t; x < y; s[x] = s(t, s[y]),
                       s[y] = s(s[y], t),
                       x++,
                       y--){
       t = s[x];
    }
  }

  char s(char a, char b){
    return (char)(64 < a & a < 91
                    ? 96 < b & b < 123
                        ? b-32
                        : b
                    : 64 < b & b < 91
                        ? b+32
                        : b);
  }

  public static void main(String[] a){
    print("Hello, Midnightas");
    print("TEST");
    print("test");
    print("Test");
    print(".,..,,!@");
    print("ABCDefgHijklMNOPqrsTuVWxyz");
    print("AbCdEfGHIJKlmnop123");
  }

  static void print(String s){
    char[] t = s.toCharArray();
    c(t);
    System.out.println(t);
  }
}

Выход:

SathginDim ,olleh
q.
TSET
tset
Tset
@!,,..,.
ZYXWvutSrqpoNMLKjihGfEDcba
321pOnMLKJIhgfedcba

Вы можете вводить и выводить char[].
Дрянная Монахиня

@LeakyNun На самом деле я (кажется, я) не могу в меньшем количестве байтов. Это позволило бы удалить String a="";и изменить o+=на, 0[i]=чтобы сохранить байты, но Java не имеет символа .toUpperCase()/ .toLowerCase()метода, и преобразование из char в String, использование метода upper / lower, а затем снова в char потребует (намного) больше байт. Но не стесняйтесь раскошелиться на связанный ideone и придумать что-нибудь, чтобы заставить char[]работать меньше байтов.
Кевин Круйссен

1
180 байтов, которые можно использовать в дальнейшем (не изменяя его на месте).
Утренняя монахиня

0

С

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
  char *a,*b,*c;

  a=c=strdup(argv[1]);
  b=&argv[1][strlen(a)-1];
  for(;*a;a++,b--){
    *a=(*a>='A'&&*a<='Z')?((*b>='a'&&*b<='z')?*b-32:*b):((*b>='A'&&*b<='Z')?*b+32:*b);
  }
  puts(c);
  free(c);
  return 0;
}

Ввод должен быть взят из стандартного ввода.
Анмол Сингх Джагги

Поскольку это код-гольф, укажите количество байтов, которое обойдется этой программе.

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