Зворотний рядок, зберігаючи великі літери в тих же місцях


28

Мета полягає в тому, щоб просто обернути рядок одним витком:
Тримайте великі літери в тих же місцях.

Приклад Введення 1: Hello, Midnightas
Приклад Вихід 1:SathginDim ,olleh

Приклад вводу 2: .Q
Приклад виходу 2:q.

Правила :

  • Вихід до STDOUT, вхід від STDIN
  • Переможець буде обраний 13 липня GMT + 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

Пітон, 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]))на три байти коротше
Arfie

1
@Ruud Дякую! Переміщення виклику функції за межі вибору списку заощаджує ще 2!
Мего

2
(z*2).title()[c.isupper()-1]повинен працювати.
FryAmTheEggman

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

Це не отримує вхід від stdin або вихід для stdout ...
ArtOfWarfare

13

Python 2, 73 байти

Оскільки правила вказують вхід є ascii:

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!rId0це 11, але я думаю, що можливо, можна скоротити цю карту ...
FryAmTheEggman

@FryAmTheEggman Видаліть dбайт і ви зберегли його.
Leaky Nun

srV_Qm!/Gслід зберегти байт
Leaky Nun

8

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

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

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

Редагувати. Збережено величезні 12 байт завдяки @ edc65.


s => r = [... l = s.toLowerCase ()]. ​​зворотний (). map ((c, i) => s [i]! = l [i]? c.toUpperCase (): c) .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 байт

Дякуємо Еміньї за збереження 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


Ви не можете використати кодові точки, щоб скоротити його?
Leaky Nun

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

Гольф:

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

Безумовно

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(#)що зберігає пару байтів :)
Flonk

Друга лінія може бути крапка , вільної , bяк f a|isUpper a=toUpper|1>0=toLower, хоча це суперечить поліпшенню Flonk в.
xnor

Ви можете використовувати версію XNOR по fі переписати Flonk - х kдо zipWith f<*>reverse.
nimi

Вам не потрібно усунути параметр 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

Блискуче! Ми можемо зробити це ще коротше, використовуючи діапазон замість -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]})
TessellingHeckler

Людина, я відчуваю, що я пропустив безліч хитрощів, ніколи раніше не кодував гольф. Це майже як навчання кодувати знову!
ThePoShWolf

2

Діалог APL , 12 байт

⌽f¨⍨⊢≠f←819⌶

819⌶ - це функція складання корпусу

f←оскільки його назва довга, ми присвоюємо її f

⊢≠f Булевий, де текст відрізняється від нижнього регістра

f¨⍨ використовуйте це (1 означає великі регістри, 0 означає малі літери) для складання кожної літери ...

... переверненого тексту

Обробляє non-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якби нам не потрібно було читати зі stdin чи писати до stdout, але добре, що ...

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
Я не прихильник, але якщо ви використовуєте зовнішню бібліотеку, принаймні вкажіть ім’я у своїй відповіді, а для малозрозумілої бібліотеки вкажіть, будь ласка, посилання на сховище.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1

Sed, 113 + 1 = 114 байт

Чому? Тому що цікаво використовувати неправильний інструмент для виконання справ: P

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

Гольф:

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

Безголівки:

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 .

Невикористані та тестові справи:

Спробуйте тут.

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[].
Leaky Nun

@LeakyNun Насправді я (вірю) не можу в меншій кількості байтів. Це дозволило б видалити String a="";та змінити o+=на 0[i]=збереження байтів, але Java не має символів .toUpperCase()/ .toLowerCase()методів, а для перетворення з char в String використовується верхній / нижній метод, а потім знову до char знову знадобиться (набагато) більше байт Але не соромтеся розщедрити пов'язаний ідеон і придумати щось, щоб зробити char[]роботу меншою кількістю байтів.
Kevin Cruijssen

1
180 байт, які можна подати в гольф (не змінюючи його на місці).
Leaky Nun

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;
}

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

Оскільки це код-гольф, будь-ласка, введіть кількість байтів, яка коштувала б ця програма.

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