Числа уменьшаются, а буквы увеличиваются

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диапазон вашего языка .
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
AdmBorkBork
источник
1
Если число равно Integer.MinValue или какому-либо наименьшему значению целого числа со знаком в моем языке, я должен уменьшить значение до Integer.maxValue или я должен продолжать обратный отсчет?
Nzall
1
@Nzall Неопределенное поведение. 5-й пункт в разделе «Правила и пояснения» указывает, что целые числа ввода и вывода вписываются в собственный 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 байт благодаря Эрику Аутгольферу

Jitse
источник
1
57 байтов .
Эрик Outgolfer
@ EriktheOutgolfer Сравнение целых чисел и строк не похоже на работу в вашем решении.
Джитс
Ах да, вам нужен Python 2 для этого.
Эрик Outgolfer
Ах да, тогда, кажется, работает. Еще замена -96с +8сохранением байта.
Джитс
''!=i*0на три байта меньше моей str(i)>'9'хорошей работы
Black Owl Кай
5

Perl 5 (-p), 17 байт

y/a-z/b-za/or$_--

Попробуйте онлайн!

Бонус 19 байт:

$_>$_++?$_-=2:s/a//

TIO . В этой игре есть несколько интересных трюков, но они не могут сравниться с простым решением, описанным выше.

Grimmy
источник
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 Owl Kai, -1 байт благодаря @Black Owl Kai, -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

Попробуйте онлайн!

Я сделал это, пока вопрос был в Песочнице, но не видел его до сих пор. :П

Ungolfed

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.

asdf60367134
источник
Добро пожаловать в CodeGolf SE! Я не эксперт в Python, но я думаю, что вы можете поменять 4 пробела для вкладок, чтобы сэкономить кучу байтов.
AdmBorkBork
Я получил его до 131 байта, просто удалив пробелы. При дополнительном размещении одного байта можно golfed, понимая , что (x+27)%26имеет тот же результат,(x+1)%26
Black Owl Kai
@AdmBorkBork BlackOwlKai Спасибо за помощь! Я редактировал пост.
asdf60367134
Вы можете использовать троичный с, str(d)==dчтобы проверить, является ли это строкой или нет, вместо того, чтобы полагаться на try / исключением. Тогда, поскольку вам больше не нужно пытаться / исключать, вы можете сделать все это в понимании списка! Я позволю вам подумать об этом немного больше, но вы можете легко получить менее 100 байт таким образом;)
Value Ink
89 байт
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']

Попробуйте онлайн!

manatwork
источник
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для проверки на характер. Во время теста расширенный список букв и индекс сохраняются для возврата.

MickyT
источник
Я полагаю , characters не конечен , так как они отлиты в numericна is.finiteи, таким образом NA?
Джузеппе
@ Джузеппе думал, что это будет что-то в этом роде. Хотя это те же байты, что и is.double, мне нужно было его использовать :)
MickyT
77 байт ?
Джузеппе
жаль избавиться от вашей is.finite, я думал , что взять трещину в этом сам
Джузеппе
1
@ Джузеппе очень мило, не подумал бы Mapи match. Хорошо учиться чему-нибудь каждый день :)
MickyT
2

MathGolf , 14 байтов

▄\╧¿ò'z=¿Å'a)(

Попробуйте онлайн!

Принимает письмо в нижнем регистре.

объяснение

▄\╧              Is the element in the lowercase alphabet?
   ¿ò            If so:
     'z=           Is it equal to z?
        ¿Å         If so:
          'a         Push 'a'
            )      Else: Increment the string
             (   Else: Decrement the number
Джо Кинг
источник
2

Retina , 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

Замените все автономные 0s на -:

\b0
-

Преобразуйте все числа в одинарные, заменив их таким количеством подчеркиваний:

\d+
*

Для всех отрицательных значений, с нулем или более одинарных строк за ним: оставьте знак минус и получите общую длину этого соответствия (включая -), преобразованную обратно в целое число:

-_*
-$.0

Что касается положительных целых чисел: сопоставьте положительное целое число, сопоставив одну унарную строку, за которой следует ноль или более унарных строк. А затем замените их длиной этой группы захвата, чтобы удалить эту единственную унарную строку и преобразовать их обратно в целые числа одновременно:

_(_*)
$.1
Кевин Круйссен
источник
1

PHP , 50 байт

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

Попробуйте онлайн!

тесты

Выводит буквы / целые числа, разделенные _конечным разделителем.

В PHP вы можете увеличивать буквы напрямую, поэтому я воспользовался этим. Но zувеличиваются до того aa, чтобы преобразовать его в a, то (++$a)[0]используется , который выводит только первый символ измененного значения.

night2
источник
1

Japt -m , 13 12 байт

-1 байт благодаря Shaggy

;¤?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 Ой, я пропустил это. Я добавил временное исправление для +2 байта
Оливер
Не могу найти способ починить мой (пока) без троичного, что делает его слишком похожим на ваш на мой вкус, поэтому я сейчас удаляю. o-> ¤сэкономит вам байт здесь.
лохматый
1
+2и тогда -1спасибо Шегги будет точнее! : D
Лохматый
1
@Shaggy Это +2было благодаря Оливеру: P
Оливер
1

Haskell, 52 51 байт

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

Поскольку Haskell не допускает списки смешанных типов, буквы и цифры берутся и возвращаются в виде строк.

Попробуйте онлайн!

Проверьте для каждого элемента списка: если строка "z", return "a"; если первым символом строки является> '`'(т. е. буква, а не цифра), вернуть преемник символов в строке; иначе это должно быть число, поэтому необходимо преобразовать в целое число, вычесть 1 и снова превратить в строку.

Редактировать: -1 байт благодаря @cole.

Ними
источник
Это работает на 51 байт?
Коул
@cole: да, это так. Благодарность!
Ними
1

Желе , 13 байт

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

Попробуйте онлайн!

Умный почин Джонатана Аллана .

Примечание: это не полная программа, нижний колонтитул над TIO позволяет вводить, используя аргумент командной строки для проверки функции.

Эрик Outgolfer
источник
Не будет работать с негативами на входе (или в диапазоне chr). ®i‘ị®µ’e?€Øa©это исправление для нуля, я верю.
Джонатан Аллан
@JonathanAllan Ха, я забыл, что в этом случае это не совсем так. Иронично, так как я избегал использовать ~в качестве условия для учета -1s во входных данных ... Кроме того, как я собираюсь сократить ®i‘ị®...
Эрик Outgolfer
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 (ок) , 27 байтов

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

Попробуйте онлайн!

-8 спасибо нгн и дзайма :)

каракули
источник
1
31 байт, {$[-9=@x;x-1;90=x;"A";`c$1+x]}'встраиваемый в специальный регистр и использующий заглавные буквы (и 'должен считаться, поскольку входные данные должны быть списком)
dzaima
@ scrawl Я думаю, что Дзайма прав - это 'нужно учитывать. вот немного более длинное выражение, которое не нужно 'и также заботится о "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на принятый мод 26.
ngn
еще один байт, выбрав заглавные буквы:{(`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 байт (и имеет завершающий). Ввод разделен пробелом.

Draco18s
источник
0

Stax , 17 байт

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

Запустите и отладьте его

Такое ощущение, что это должно быть возможно сделать короче, но я не могу удержаться от возможности использовать новую функцию Stax из последнего выпуска.

Обрабатывать весь ввод как строку:

  1. Regex заменяет серии цифр на eval(match) - 1. Это новая функция, поскольку замена блока регулярных выражений - это не строка, а целое число.
  2. Regex заменяет серии букв, переводя их по кругу в алфавит нижнего регистра.
рекурсивный
источник
0

Python 3, 66 байт

lambda X:[x-1if type(x)==int else chr(97+(ord(x)+8)%26)for x in X]

Редактировать:

Я не видел решения Jitse до сих пор. Уловка, если ''! = I * 0 - это здорово!

Хосе Алехандро Галистео Каллех
источник
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 ссылка

Ungolfed:

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);
    }
}
Merlin04
источник
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
GammaFunction
источник
0

C (gcc) , 93 86 байтов

f(int**s){for(char**p=s,*z;z=*p++;)64&*z?*z=*z-'z'?++*z:97:sprintf(z,"%d",atoi(z)-1);}

Попробуйте онлайн!

NULLВходными данными является -определенный массив '\0'-определенных строк, например {"a", "b", "c", "17", NULL}.

-7 байт благодаря @ceilingcat

Лео Тененбаум
источник
0

Perl 6 , 31 байт

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

Попробуйте онлайн!

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

Джо Кинг
источник
0

T-SQL 2012, 61 байт

Заглавные буквы нужны при вводе.

Использование табличной переменной в качестве ввода.

SELECT iif(x<'a',left(x-1,9),char((ascii(x)-64)%26+65))FROM @

Попробуйте онлайн

t-clausen.dk
источник
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в строке используется значение an , оно увеличивает символы и, как только оно попадает z, переносится в aa.
    Вывод первого символа удовлетворяет задаче стоимостью 7 байт.
  • {@/}- закрывает {@else}вышеуказанное (необязательно).
  • {@/}- закрывает {@each}вышеуказанное (необязательно).

Вы можете попробовать это на: http://sandbox.onlinephpfunctions.com/code/7533641a0aa1fc8bf4699a9c758690de186b052f

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

Исмаэль Мигель
источник
-1

Perl, 64 байта

foreach (@ARGV){$_=~m/[a-zA-Z]/?++$_:--$_;print substr $_,0,1;}
Hax0r778
источник