Подвійне обертання


28

Опис виклику

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

Приклади

1: Привіт, світ

Hello_world //Input
Hell     ld //Letters from first half of alphabet
    o wor   //Letters from second half of alphabet
     _      //Other characters
dHel     ll //Cycle first letters
    w oro   //Cycle second letters
     _      //Other characters stay
dHelw_oroll //Solution

2: кодегольф

codegolf
c deg lf
 o   o  

f cde gl
 o   o  

focdeogl

3.: порожній рядок

(empty string) //Input
(empty string) //Output

Вхідні дані

Рядок, який потрібно обертати. Може бути порожнім. Не містить нових рядків.

Вихідні дані

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

Правила

  • Не допускаються лазівки
  • Це код-гольф, тому найкоротший код у байтах, що вирішують проблему, виграє
  • Програма повинна повернути правильне рішення

1
Нагадайте, які букви з першої половини алфавіту, які букви з другої?
user48538

Але все-таки хороший виклик.
user48538

4
Перший тайм: ABCDEFGHIJKLMabcdefghijklm Другий тайм: NOPQRSTUVWXYZnopqrstuvwxyz
Пол Шмітц

Смішно, що кодегольф стає анаграмою самого себе
гордий haskeller

Відповіді:


0

MATL , 29 байт

FT"ttk2Y213:lM@*+)m)1_@^YS9M(

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

Пояснення

FT        % Push arrray [0 1]
"         % For each
  t       %   Duplicate. Takes input string implicitly in the first iteration
  tk      %   Duplicate and convert to lower case
  2Y2     %   Predefined string: 'ab...yz'
  13:     %   Generate vector [1 2 ... 13]
  lM      %   Push 13 again
  @*      %   Multiply by 0 (first iteration) or 1 (second): gives 0 or 13
  +       %   Add: this leaves [1 2 ... 13] as is in the first iteration and
          %   transforms it into [14 15 ... 26] in the second
  )       %   Index: get those letters from the string 'ab...yz'
  m       %   Ismember: logical index of elements of the input that are in 
          %   that half of the alphabet
  )       %   Apply index to obtain those elements from the input
  1_@^    %   -1 raised to 0 (first iteration) or 1 (second), i.e. 1 or -1
  YS      %   Circular shift by 1 or -1 respectively
  9M      %   Push the logical index of affected input elements again
  (       %   Assign: put the shifted chars in their original positions
          % End for each. Implicitly display


4

05AB1E , 44 43 42 байт

Оn2äø€J2ä©`ŠÃÁUÃÀVv®`yåiY¬?¦VëyåiX¬?¦Uëy?

Пояснення

Створіть список букв алфавіту обох справ. ['Aa','Bb', ..., 'Zz']

Оn2äø€J

Розділіть на 2 частини і збережіть копію в реєстрі.

2ä©

Витяг листів з введення , які є частиною 1 - й половини алфавіту, повернути його і зберігати в X .

`ŠÃÁU

Витяг листів з введення , які є частиною 2 - й половини алфавіту, повернути його і зберігати в Y .

ÃÀV

Основна петля

v                         # for each char in input
 ®`                       # push the lists of first and second half of the alphabet
   yåi                    # if current char is part of the 2nd half of the alphabet
      Y¬?                 # push the first char of the rotated letters in Y
         ¦V               # and remove that char from Y
           ëyåi           # else if current char is part of the 1st half of the alphabet
               X¬?        # push the first char of the rotated letters in X
                  ¦U      # and remove that char from X
                    ëy?   # else print the current char

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

Примітка: Провідне Ðможе бути опущено у двох варіантах для 41- байтного рішення.


4
<s>44</s>досі виглядає як 44.
KarlKastor

звичайно meta.codegolf.stackexchange.com/a/7427/21348 @KarlKastor
edc65

3

Javascript (ES6), 155 142 138 байт

s=>(a=[],b=[],S=s,R=m=>s=s.replace(/[a-z]/gi,c=>(c<'N'|c<'n'&c>'Z'?a:b)[m](c)),R`push`,a.unshift(a.pop(b.push(b.shift()))),s=S,R`shift`,s)

Редагувати: збережено 3 4 байти за допомогою unshift()(надихнув відповідь edc65)

Як це працює

RФункція приймає метод масиву в якості параметра m:

R = m => s = s.replace(/[a-z]/gi, c => (c < 'N' | c < 'n' & c > 'Z' ? a : b)[m](c))

Він спочатку використовується pushметодом для зберігання вилучених символів у a[](перша половина алфавіту) та b[](друга половина алфавіту). Після повернення цих масивів R()викликається другий раз shiftметодом введення нових символів у заключний рядок.

Звідси трохи незвичний синтаксис: R`push`і R`shift`.

Демо

let f =
s=>(a=[],b=[],S=s,R=m=>s=s.replace(/[a-z]/gi,c=>(c<'N'|c<'n'&c>'Z'?a:b)[m](c)),R`push`,a.unshift(a.pop(b.push(b.shift()))),s=S,R`shift`,s)

console.log("Hello_world", "=>", f("Hello_world"));
console.log("codegolf", "=>", f("codegolf"));
console.log("HELLO_WORLD", "=>", f("HELLO_WORLD"));


Збережіть ще 1 байт, уникаючи комиa.unshift(a.pop(b.push(b.shift())))
edc65


2

Пітон, 211 байт

x=input()
y=lambda i:'`'<i.lower()<'n'
z=lambda i:'m'<i.lower()<'{'
u=filter(y,x)
d=filter(z,x)
r=l=""
for i in x:
 if y(i):r+=u[-1];u=[i]
 else:r+=i
for i in r[::-1]:
 if z(i):l=d[0]+l;d=[i]
 else:l=i+l
print l

Найкраще, що я міг зробити. Бере рядок з STDIN і друкує результат на STDOUT.

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

x=input()
y=lambda i:'`'<i.lower()<'n'
z=lambda i:'m'<i.lower()<'{'
f=filter
u=f(y,x)
d=f(z,x)
r=l=""
for i in x[::-1]:
 if z(i):l=d[0]+l;d=[i]
 else:l=i+l
for i in l:
 a=i
 if y(i):a=u[-1];u=[i]
 print a

1

Python 2, 149 байт

s=input();g=lambda(a,b):lambda c:a<c.lower()<b
for f in g('`n'),g('m{'):
 t='';u=filter(f,s)[-1:]
 for c in s:
  if f(c):c,u=u,c
  t=c+t
 s=t
print s

2
Не впевнений, хто вас порушив, але я зробив це знову 0, звернувшись. Ласкаво просимо до PPCG! Можливо, ви могли б додати пояснення або ідею свого коду ? Я припускаю, що поточний запис було зроблено автоматично після редагування Beta Decay користувачем спільноти, грунтуючись на коментарі @Dennis у цій відповіді .
Кевін Кройсейсен

1

JavaScript (ES6), 144

Використовуючи parseIntоснову 36 для розділення першої половини, другої половини та іншого. Для будь-якого персонажа cя оцінюю y=parseInt(c,36)так, що

  • c '0'..'9' -> y 0..9
  • c 'a'..'m' or 'A'..'M' -> y 10..22
  • c 'n'..'z' or 'N'..'Z' -> y 23..35
  • c any other -> y NaN

Так y=parseInt(c,36), x=(y>22)+(y>9)дає x==1для першої половини, x==2для другої половини та x==0для будь-якої іншої (оскільки NaN> будь-яке число помилкове)

Перший крок: вхідний рядок відображається в масив 0,1 або 2. Тим часом всі символи рядків ar додані до 3 масивів. В кінці цього першого кроку масиви 1 і 2 обертаються в протилежних напрямках.

Другий крок: відображений масив сканується, відновлюючи вихідний рядок, беручи кожен символ із 3-х тимчасових масивів.

s=>[...s].map(c=>a[y=parseInt(c,36),x=(y>22)+(y>9)].push(c)&&x,a=[[],p=[],q=[]]).map(x=>a[x].shift(),p.unshift(p.pop(q.push(q.shift())))).join``

Менше гольфу

s=>[...s].map(
  c => a[ y = parseInt(c, 36), x=(y > 22) + (y > 9)].push(c) 
       && x,
  a = [ [], p=[], q=[] ]
).map(
  x => a[x].shift(),  // get the output char from the right temp array
  p.unshift(p.pop()), // rotate p
  q.push(q.shift())   // rotate q opposite direction
).join``

Тест

f=
s=>[...s].map(c=>a[y=parseInt(c,36),x=(y>22)+(y>9)].push(c)&&x,a=[[],p=[],q=[]]).map(x=>a[x].shift(),p.unshift(p.pop()),q.push(q.shift())).join``

function update() {
  O.textContent=f(I.value);
}

update()
<input id=I oninput='update()' value='Hello, world'>
<pre id=O></pre>


0

Perl 53 байти

Включає +1 для -p

Запустити з введенням STDIN:

drotate.pl <<< "Hello_world"

drotate.pl:

#!/usr/bin/perl -p
s%[n-z]%(//g,//g)[1]%ieg;@F=/[a-m]/gi;s//$F[-$.--]/g

0

Пітон, 142 133 байт

Краща варіація теми:

import re
def u(s,p):x=re.split('(?i)([%s])'%p,s);x[1::2]=x[3::2]+x[1:2];return ''.join(x)
v=lambda s:u(u(s[::-1],'A-M')[::-1],'N-Z')

неозорений:

import re
def u(s,p):
    x = re.split('(?i)([%s])'%p,s)  # split returns a list with matches at the odd indices
    x[1::2] = x[3::2]+x[1:2]
    return ''.join(x)

def v(s):
  w = u(s[::-1],'A-M')
  return u(w[::-1],'N-Z')

попереднє рішення:

import re
def h(s,p):t=re.findall(p,s);t=t[1:]+t[:1];return re.sub(p,lambda _:t.pop(0),s)
f=lambda s:h(h(s[::-1],'[A-Ma-m]')[::-1],'[N-Zn-z]')

неозорений:

import re
def h(s,p):                              # moves matched letters toward front
    t=re.findall(p,s)                    # find all letters in s that match p
    t=t[1:]+t[:1]                        # shift the matched letters
    return re.sub(p,lambda _:t.pop(0),s) # replace with shifted letter

def f(s):
    t = h(s[::-1],'[A-Ma-m]')            # move first half letters toward end
    u = h(t[::-1],'[N-Zn-z]')            # move 2nd half letters toward front
    return u

0

Рубін, 89 байт

f=->n,q,s{b=s.scan(q).rotate n;s.gsub(q){b.shift}}
puts f[1,/[n-z]/i,f[-1,/[a-m]/i,gets]]

0

PHP, 189 байт

Досить важко гольфу ... Ось моя пропозиція:

for($p=preg_replace,$b=$p('#[^a-m]#i','',$a=$argv[1]),$i=strlen($b)-1,$b.=$b,$c=$p('#[^n-z]#i','',$a),$c.=$c;($d=$a[$k++])!=='';)echo strpos(z.$b,$d)?$b[$i++]:(strpos(a.$c,$d)?$c[++$j]:$d);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.