ВІДТВОРЮЄТЬСЯ CaSe


42

Для сьогоднішнього виклику необхідно написати програму або функцію, яка чергує регістр рядків. Однак ви повинні ігнорувати неабетичні символи. Це означає, що кожен алфавітний символ повинен мати інший випадок, ніж попередній та наступний алфавітний символ. Це дещо складніше, ніж, наприклад, велике написання будь-якого іншого листа. Якщо ви берете такий рядок, як

hello world

та перетворивши будь-який інший символ у великі регістри, ви отримаєте:

hElLo wOrLd

Як бачите, за малим регістром oйде нижній регістр w. Це недійсне. Натомість ви повинні ігнорувати простір, даючи нам такий результат:

hElLo WoRlD

Усі не алфавітні символи повинні залишатися однаковими. Вихід може починатися з верхнього або нижнього регістру, доки він послідовно чергується. Це означає, що наступним також буде прийнятний вихід:

HeLlO wOrLd

Ваша програма повинна працювати незалежно від випадку введення.

Рядок введення завжди буде містити ASCII для друку , тому вам не доведеться турбуватися про недруковані символи, нові рядки або unicode. Подання може бути як повноцінною програмою, так і функцією, і ви можете приймати введення та вихід у будь-якому розумному форматі. Наприклад, аргументи функції / значення повернення, STDIN / STDOUT, читання / запис файлу тощо.

Приклади:

ASCII                                   ->  AsCiI
42                                      ->  42
#include <iostream>                     ->  #InClUdE <iOsTrEaM>
LEAVE_my_symbols#!#&^%_ALONE!!!         ->  lEaVe_My_SyMbOlS#!#&^%_aLoNe!!!
PPCG Rocks!!! For realz.                ->  PpCg RoCkS!!! fOr ReAlZ.
This example will start with lowercase  ->  tHiS eXaMpLe WiLl StArT wItH lOwErCaSe
This example will start with uppercase  ->  ThIs ExAmPlE wIlL sTaRt WiTh UpPeRcAsE
A1B2                                    ->  A1b2

Оскільки це , застосовуються стандартні лазівки, і найкоротша відповідь у байтах виграє!


33
Тьху, я тільки зрозумів , що це було , що мем XD
бета -

@BetaDecay Хахаха, це був не мій намір. Більш просто невдалий термін. Мені це подобається як чат-міні-виклик , і мені подобається ідея, яка стоїть за ним, тому що це тонко складніше, ніж здається.
DJMcMayhem

4
Наступний виклик - надрукувати cowsay
губку Acii

1
Палки! Я щойно написав сценарій CJam для цього (як і вчора) і видалив його.
Esolanging Fruit

2
Існує якийсь пропущений потенціал для титулу або принаймні приклади, використовуючи або пінгвін приреченості, або спорки.
Ян

Відповіді:


19

JavaScript (ES6), 66 63 байт

Починається з великої літери.

s=>s.replace(/[a-z]/gi,c=>c[`to${(s=!s)?'Low':'Upp'}erCase`]())

Тестові справи


Як саме я збирався це зробити. Я думаю, я бачу, де ви можете зберегти пару байтів, але я на своєму телефоні, тому не можу перевірити належним чином.
Кудлатий

Так, я використовую тернар - це те, що я збирався запропонувати.
Кудлатий

1
Як працює s=!sтрюк?
Kritixi Lithos

7
@KritixiLithos Оскільки sвхідна рядок !sспочатку оцінюється на false(якщо тільки вхідна рядок порожня; в такому випадку вона буде оцінена, trueале порожня рядок все одно не генеруватиме відповідності). Після цього вона просто стає стандартною булевою операцією, чергуючи між собою falseі true. Крім того, ми не проти втратити вміст sу цей момент, оскільки він уже використовувався для годування .replace().
Арнольд

3
@MayorMonty На жаль, це збігалося б із кількома символами. Не "A[I"вдалося ввести такий вхід .
Арнольд

12

05AB1E , 11 8 байт

Код:

lvyJ¤aiš

Використовує кодування 05AB1E . Спробуйте в Інтернеті!

Пояснення:

l           # Lowercase the input
 vy         # For each element..
   J        #   Join the entire stack into a single string
    ¤a      #   Check if the last character is alphabetic
      iš    #   If true, swapcase the entire string

Мені подобається, як я намагаюся пройти сліпо, знаючи, що я повинен бити 11 байт; потім повільно перейдіть від 17 до 11 байт і зрозумійте lvy¾Fš}Da½J, що саме ви вже мали ._.
Чарівна урва восьминога

1
@carusocomputing Є набагато простіше 8 байтне рішення: p
Аднан

4
о, так, супер легко ха-ха.
Чарівна урва восьминога

2
@ Octopus Є певна дискусія з цього приводу, але я використовую як "osable", так і "osabie".
Аднан

1
@octopus Я буквально кажу Oh-Five-Ay-Bee-One-Eee, що я не творча людина.
Чарівний восьминога Урна


8

Желе , 13 байт

nŒsTm2
ŒlŒuǦ

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

Як це працює

ŒlŒsǦ  Main link. Argument: s (string)

Œl      Cast to lowercase.
    Ǧ  At indices returned by the helper link...
  Œu        apply uppercase.


nŒsTm2      Helper link. Argument: s (string)

 Œs         Apply swapcase to s.
n           Perform vectorizing not-equal comparison.
   T        Compute the truthy indices.
    m2      Select every other one, starting with the first.

7

Japt , 16 14 байт

r"%l"_m"uv"gT°

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

Пояснення

r              // RegEx replace input
 "%l"          // [A-Za-z] as first arg to replace
     _         // created function Z=>Z as second arg to replace
       "uv"gT° // alternates "u" & "v"
      m        // map Z to either "u" upper or "v" lower

Дуже хороша! Ви можете видалити ,. Якщо це не число (тобто [12]), Japt знає, що вони різні предмети. Я вірю, що ви також можете видалити &1.
Олівер

Дякую @obarakon. Документація на Japt трохи розріджена.
порошків

Дякуємо, що використовуєте Japt. Не соромтеся задавати питання, пропозиції тощо в кімнаті чату Japt . Є також підказки для підказок . :)
Олівер

_m"uv"gT°Приємно. Я тільки збирався це запропонувати.
Олівер

@obarakon Так, я побачив, де ETH відповів на ваше запитання в чаті, і це змусило мене випробувати речі.
порошків

6

Python 3 , 86 76 68 66 63 байт

-2 байти завдяки DJMcMayhem
-3 байти завдяки Cyoce

x=0
for i in input():print(end=(2*i).title()[x]);x^=i.isalpha()

Спробуйте в Інтернеті! або Спробуйте всі тестові приклади


Два байти коротше в python 3: Спробуйте в Інтернеті!
DJMcMayhem

1
будь-яка причина, яку ти не можеш зробити print(end=(2*i).title()[x])?
Кіос

5

Аліса , 18 байт

/olZlYuN
@iy.u..//

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

Пояснення

Ця програма дотримується менш відомого шаблону для програм непарної довжини, які повністю працюють в порядку. Лінеаризована версія цього коду:

il.l.uN.YuZyo@

Пояснення коду:

i - push input onto stack            ["Hello world!"]
l - convert to lowercase             ["hello world!"]
. - duplicate                        ["hello world!", "hello world!"]
l - convert to lowercase (should be no-op, but avoids what seems to be a bug in the TIO implementation)
. - duplicate again                  ["hello world!", "hello world!", "hello world!"]
u - convert to uppercase             ["hello world!", "hello world!", "HELLO WORLD!"]
N - difference between sets          ["hello world!", "helloworld"]
. - duplicate reduced string         ["hello world!", "helloworld", "helloworld"]
Y - unzip (extract even positions)   ["hello world!", "helloworld", "hlool", "elwrd"]
u - convert to uppercase             ["hello world!", "helloworld", "hlool", "ELWRD"]
Z - zip evens back into string       ["hello world!", "helloworld", "hElLoWoRlD"]
y - perform substitution             ["hElLo WoRlD!"]
o - output                           []
@ - terminate

Без використання lдубліката, стек після Nбуде ["helloworld", "helloworld"]. Я сильно підозрюю, що це помилка.


5

C (tcc) , 60 57 56 байт

Завдяки DigitalTrauma за те, що помітив біт 5, є єдиною відмінністю для верхнього / нижнього регістру ASCII.

Особлива подяка zch за те, що ви пограли ще три байти.

Збережіть ще один байт від ідеї RJHunter

l;f(char*s){for(;*s=isalpha(*s)?*s&95|++l%2<<5:*s;s++);}

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


Я гольфував його трохи більше , і модифікував, щоб він працював на всіх gcc, tcc, clang. FWIW, gcc вводить рядкові літерали в пам'ять лише для читання, тому я використовував strdup()вказівники для читання-запису пам'яті в коді тестового драйвера.
Цифрова травма

1
@DigitalTrauma дякую за це. Я повинен був визнати біт 5 - це різниця між верхнім і нижнім. Приємно!
Клеблан

Я намагався зробити цю версію також рекурсивною, але не зміг її скоротити.
Цифрова травма

Ви можете замінити внутрішній умовний, *s&~32|++l%2<<5щоб зберегти 3 байти.
zch

Так як вхідні обіцяє бути для друку ASCII, ви можете замінити &~33з , &95щоб зберегти додаткові байти.
RJHunter

4

Java 8, 99 байт

a->{String r="";int i=0;for(int c:a)r+=(char)(c>64&c<91|c>96&c<123?i++%2<1?c|32:c&~32:c);return r;}

Пояснення:

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

a->{                          // Lambda with char-array parameter and String return-type
  String r="";                //  Result-String
  int i=0;                    //  Flag for alteration
  for(int c:a)                //  Loop over the characters of the input
    r+=(char)                 //   And append the result-String with the following (converted to char):
      (c>64&c<91|c>96&c<123?  //    If it's a letter:
       i++%2<1?               //     And the flag states it should be lowercase:
        (c|32)                //      Convert it to lowercase
       :                      //     Else (should be uppercase):
        (c&~32)               //      Convert it to uppercase
      :                       //    Else:
       c);                    //     Simply append the non-letter character as is
                              //  End of loop (implicit / single-line body)
  return r;                   //  Return result-String
}                             // End of method

Я не міг скоротити його, але ви можете використовувати (c+"").matches("[A-Za-z]")або Character.isLetter(c)зберігати байти.
TheLethalCoder

@TheLethalCoder І те й інше довше c>64&c<91|c>96&c<123. А оскільки я intвсе-таки використовую для деталей для гольфу Character.toUpperCase(...)та Character.toLowerCase(...)цих елементів для гольфу (ці: (char)(c&~32)і (char)(c|32)), я сумніваюся, що я міг би скоротити його з будь-якою з них.
Кевін Круїссен

1
Я подумав, що ви не зможете, але варто опублікувати повідомлення, щоб побачити, чи зможете ви ними скористатися все-таки
TheLethalCoder

@TheLethalCoder Ну добре. :) У деяких випадках перший може допомогти дещо іншим підходом до інших викликів, але для цього виклик він коротший. Все одно, дякую.
Кевін Круїссен

a->{String r="";int i=0,f=32;for(int c:a)r+=(char)(c>64&c<91|c>96&c<123?(f=~f):c);return r;} ??
Роман Ґраф

4

Рубі, 57 55 47 41 байт

Кількість байтів включає два байти для параметрів командного рядка.
Запустити його, наприклад, так:$ ruby -p0 alternate_case.rb <<< "some input"

gsub(/\p{L}/){($&.ord&95|32*$.^=1).chr}

За допомогою p0опції весь вхід витрачається за один раз, а магічний глобальний $.збільшується до 1. Це пізніше змінюється між 0 і 1 і використовується для збереження стану.

Працює з багаторядковим входом; Спробуйте в Інтернеті!

Завдяки Вентеро за чудовий вклад - перегляньте коментарі для деталей.


1
Людина, якби не той факт, що $.автоматично збільшується кожен getsвиклик, повна програма з -pпрапором була б коротшою ...
Value Ink

1
1&$.+=1дозволяє скинути дужки. І для повноти, є ще одна глобальна ціле - це , до жаль , тільки для читання тільки: $$.
Вентеро

1
Ще одна річ, що стосується прапора командного рядка: -p0змушує інтерпретатора прочитати всі наявні введення за один раз - тому ваш код викликається лише один раз, що дозволяє вам вільно користуватися $.. Поєднуючи це з тим, що gsubнеявно діє, як $_.gsub!при вказівці, -pповна програма значно скорочується: 48 символів для gsub(/[a-z]/i){[$&.upcase,$&.downcase][1&$.+=1]}та 2 для p0прапора.
Вентеро

1
Заключне зауваження, я обіцяю :) Після використання -p0ви можете фактично зберегти ще кілька символів, як перевертати $.назад і назад: Оскільки це тепер гарантовано, 1коли ви викликаєте ваш код, ви можете просто використовувати $.^=1.
Вентеро

2
Виявляється, я збрехав, у мене є ще один коментар: D Оскільки вхід гарантовано містити тільки друкований ASCII, ми можемо використовувати підтримку Ruby для категорій Unicode у регулярних виразах: /\p{L}/( Letter категорія Unicode ) на один символ коротший, ніж /[a-z|/i.
Вентеро

3

Брахілог , 25 байт

{ḷ|ụ}ᵐ.{ḷ∈Ạ&}ˢ¬{s₂{∈Ạ}ᵐ}∧

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

Це і довге, і повільне.

Пояснення

{   }ᵐ.                       The Output is the result of mapping on each char of the Input:
 ḷ                              Lowecase the char
  |                             Or
   ụ                            Uppercase the char
       {    }ˢ                In the Ouput, select the chars that:
        ḷ∈Ạ&                    when lowercased are in "abc...xyz" (ie are letters)
              ¬{       }∧     In that new string, it is impossible to find:
                s₂              a substring of 2 consecutive chars
                  {∈Ạ}ᵐ         where both of them are in the lowercase alphabet

3

MATL , 16 15 байт

Xktkyy-f2L))5M(

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

Розглянемо вхід "привіт світ"

Xk    % To upper case
      % STACK: 'HELLO WORLD'
t     % Duplicate top element
      % STACK: 'HELLO WORLD', 'HELLO WORLD'
k     % To lower case
      % STACK: 'HELLO WORLD', 'hello word'
yy    % Duplicate top two elements
      % STACK: 'HELLO WORLD', 'hello word', 'HELLO WORLD', 'hello word'
-     % Difference (of code points; element-wise)
      % STACK: 'HELLO WORLD', 'hello word', [-32 -32 -32 -32 -32 0 -32 -32 -32 -32 -32]
f     % Indices of nonzeros
      % STACK: 'HELLO WORLD', 'hello word', [1 2 3 4 5 7 8 9 10 11]
2L)   % Keep only even-indexed values (*)
      % STACK: 'HELLO WORLD', 'hello word', [2 4 7 9 11]
)     % Reference indexing (get values at indices)
      % STACK: 'HELLO WORLD', 'elwrd'
5M    % Push (*) again
      % STACK: 'HELLO WORLD', 'elwrd', [2 4 7 9 11]
(     % Assignment indexing (write values at indices). Implicit display
      % STACK: 'HeLlO wOrLd

'


3

Perl 6 ,  32  30 байт

{S:g/<:L><-:L>*<:L>?/$/.tclc()/}

Спробуй це

{S:g{<:L><-:L>*<:L>?}=$/.tclc}

Спробуй це

Розширено:

{  # bare block lambda with implicit parameter 「$_」

  S            # string replace (not in-place) implicitly against 「$_」

  :global

  {

    <+ :L >    # a letter
    <- :L >*   # any number of non-letters
    <+ :L >?   # an optional letter

  }

  =

  $/.tclc()    # uppercase the first letter, lowercase everything else
}

3

q / kdb +, 51 42 38 байт

Рішення:

{@[x;;upper]1#'2 cut(&)x in .Q.a}lower

Приклад:

q){@[x;;upper]1#'2 cut(&)x in .Q.a}lower"hello world"
"HeLlO wOrLd"

Примітки:

.Q.a        // abcde...xyz lowercase alphabet
(&) x in    // where, returns indices for where x (hello world) is an alpha
2 cut       // splits list into 2-item lists
1#'         // takes first item of each 2-item list; ie the indices to uppercase
@[x;;upper] // apply (@) upper to x at these indices

2

V , 17 , 13 байт

VUÍშáü$©/ì&

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

Або Перевірте всі тестові випадки!

HeXdUmP:

00000000: 5655 cde1 83a8 e1fc 24a9 2fec 26         VU......$./.&

Пояснення:

Для цього використовується стислий регекс ™ ️, тому перед тим, як пояснити це, давайте розширимо регулярний вираз:

:%s/\v\a.{-}(\a|$)/\l&

VUНовонавернені все в верхній регістр. Потім ми запускаємо це:

:%                      " On every line:
  s/\v                  "   Substitute:
      \a                "     A letter
        .{-}            "     Followed by as few characters as possible
            (\a|$)      "     Followed by either another letter or an EOL
                  /     "   With:
                   \l   "     The next character is lowercased
                     &  "     The whole text we matched

Стара / більш цікава відповідь:

:se nows
Vuò~h2/á


2

CJam , 26 24 байти

qeu{_'[,65>&,T^:T{el}&}%

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

Пояснення

q         e# Read all input.
eu        e# Uppercase it.
{         e# For each character:
 _        e#  Duplicate it.
 '[,65>&  e#  Set intersection with the uppercase alphabet.
 ,        e#  Length (either 0 or 1 in this case).
 T^:T     e#  XOR with T (T is initially 0), then store the result back in T.
 {el}&    e#  If The result of the XOR is true, lowercase the character.
}%        e# (end for)

2

Pyth, 11 байт

srR~xZ}dGrZ

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

Пояснення

              # Z = 0; Q = eval(input())
srR~xZ}dGrZQ  # Auto-fill variables
         rZQ  # lowercase the input
 rR           # Apply the r function to each letter of the input with
   ~xZ}dG     # ... this as the other argument
   ~          # use the old value of the variable Z, then update it with the value of ...
    xZ        # Z xor ...
      }dG     # the variable d is a lowercase letter
              # because of how mapping works in pyth, d will contain the current letter
              # This causes Z to flip between 0 and 1, alternately upper and lower casing
              # the current character if it is a letter

2

PowerShell, 86 байт

-join($args[0]|%{if($_-match"[a-z]"-and($i=!$i)){"$_".toupper()}else{"$_".tolower()}})

Вхід - це [char[]]масив.

Коментарі в коді для пояснення

# Join the array of string and char back together.
-join
    # Take the first argument and pass each element ([char]) down the pipe. 
    ($args[0]|%{
        # Check if this is a letter. Second condition is a boolean that changes at every pass 
        # but only if the current element is a letter. If not the condition never fires
        if($_-match"[a-z]"-and($i=!$i)){
            # Change the character to uppercase
            "$_".toupper()
        }else{
            # Output the character to lowercase. 
            # Special characters are not affected by this method
            "$_".tolower()
        }
    })

2

Haskell, 105 83 + 2 4 + 1 байт роздільника = 108 86 88 байт

import Data.Char
f#(x:y)|isLetter x=([toUpper,toLower]!!f)x:(1-f)#y|1>0=x:f#y
_#l=l

Функція (1#), починається з малих літер Спробуйте в Інтернеті!

Сумно в тому, що це довше, ніж відповіді Java та C # Завдяки Ørjan Johansen за збереження 22 байтів, об'єднавши три рядки в одну!


2
Я бачив, що потрібні ті довгі імпортні функції, тому я навіть не пробував ... але це трохи, ви можете об'єднати деякі рядки:f#(x:y)|isLetter x=([toUpper,toLower]!!f)x:(1-f)#y|1>0=x:f#y
Ørjan Johansen

Вибачте за нітрошинг, але я думаю, що 1#це не вважається анонімною функцією. На моє розуміння, людина повинна мати можливість прив’язати анонімну функцію до ідентифікатора, але, наприклад f=1#, не вийде. Натомість вам потрібен розділ (1#)на +2 байти. Це також неявно зазначено в наших керівництвах громади щодо гольфу в Хаскеллі , хоча, можливо, вони повинні бути адаптовані так, щоб явно згадувати цей випадок.
Лайконі

@Laikoni ок, відповідь оновлена
Загальне відображуване ім’я

2

Google Таблиці, 264 байти

=ArrayFormula(JOIN("",IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Za-z]"),CHAR(CODE(UPPER(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)))+MOD(LEN(REGEXREPLACE(LEFT(A1,ROW(OFFSET(A1,0,0,LEN(A1)))),"[^A-Za-z]","")),2)*32),MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1))))

Це великий безлад, але трохи легше, якщо розширити його:

=ArrayFormula(
  JOIN(
    "",
    IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Za-z]"),
      CHAR(
        CODE(UPPER(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)))
        +
        MOD(LEN(REGEXREPLACE(LEFT(A1,ROW(OFFSET(A1,0,0,LEN(A1)))),"[^A-Za-z]","")),2)*32
      ),
      MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1)
    )
  )
) 

Псевдо-логіка працюватиме так:

For each character {                                    // ArrayFormula()
  If (character is a letter) {                          // REGEXMATCH(MID())
    Return CHAR(                                        // CHAR()
      CODE(UPPER(letter))                               // CODE(UPPER(MID()))
      +
      If (nth letter found and n is odd) {32} else {0}  // MOD(LEN(REGEXREPLACE(LEFT())))
    )
  } else {
    Return character                                    // MID()
  }
}

2

Perl 5 , 24 байти

23 байти + 1 байт для -p.

Завдяки @Dada за -2 байти.

s/\pl/--$|?uc$&:lc$&/eg

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


Акуратний. \plзамість [a-z]2 байта Тхо :)
Дада

@Dada, я справді цього не знав! Як я не знав цього !! Дякую!
Дом Гастінгс

Я думаю, що я дізнався це з Тона Євангелія, і використовую його час від часу (насправді я, як правило, занадто часто забуваю про це і використовую [a-z]замість цього!). Якщо вам цікаво, це походить від perlrecharclass ;)
Дада


1

C 64 байт

B;R(char *s){for(;*s=isalpha(*s)?(B=!B)?*s|=32:*s&=~32:*s;s++);}

Скористається кодуванням ascii, де великі та малі літери зміщені на 0x20.


Вам не потрібен простір '' між charта*s
cleblanc

Це виглядає дуже схожий на @ cleblanc в відповідь .
Цифрова травма

Я опублікував це, коли публікація @ cleblanc використовувала toUpper () та toLower ().
user230118

1
Мій коментар, який передбачає такий підхід, був о 18: 29: 34Z. Клебланк змінив цю інформацію, щоб включити це було о 18: 37: 36З. Ваша відповідь була опублікована о 18: 38: 21З. Тож я думаю, що відповідь Клебланка була менше ніж за хвилину до вашого допису. Ваша відповідь надзвичайно схожа на мою пропозицію, але я гадаю, що в цьому полягає природа коду-гольфу - часто рішення на одній мові зійдуться на одне й те саме - тому я дозволю їй ковзати :)
Digital Trauma

1

Сітківка , 32 байти

T`l`L
01T`L`l`[A-Z][^A-Z]*[A-Z]?

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

Спочатку перетворює вхід у великі регістри, а потім групує введення у відповідність, що містить до двох великих літер. Єдиний раз, коли він буде містити лише одну букву, якщо останній лист не має пари. Тоді він пише малі літери першої літери кожного з цих матчів.

На 01другому етапі грубо перекладається: не змінювати поведінку цього етапу на основі номера матчу, а лише застосовувати зміни до першого символу кожного матчу.



1

C #, 100 байт

s=>{var r="";int m=0;foreach(var c in s)r+=char.IsLetter(c)?(char)(++m%2>0?c|32:c&~32):c;return r;};



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