Числа зменшуються, а літери збільшуються


18

Випадково натхненні цифри збільшуються, а літери зменшуються

З огляду на список змішаних літер та цілих чисел (наприклад, ['a', 2, 3, 'b']) збільшити літери на одне положення в алфавіті (загортання на zдо a) та зменшити цифри на 1. Для вищенаведеного прикладу вихід повинен бути ['b', 1, 2, 'c'].

  • Вхід може бути списком змішаного типу, розділеним рядком, списком рядків тощо.
  • zобгортає до a, але 1йде до 0, і 0йде до -1тощо.
  • Вхід буде лише колись [a-z]і цілими числами. Ви можете вибрати великі літери [A-Z]в якості введення, якщо це простіше для вас.
  • Вхід гарантовано не порожній.
  • Вхід може містити лише цифри або лише літери.

Приклади:

Input
Output

['a', 2, 3, 'b']
['b', 1, 2, 'c']

['a', 'b', 'z']
['b', 'c', 'a']

[-1, 0, 257, 'x']
[-2, -1, 256, 'y']

[0, 3, 1, 20382876]
[-1, 2, 0, 20382875]

Правила та уточнення

  • Введення та вихід можуть бути надані будь-яким зручним методом .
  • Ви можете роздрукувати результат в STDOUT або повернути його як результат функції.
  • Вихідні дані не повинні мати той самий формат, що і вхідний (наприклад, ви можете приймати введення як рядок і виводити як список).
  • Прийнятна або повна програма, або функція.
  • Якщо можливо, ви можете припустити, що цілі числа введення / виведення відповідають місцевому intдіапазону вашої мови .
  • Стандартні лазівки заборонені.
  • Це тому застосовуються всі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

1
Якщо число дорівнює Integer.MinValue або будь-яке найнижче значення підписаного цілого числа у моїй мові, я повинен перелитись на Integer.maxValue чи продовжувати відлік?
Nzall

1
@Nzall Невизначена поведінка. П'ята точка пункту в Правилах та уточненнях визначає, що і вхідні, і вихідні цілі числа знаходяться у вашому рідному intдіапазоні мов , тому ви ніколи не отримаєте Integer.MinValueяк введення.
AdmBorkBork

Відповіді:



5

Python 3 , 59 байт

lambda a:[i-1if''!=i*0else chr(97+(ord(i)+8)%26)for i in a]

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

-1 байт завдяки Еріку Переможнику



@EriktheOutgolfer порівняння цілих чисел та рядків, здається, не працює у вашому рішенні.
Jitse

Ну правильно, для цього вам потрібен Python 2.
Ерік Аутгольфер

Ага так, то, здається, працює. Тим НЕ менше заміна -96з +8економить байти.
Jitse

''!=i*0на три байти коротше моєї str(i)>'9', хороша робота
Чорна сова Кай


5

Рубін , 34 байти

Для кожного елемента спробуйте повернути елемент -1. Рядки не можуть цього зробити, тому вони помиляються та підбираються rescueпунктом, який замість цього вимагає succповернути наступну букву в алфавіті. succ"перекидається" далі zі повертається aa, тому ми просто беремо перший символ у повернутому рядку.

->a{a.map{|e|e-1rescue e.succ[0]}}

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



3

Python 3 , 182 130 118 байт

-51 байт завдяки @AdmBorkBork і @Black Сова Кай, -1 байт завдяки @Black Рад Кай, -12 байт шляхом заміни .append()з +=[]і заміни n+1з-~n

def a(x):
 b='abcdefghijklmnopqrstuvwxyz';c=[]
 for d in x:
  try:c+=[d-1]
  except:c+=[b[(-~b.find(d)%26)]]
 return c

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

Я зробив це, поки питання було в пісочниці, але я не бачив його опублікованим до цих пір. : P

Безумовно

def a(x):
    b = 'abcdefghijklmnopqrstuvwxyz'
    c = []
    for d in x:
        try:
            c.append(d - 1)
        except:
            c.append(b[((b.find(d) + 1) % 26)])
    return c

Пояснення

Для кожного елемента введеного списку xвін намагається відняти 1 і додати його до можливого поверненого списку. Якщо виникає помилка (оскільки елемент - це рядок), індекс букви в алфавіті додається 1 і цей мод 26 приймається. Мод 26 обертає індекс 26 назад до 0.


Ласкаво просимо до CodeGolf SE! Я не є експертом в Python, але, думаю, ви можете поміняти 4 пробіли для вкладок, щоб зберегти купу байтів.
AdmBorkBork

Я отримав його на 131 байт, просто усунувши пробіл. Ще один байт можна пограти в гольф, зрозумівши, що (x+27)%26це такий же результат, як(x+1)%26
Чорна сова Кай

@AdmBorkBork BlackOwlKai Дякую за допомогу! Я відредагував публікацію.
asdf60367134

Ви можете використовувати термінал, str(d)==dщоб перевірити, чи це рядок чи ні, замість того, щоб покластися на спробувати / за винятком. Тоді, оскільки вам більше не потрібно спробувати / окрім того, ви можете зробити все це у списку! Я дозволю вам подумати над цим трохи більше, але ви можете легко потрапити під 100 байтів таким чином;)
Value Ink



2

Гема , 55 символів

<N>=@sub{$1;1}
z=a
<L>=@int-char{@add{@char-int{$1};1}}

Брудне рішення. Обгортання приросту листів болісно довге, тому отримали окреме правило.

Введення може бути абсолютно будь-яким, просто використовуйте деякі роздільники. (Можна навіть пропустити роздільники між цифрами та літерами. Завдяки ціні 1 символу для зміни <L1>ви можете також опустити роздільники між літерами.)

Проба зразка:

bash-5.0$ gema '<N>=@sub{$1;1};z=a;<L>=@int-char{@add{@char-int{$1};1}}' <<< "['a', 2, 3, 'b']"
['b', 1, 2, 'c']

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

Гема, 66 символів

<N>=@sub{$1;1}
<L>=@cmpi{$1;z;@int-char{@add{@char-int{$1};1}};a;}

Чистий розчин. Половина відносно ефективна, потім наполовину чистий біль.

Проба зразка:

bash-5.0$ gema '<N>=@sub{$1;1};<L>=@cmpi{$1;z;@int-char{@add{@char-int{$1};1}};a;}' <<< "['a', 2, 3, 'b']"
['b', 1, 2, 'c']

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


2

R , 77 85 байт

Дякую @Giuseppe за колосальні 8 байт

function(l)Map(function(x)"if"(i<-match(x,L<-c(letters,"a"),0),L[i+1],x-1),l)

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

Приймає дані як список. Після великої зміни від @Giuseppe для цього використовується Mapфункція застосувати функцію до списку. Для цього використовується matchтест на характер. Під час тесту розширений список літер та індекс зберігаються для повернення.


Я вважаю , characters НЕ кінцевий , так як вони відлиті в numericна is.finiteі, таким чином NA?
Джузеппе

@Giuseppe подумав, що це буде щось у цьому напрямку. Хоча це той самий байт, що і is.double, мені потрібно було його використовувати :)
MickyT


вибачте, що позбувся вашого is.finite, я подумав, що я сам
Джузеппе

1
@Giuseppe дуже приємно, не подумав би Mapі match. Добре навчитися чомусь щодня :)
MickyT


2

Сітківка , 52 50 48 58 41 37 байт

T`zl`l
\b0
-
\d+
*
-_*
-$.0
_(_*)
$.1

-4 байти завдяки @FryAmTheEggman (і для згадки у мене була помилка: 1 → -1замість 1 → 0).
+10 байт, щоб виправити помилку 1і 0.. Такий набридлий край, який мене накрутив на довгий час .. Але зараз гольф на 41 байт. (Зараз мені цікаво згадані в коментарях версії <40 байт @Neil і @CowsQuack . Дякую @Neil за підказку перетворення на 0спочатку -та вирішення негативних значень. Перетворення цих прав назад з унарних на цілі числа дуже допомогло.)
Мабуть, мені не потрібні межі в цій точці, тому -4 байти ..>.>

Введення / виведення розділено комами.

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

Пояснення:

Транслітерацію всіх "zabcdefghijklmnopqrstuvwxy(z)"на "abcdefghijklmnopqrstuvwxyz":

T`zl`l

Замініть всі автономні пристрої 0на -:

\b0
-

Перетворити всі числа в одинакові, замінивши їх на таку кількість підкреслень:

\d+
*

Для всіх від’ємних значень із нулем або більше одинарних рядків за ним: збережіть знак мінус та отримайте загальну довжину цієї відповідності (включаючи -), перетворену назад у ціле число:

-_*
-$.0

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

_(_*)
$.1


1

PHP , 50 байт

for(;''<$a=$argv[++$i];)echo$a<a?--$a:(++$a)[0],_;

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

Тести

Виводить літери / цілі числа, розділені _проміжним знаком.

У PHP можна збільшувати літери безпосередньо, тому я скористався цим. Але zінкремент збільшується до aa, щоб перетворити його a, (++$a)[0]використовується той, який видає лише перший символ прирощеного значення.


1

Japt -m , 13 12 байт

-1 байт завдяки Шаггі

;¤?UÉ:Cg8+Uc

Спробуй це

Пояснення:

;o ?UÉ:Cg8+Uc
-m              // Map U through the input:
 o              // Try to create a range [1...U]
   ?            //   If that creates a range (number):
    UÉ          //     Return U-1
      :         //   Else, return:
;      C        //     alphabet (a...z)
        g       //     Index:
         8+Uc   //       8 + char-code of U

Примітка : ;перетворюється Cна малий алфавіт


Він не схожий на цих обгортки від zдо a.
Кошлатий

@Shaggy Whoops, я це пропустив. Я додав тимчасове виправлення на +2 байти
Олівер

Не вдалося розібратися з способом виправити шахту (поки що) без потрійного, що робить її занадто схожою на вашу на свій смак, тому я видаляю зараз. o-> ¤збереже вам байт тут.
Кошлатий

1
+2і тоді -1завдяки Шаггі було б точніше! : D
Кудлатий

1
@Shaggy The +2був завдяки Oliver: P
Олівер

1

Haskell, 52 51 байт

map q
q"z"="a"
q x|x>"`"=succ<$>x|1<2=show$read x-1

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

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

Перевірте кожен елемент списку: якщо рядок є "z", поверніться"a" ; якщо перший символ рядка>'`' (тобто літера, а не цифра), поверніть наступник символів у рядку; в іншому випадку це повинно бути число, тому перетворіть на ціле число, відніміть 1 і знову перетворіться на рядок.

Редагувати: -1 байт завдяки @cole.


Це працює на 51 байт?
cole

@cole: так, це так. Спасибі!
Ними

1

Желе , 13 байт

®i‘ị®µ’e?€Øa©

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

Розумне виправлення Джонатана Аллана .

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


Не працюю з негативами на вході (або понад chr діапазоном). ®i‘ị®µ’e?€Øa©це фіксація нуля, я вважаю.
Джонатан Аллан

@JonathanAllan Hah, я забув, що в цьому випадку точно не працює. Іронічно, оскільки я уникав використання ~в якості умови для обліку -1вхідних даних ... Крім того, як я буду скорочувати ®i‘ị®...
Ерік Атгольфер

1

C ++ 17 (gcc) , 120 байт

#define O int operator()
struct V{O(char&c){c++-90?:c=65;}O(int&i){--i;}};int f(auto&l){for(auto&x:l)std::visit(V{},x);}

Ось f необхідна функція; lє і вхідним, і вихідним параметром, і очікується, що він є контейнером об'єктів, сумісним std::variant<char, int>або навпаки.

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



1

K (oK) , 27 байт

{$[9+@x;`c$97+26!8+x;x-1]}'

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

-8 завдяки ngn та dzaima :)


1
31 байт, {$[-9=@x;x-1;90=x;"A";`c$1+x]}'в якому розміщено спеціальний регістр & з використанням великого регістру (і в списку 'має бути
занесений

@scrawl Я думаю, що dzaima є правильним - 'слід вважати. ось дещо довший вираз, який не потребує, 'а також піклується про "z" -> "a":{`c`i[t]$(-26*x~'"z")+x+1-2*t:x~'0+x}
ngn

або ще краще - скласти список прогнозів і застосовувати їх з @': {(`c$97+26!-96+;-1+)[x~'0+x]@'x}. тут -96(що є +1 мінус коду ascii "a") можна замінити, 8як це прийнято mod 26.
ngn

ще -1 байт, вибравши великі літери:{(`c$65+26!14+;-1+)[x=_x]@'x}
ngn

@dzaima можна скоротити до -9=@x->x=_x
ngn

0

Рунічні чари , 36 байт

\$ka'~?*3({':+1\
R';$ >i::0Sqn=?/1-$

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

Загальний процес полягає в тому, щоб прочитати введення, додати 0 (примус до рядка), перетворити назад у число (один символ завжди повернеться -1), порівняти з введенням. Якщо те саме, воно повинно бути числовим значенням, відняти 1 і надрукувати. Якщо це не те, це повинно бути знак, відняти 1, порівняти з {. Якщо менше, друкуйте, інакше замініть його aта надрукуйте.

Повторюйте, поки програма не виконає підтік стека.

Вихід відокремлений ;знаком, щоб зберегти 1 байт (і має останнє). Введення розділено пробілом.


0

Стакс , 17 байт

àºÇ╝'♫d▬♣ΩÜEƒ6╩╬ó

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

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

Трактування всього введення як рядка:

  1. Regex замінить проміжки цифр на eval(match) - 1 . Це нова функція, оскільки заміна блоку регулярних виразів - це не рядок, а ціле число.
  2. Regex замінює пробіли букв кільцем, перекладаючи їх навколо маленького алфавіту.


0

C #, 148 байт

(object[] o)=>{var l=new List<object>();foreach(var h in o){try{l.Add((int)h-1);}catch{var c=((char)h+1);if(c>122){c=97;}l.Add((char)c);}}return l;}

Посилання Repl.it

Безголовки:

var inputList = new object[] {'a', 2, 'z', 6};
var outputList = new List<object>();
foreach (var currentItem in inputList)
{
    try
    {
        outputList.Add((int)currentItem-1);
    }
    catch
    {
        var currentItemPlusOne = ((char)currentItem + 1);
        if (currentItemPlusOne > 122)
        {
            currentItemPlusOne = 97;
        }
        outputList.Add((char)currentItemPlusOne);
    }
}

0

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

WS⟦⎇№βι§β⊕⌕βιI⊖ι

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Здійснює вхід на STDIN, кожен рядок є або однією малою літерою, або цілим числом, і виводить окремі рядки на STDOUT. Пояснення:

WS

Повторне введення з STDIN, поки не буде досягнуто порожнього рядка.

Зробіть цей вираз виведення у власному рядку.

⎇№βι

Це підрядок заздалегідь заданого рядкового алфавіту?

§β⊕⌕βι

Якщо так, то друкуйте наступний лист циклічно з індексом.

I⊖ι

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


0

Zsh , 47 байт

a=({a..z} a)
for i
<<<${a[$a[(i)$i]+1]:-$[--i]}

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

a=({a..z} a)                  # append extra 'a' to the end to handle 'z' case
for i                         # for i in "$@" arguments
<<<${a[$a[(i)$i]+1]:-$[--i]}
       $a[(i)$i]              # first (i)ndex of $i in list (if not found, set to after last index)
      [         +1]           # increment
   ${a[           ]        }  # value in array at index. if lookup fails, empty string
   ${              :-$[--i]}  # if empty, decrement $i and substitute instead
<<<                           # print to stdout


0

Perl 6 , 31 байт

*>>.&{(try $_-1)||chr ord ++$_}

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

Анонімний Який би лямбда не відображав кожен елемент у списку і намагався відняти його з нього, інакше збільшуючи його та беручи першого символу у випадку, який zзавершується aa.



0

SimpleTemplate, 80 байт

Це було написано мовою, яку я склав.

Через обмеження в компіляторі я більше не можу його зменшити.

{@eachargv}{@if_ is matches"@\d+@"}{@incby-1_}{@echol_}{@else}{@inc_}{@echol_.0}

А тепер, неозорені:

{@each argv as value}
    {@if value is matches "@\d+@"}
        {@inc by -1 value}
    {@else}
        {@inc by 1 value}
    {@/}
    {@echo value, "\n"}
{@/}

І пояснення:

  • {@each argv as value}- перебирає всі значення в argv. ( argvмістить усі передані аргументи).
    Якщо as <var>немає, передбачається _змінна за замовчуванням .
  • {@if value is matches "@\d+@"}- перевіряє, що valueзбігається з регулярним виразом "@\d+@".
  • {@inc by -1 value} - збільшує значення на -1 (в основному, декремент).
  • {@echo value, "\n"}і {@echol_}- echolвиводить передані значення та додає рядок у кінці.
  • {@else} - роз'яснення
  • {@inc by 1 value}- збільшує значення на 1. Якщо значення by <value>відсутнє, вважається рівним 1.
  • {@echo value.0, "\n"}і {@echol_.0}- echolвиводить передані значення та додає рядок у кінці.
    Це необхідно з - за правила виклику: z wraps to a.
    Коли @incвикористовується рядок на рядку, він збільшує символи та, як тільки він потрапляє z, він завершується aa.
    Виведення першого символу задовольняє завдання, ціною 7 байт.
  • {@/}- закриває {@else}вищезазначене (необов’язково).
  • {@/}- закриває {@each}вищезазначене (необов’язково).

Ви можете спробувати це на веб-сайті: http://sandbox.onlinephpfunctions.com/code/7533641a0aa1fc8bf4699a9c758690de186b052f

Кожен переданий аргумент render()буде новим значенням, яке враховується.


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