Проблема ogl-edocf


22

Вхідні дані

Непорожня перетасована рядок, що складається з символів ASCII в діапазоні .[32..126]

Вихідні дані

Вихід отримується шляхом застосування послідовних обертів до вхідного рядка.

Для кожної літери ( [a-zA-Z]) у вхідному рядку, що йде зліва направо:

  • якщо літеру у верхньому регістрі оберніть усі символи перед ним на одне положення ліворуч
  • якщо лист є малим, оберніть усі символи перед ним на одну позицію праворуч

Приклад

Вхід: "Cb-Ad"

  • Перша літера - це " С ". Ми повинні зробити обертання вліво, але перед цим " С " немає жодного символу . Отже, нема чого обертатись.
  • Наступна літера - це " б ". Обертаємо " С " праворуч. Оскільки це єдиний персонаж, він залишається незмінним.
  • Символ " - " не запускає жодного обертання, оскільки це не літера.
  • Наступний лист - це " А ". Ми обертаємо " Cb- " вліво, що дає " bC Ad"
  • Четверта і остання літера - це " d ". Ми обертаємо " b-CA " праворуч, що дає " Ab-C d"

Тому очікуваний вихід " Ab-Cd ".

Правила

  • Ви можете приймати дані як рядок або як масив символів - що може бути, а може бути і не тим самим, залежно від вашої мови.
  • Ви також можете виводити масив символів замість рядка.
  • Це

Тестові кейси

"cbad" -> "abcd"
"ACBD" -> "ABCD"
"Cb-Ad" -> "Ab-Cd"
"caeBDF" -> "aBcDeF"
"aEcbDF" -> "abcDEF"
"ogl-edocf" -> "code-golf"
"W o,ollelrHd!" -> "Hello, World!"
"ti HIs SSta ET!" -> "tHis IS a tEST!"
code-golf  string  code-golf  string  code-golf  string  parsing  brainfuck  code-challenge  python  hello-world  error-message  code-golf  string  code-golf  number  integer  counting  subsequence  code-golf  string  cipher  code-golf  array-manipulation  arithmetic  integer  matrix  code-golf  math  sequence  code-golf  restricted-source  pi  popularity-contest  cops-and-robbers  polyglot  popularity-contest  cops-and-robbers  polyglot  code-golf  file-system  king-of-the-hill  code-golf  number  sequence  integer  rational-numbers  string  code-challenge  source-layout  code-golf  ascii-art  king-of-the-hill  code-golf  array-manipulation  sorting  code-golf  string  code-golf  restricted-source  source-layout  tips  math  code-challenge  permutations  logic-gates  code-golf  number  random  integer  code-golf  math  code-golf  math  number  decision-problem  king-of-the-hill  python  board-game  code-challenge  brainfuck  busy-beaver  code-golf  number  cops-and-robbers  polyglot  obfuscation  answer-chaining  code-golf  number  integer  conversion  code-golf  string  parsing  code-golf  ascii-art  number  king-of-the-hill  javascript  code-golf  source-layout  radiation-hardening  code-golf  array-manipulation  matrix  code-golf  string  graph-theory  code-golf  array-manipulation  decision-problem  code-golf  string  ascii-art  code-golf  string  code-golf  array-manipulation 

Відповіді:


5

Pyth, 21 20 байт

VQ=k+.>k-}NG}Nr1GN)k

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

Пояснення

VQ=k+.>k-}NG}Nr1GN)k
VQ                )      For each N in the input...
     .>k                 ... rotate k (initially '')...
        -}NG}Nr1G        ... by (N is lowercase) - (N is uppercase)...
    +            N       ... then append N...
  =k                     ... and update k.
                   k     Output the result.

Ви можете використовувати .Uдля зменшення введення з другого значення. Це дозволяє відмовитися =kвід початку та )kз кінця, оскільки введення та друк є неявними. Повна програма: .U+.>b-}ZG}Zr1GZ- посилання
Sok


3

Желе , 14 байт

ØẠŒHċ€ḅ-N⁸ṙ;ð/

Монадійне посилання, що приймає список символів, який дає список символів.

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

Як?

ØẠŒHċ€ḅ-N⁸ṙ;ð/ - Link - list of characters
             / - reduce by:
            ð  -   a dyadic chain:  1st call is f(L=1stCharacter, R=2ndCharacter)
               -                    ...then calls are f(L=previousResult, R=nextCharacter)
ØẠ             -     alphabet characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  ŒH           -     split in half = ["ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"]
     €         -     for each:
    ċ          -       count occurrences (of R)
               -                          e.g.: 'W' -> [1,0]; 'c' -> [0,1]; '@' -> [0,0]
      ḅ-       -     convert from base -1             -1             1             0
        N      -     negate                            1            -1             0
         ⁸     -     chain's left argument (i.e. L)
          ṙ    -     rotate left by (the negate result)
           ;   -     concatenate R

Я не знаю занадто добре Jelly, але чи не повинен Iробити так, як ḅ-у цьому випадку? Це, здається, працює тут , але не у вашому коді. Я трохи розгублений, чому. Крім того, чи є команда пересувати цілі списки як окремі елементи до стека в Jelly (зачекайте, Jelly - це не мова, що базується на стеках, чи так це?)? У такому випадку можна використовувати просте віднімання, і вам також не знадобиться заперечення, якщо я не помиляюся (подібно до останньої редакції у моїй відповіді 05AB1E).
Кевін Кройсейсен

1
Iдає список - додайте, ŒṘ щоб переглянути повне представлення . Так ØẠŒHċ€IṪN⁸ṙ;ð/би працювало.
Джонатан Аллан

Ну добре, це має сенс. Дякую за пояснення. Приємна відповідь btw, вже вчора її схвалив. :)
Кевін Кройсейсен

3

05AB1E , 18 17 16 14 байт

õsvy.uy.l-._y«

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

Пояснення:

õ            # Start with an empty string
 sv          # Loop over the characters `y` of the input
   y.u       #  Check if `y` is an uppercase letter (1 if truthy; 0 if falsey)
   y.l       #  Check if `y` is a lowercase letter (1 if truthy; 0 if falsey)
      -      #  Subtract them from each other
       ._    #  Rotate the string that many times (-1, 0, or 1) toward the left
   y«        #  Append the current character `y` to the string
             # (And implicitly output the string after the loop)

3

К4 , 43 33 байт

Рішення:

""{.q.rotate[-/y in'.Q`A`a;x],y}/

Приклади:

q)k)""{.q.rotate[-/y in'.Q`A`a;x],y}/"Cb-Ad"
"Ab-Cd"
q)k)""{.q.rotate[-/y in'.Q`A`a;x],y}/"ogl-edocf"
"code-golf"
q)k)""{.q.rotate[-/y in'.Q`A`a;x],y}/"ti HIs SSta ET!"
"tHis IS a tEST!"

Пояснення:

Ітерайте над вхідним рядком, обертаючи попередній вихід на 1, -1 або 0, залежно від його положення у списку "a-zA-Z".

""{.q.rotate[-/y in'.Q`A`a;x],y}/ / the solution
""{                            }/ / iterate (/) over, starting x as ""
                             ,y   / append y to
   .q.rotate[             ;x]     / rotate x by ...
                    .Q`A`a        / the lists "a..z" and "A..Z"
               y in'              / y in each (') alphabet?
             -/                   / subtract (-) over (/)

Примітки:

  • -10 байт з натхненням від рішення 05AB1E

3

> <> , 45 43 байт

ii:2+7$.::&"`{"@)@(*?}"@["&::&@)@(*?{&!
ror

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

Той факт, що у <<> є обертання стека, допомагає, але перевірка регістру букви не відповідає.

Пояснення:

i    Get first inputted character
 i   Get second. This is to prevent errors from rotating an empty stack
  :2+7$.      Jump to the second line if that was EOF
        ::&   Create copies of the input and store one in the register
           "`{"@)@(*     Check if the char is lower case
                    ?}   If so rotate the stack
                      "@["&::&@)@(*?{   Rotate the other way if uppercase
                                     &  Push the new char
                                      ! Skip the first i instruction
Skip to the second line on EOF
ro      Reverse the stack and output
r r     Cancel out the first reverse
 o      Output the rest of the stack

2

Haskell , 101 91 байт

-10 байт, натхненний відповіддю Кертіса Бехтеля (використовуйте '@'<c,c<'['більше elem c['A'..'Z']та відповідно до діапазону літер з нижчим регістром).

g(x:y)=foldl((<>pure).(!))[x]y
x@(a:b)!c|'`'<c,c<'{'=last x:init x|'@'<c,c<'['=b++[a]|0<1=x

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

Пояснення / Недозволений

Оператор (!)приймає не порожній рядок, xна якому ми можемо відповідати шаблону та символу:

x@(a:b) ! c
  | '`' < c, c < '{' = last x : init x  -- rotate x to the right by one
  | '@' < c, c < '[' = b ++ [a]         -- rotate x to the left by one
  | otherwise = x                       -- keep x as is

Тепер ми можемо зменшити хвіст введення зліва направо, починаючи з першого символу введення, використовуючи:

\b a -> b!a ++ [a]

2

Хаскелл , 122 92 байт

Дякуємо BWO за пропозиції! Я також багато заощадив, застосувавши трохи інший підхід, ніж моя оригінальна відповідь.

l@(a:b)!c|'`'<c,c<'{'=last l:init l++[c]|'@'<c,c<'['=b++[a,c]|0<1=l++[c]
f(c:s)=foldl(!)[c]s

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


Ви можете поміняти відповідність шаблонів (#), використовувати ,над &&, використовувати [l!!0,c]над head l:[c], 1>0замість цього True, вам не потрібно рахувати, f=і ви можете припустити, що не порожній вхід зберігає l==[]варту - економить 13 байт: Спробуйте це в Інтернеті!
ბიმო

Btw. Я використовував isLowerі isUpperгольф в моїх поданнях , я сподіваюся, що ви добре з цим, інакше я перейму редагування.
ბიმო

@BWO Дякуємо за пропозиції та йдіть прямо вперед!
Кертіс Бехтел,

2

JavaScript (Node.js) , 116 102 байт

f=(s,i=1)=>s[i]?f(s.replace(RegExp(`^(.)(.{${i}})(?=[A-Z])|^(.{${i}})(.)(?=[a-z])`),"$4$3$2$1"),i+1):s

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

Оригінал ( 116 111 106B)

s=>Buffer(s).map((x,i)=>s=(t=s[S="slice"](i),i<2)?s:x>64&x<91?s[S](1,i)+s[0]+t:x>96&x<123?s[i-1]+s[S](0,i-1)+t:s)&&s

s=>Buffer(s).map((x,i)=>i<2|--x%32>25|x<64?s:s=[s[S="slice"](1,i)+s[0],s[i-1]+s[S](0,i-1)][+(x>95)]+s[S](i))&&s

s=>Buffer(s).map((x,i)=>!i|--x%32>25|x<64?s:s=(w=x>95,t=s.slice(1-w,i-w),w?s[i-1]+t:t+s[0])+s.slice(i))&&s


Це, мабуть, коротше, eval(`regex`)ніж використовувати конструктор
Downgoat

@Downgoat Я боюся, що це не так, тому що косої риси потрібні у випадку eval(`regex`), тому -2 + 2 = 0, і, таким чином, це не допоможе зменшити кількість байтів.
Шиеру Асакото

@Downgoat Варто використовувати, eval()коли використовується хоча б один прапор: eval('/./g')на 3 байти коротший RegExp('.','g').
Арнольд

@Arnauld Це правда, але тут я не використовую прапори.
Шиеру Асакото

@ShieruAsakoto (Звичайно. Мій коментар в першу чергу був адресований Downgoat, щоб пояснити, чому це не варто робити тут.)
Arnauld,

2

Рубі , 51 байт

->s{w=[];s.map{|x|w.rotate!(x=~/\W/||?_<=>x)<<x};w}

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

Введення та вихід - це масиви символів

Хитрість:

Код досить простий, за винятком, можливо, частини обертання:

(x=~/\W/||?_<=>x)

x - це один символ, який може бути буквою, перший вираз x=~/\W/повертається, nilякщо це буква, а 0 в іншому випадку. Якщо це 0, ми закінчили, якщо ні, логічна orперевірка другого виразу: ?_<=>xповертає -1 для верхнього регістру та 1 для нижнього регістру. Отже обертання:

  • -1 (1 зліва) для верхнього регістру
  • +1 (1 праворуч) для малих літер
  • 0 (немає обертання), якщо це не літера

2

Червоний , 110 байт

func[s][p: s forall s[if all[(a: first s)>#"@"a < #"["][move p back s]if all[a >#"`"a <#"{"][move back s p]]p]

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

Пояснення:

f: func [ s ] [
    p: s                                ; store the starting position of the string in p
    forall s [                          ; iterate through the entire string
        a: first s                      ; store the current character in a
        if all [ a > #"@" a < #"[" ] [  ; if `a` is a uppercase letter
            move p back s               ; move the starting char to the position before current
        ]
        if all [ a > #"`" a < #"{" ] [  ; if `a` is a lowercase letter
            move back s p               ; move the character before the current one to the start
        ]
    ]
    p                                   ; return the string 
]


2

Japt, 17 16 14 байт

Приймає введення як масив символів, виводить рядок

;rÏiXéCøY -BøY

Спробуй це


Пояснення

 rÏ                :Reduce by passing the current result (X) & the current element (Y) through a function
   i               :  Prepend to Y
    Xé             :  X rotated right by
;     B            :    Uppercase alphabet
       øY          :    Contains Y?
          -        :    Subtract
;          C       :    Lowercase alphabet
            øY     :    Contains Y?


1

Java 10, 149 119 байт

s->{for(int i=1;i<s.length();)s=s.replaceAll("^(.)(.{"+i+"})(?=[A-Z])|^(.{"+i+++"})(.)(?=[a-z])","$4$3$2$1");return s;}

Порт @ShieruAsakoto відповідь JavaScript , тому не забудьте підтримати його.

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

Пояснення:

s->{                          // Method with String as both parameter and return-type
  for(int i=1;i<s.length();)  //  Loop `i` in the range [1, length)
    s=s.replaceAll("^(.)(.{"+i+"})(?=[A-Z])|^(.{"+i+++"})(.)(?=[a-z])","$4$3$2$1");
                              //   Rotate the substring of [0, i] either left or right
  return s;}                  //  Return the modified input-String as result

1

Стакс , 32 байти

éG7[Æ┐äZ▬Θε♫∙~╞ÉH╔u╬←J╛ü╢(┼▒uX)Ü

Запустіть і налагоджуйте його

B]s{c97 123:bsaa|)sc65 91:bsaa|(s+c}fd  #Full program, unpacked, implicit input
B]s                                     #Unons-left, singleton, swap top 2 of stack
   {c                                   #Copy iterative letter
     97 123                             #Put 97 and 123 on stack(lower case)
           :bsaa                        #Check if iterative letter is between range, swap orientation back to proper order
                |)                      #Rotate if the letter is within range
                  sc                    #Swap top 2 and copy top
                    65 91               #Put 65 and 91 on stack (Capitals)
                         :bsaa          #Check if iterative letter is between range, swap orientation back to proper order
                              |(        #Rotate if the letter is within range
                                s+c     #swap, concat and copy
                                   }fd  #remove duplicate of original answer after loop and implicitly print

Багато міняння стеків, що, мабуть, непотрібне. Мені б дуже хотілося це знизити більше, але я боровся з замовленням стека. Можливо, хтось може це зрозуміти, якщо їм нудно. Буде продовжувати працювати над цим.


1

Attache , 69 байт

~Fold[{s'r.=_'sp;Rotate[s,&`-!Has&r[0]=>ALPHA'alpha]+r}@SplitAt]#Iota

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

Пояснення

Загальна форма

Функція зазвичай виглядає так:

~Fold[{...}]#Iota

Який {...}склад складається над кожним членом у діапазоні від 0до #input - 1( Iota), починаючи з введення у вигляді елемента .

Внутрішня функція

Наступна функція викликається як f[building, index]і викликається з кожним індексом від 0до #inputексклюзивних. @SplitAtзакликає SplitAtці аргументи, розділяючи вхідний рядок на index.

{s'r.=_'sp;Rotate[s,&`-!Has&r[0]=>ALPHA'alpha]+r}
{                                               }    anonymous function taking the split string
                                                     e.g.: ["cd-", "Adf!"]
      _'sp                                           concat the input with a space
                                                     e.g.: ["cd-", "Adf!", " "]
                                                     (this is to handle index = 0)
 s'r.=                                               `s` is the first member, and `r` is the second
           Rotate[s,                         ]       rotate `s` by:
                                  ALPHA'alpha          over uppercase and lowercase alphabets:
                        Has&r[0]=>                       test if r[0] is in each alphabet
                                                       e.g.: [true, false]
                    &`-!                               subtract the second from the first
                                                       e.g.: (true - false) = 1 - 0 = 1
                                                     s is rotated according to the following map:
                                                       uppercase =>  1
                                                       symbol    =>  0
                                                       lowercase => -1
                                              +r     append the right portion of the string

По суті, ця функція обертає ліву частину рядка відповідно до першого символу правої частини.


1

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

FS≔⁺⭆ω§ω⁻⁺λ№αι№βιιωω

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

FS

Проведіть петлю над вхідними символами.

≔⁺⭆ω§ω⁻⁺λ№αι№βιιω

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

ω

Роздрукуйте результат.


1

R , 107 102 100 байт

Масивна, тому що маніп R-рядків об'ємний. Чи може хтось отримати його під 100?

-5 байт, використовуючи трюк "встановити змінні циклу на F, щоб уникнути ініціалізації".

-2 байти, вважаючи, що всі символи можна друкувати та використовувати, 2*!k%%97>25а не 2*k%in%97:122для тестування малих регістрів, використовуючи пріоритет оператора.

function(x){for(k in u<-utf8ToInt(x))u[1:F-1]=u[(1:(F=F+1)+k%in%65:90-2*!k%%97>25)%%F];intToUtf8(u)}

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


1
Приходьте, приєднуйтесь до нас (це просто я зараз ...) в чаті R Golf, щоб відскакувати деякі ідеї навколо! Я здогадуюсь, що фрагмент перестановки такий короткий, як це може бути при такому підході, але не спробувавши його сам, я не можу сказати точно.
Джузеппе

1

Japt , 25 23 байт

Я здаюсь, не можу скоротити її

-2 байти від @ETHproductions

£=¯Y éXè\a -Xè\A)+UsYÃU

£=¯Y éXè\a -Xè\A)+UsYÃU     Full program. Implicit input U
£                           map each char
 =                          set U equal to:
  ¯Y                        U sliced to current mapped value
    éXè\a -Xè\A)            and rotated left or right 1 char
                +UsY        append the non-sliced U value
                      ÃU    Output U    

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


На жаль, я не можу знайти і коротший спосіб зробити éXè\a -Xè\Aце :-( Ви можете зберегти два байти, змінивши подвійний пробіл на a )і видаливши© (неявна кома означає, що Uвсе ще виводиться)
ETHproductions

Збережіть ще 2 байти, скинувши ÃUта використовуючи -hпрапор.
Кудлатий

1

Сітківка , 67 64 58 байт

^
¶
+`(.*)(.)¶([a-z])|(.)(.*)¶([A-Z])|¶(.)
$2$1$3$5$4$6$7¶

-9 байт завдяки @Neil видалив три непотрібні ?мені додані, а також непотрібні(.*) в іншому випадку.

Спробуйте в Інтернеті або перевірте всі тестові випадки . (ПРИМІТКА. Вихідні дані із заднім рядком. Заголовок у тестовому наборі полягає у тестуванні кожного вхідного рядка як окремому тестовому випадку, а нижній колонтитул - у видаленні цього нового рядка для більш компактного виводу.)

Пояснення:

Перед введенням додайте новий рядок:

^
¶

Продовжуйте замінювати, доки ми не знайдемо відповідність:

+`

Все інше - це три різні чеки, об'єднані разом:

Якщо символ відразу після нового рядка має малі літери: поверніть все перед новим рядком один раз вправо, а потім додайте цей символ і новий рядок:

(.*)(.)¶([a-z])
$2$1$3¶

Якщо символ відразу після нового рядка є великою літерою: поверніть все перед новим рядком один раз вліво, а потім додайте цей символ і новий рядок:

(.)(.*)¶([A-Z])
$2$1$3¶

Інше (ні з малої, ні з малої літери): просто пересуньте новий рядок один раз вправо для наступної 'ітерації':

¶(.)
$1¶

Ці три перевірки вище об'єднуються з операторами регулярного вираження АБО ( |) та більшою груповою заміною, щоб змусити його діяти як anif(lowercase) ... elseif(uppercase) ... else ... :


Я не думаю, що вам потрібні ?s - якщо ще немає чого обертати, не має значення, чи є лист.
Ніл

1
Крім того, заміна (.*)¶(.)на $1$2¶може бути спрощена до заміни ¶(.)на$1¶ як інший захоплення не впливає на результат.
Ніл

@Neil Ах, звичайно, дякую. -9 байт прямо там! :)
Кевін Круїссен

1

MATL , 20 байт

ttYo-ZS"X@q:&)w@YSwh

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

-4 байти завдяки Луїсу Мендо.

Перетворює великі регістри / малі літери в не-букву в [-1,0,1] (перша половина програми). Застосовує перемикання послідовно (друга половина). Я розбиваю мозок, якщо є кращий спосіб відобразити великі регістри / малі регістри на [-1,0,1] (див. Другу версію), і, можливо, спосіб повернути рядок відразу, щоб позбутися двох wпотрібні для &).



0

Pyth, 16 байт

em=+.>k-F}RGrBd2

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

Пояснення:

em=+.>k-F}RGrBd2dQ    Autofill variables
 m               Q    for each d in Q (the input):
            rBd2       Take [d, swapcase(d)]
         }RG           Figure out which are in the lowercase alphabet (returns [1,0] for lowercase, [0,1] for uppercase, [0,0] for non-letters)
       -F              Fold on subtraction (1 for lowercase, -1 for uppercase, 0 for non-letter)
    .>k                Cycle the processed part (k) of the input right by ^ steps
   +            d      Add in the new character at the end
  =   k                Store new process step back into k (k starts as an empty string)
e                     Get the (e)nd step's output.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.