数字减少而字母增加


18

随机受数字启发而字母减少

给定的混合字母和整数(例如,列表['a', 2, 3, 'b']增加由字母表中的(包装在一个位置的字母za)和减少由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还是应该继续递减计数?
恩扎尔

1
@Nzall未定义的行为。规则和说明下的第五个要点指出,输入和输出整数都适合您的语言本机int范围,因此您永远不会得到Integer.MinValue输入。
AdmBorkBork

Answers:


6

05AB1E,5个字节

<AAÀ‡

在线尝试!

<          # decrement the numbers
 A         # constant "abcdefghijklmnopqrstuvwxyz"
  AÀ       # same, but rotated left ("bcd...yza")
    ‡      # transliterate

5

Python 3,59个字节

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

在线尝试!

-1个字节感谢外长者埃里克(Erik the Outgolfer)



@EriktheOutgolfer整数与字符串比较在您的解决方案中似乎不起作用。
吉特

哦,对,您需要Python 2。
独行侠埃里克(Erik)

嗯,是的,这似乎可行。不过更换-96+8节省一个字节。
吉特

''!=i*0比我的str(i)>'9'出色工作短三个字节
Black Owl Kai

5

Perl 5(-p),17个字节

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

在线尝试!

19奖金:

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

TIO。此功能具有一些很酷的技巧,但无法击败上面简单的解决方案。


5

Ruby,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并采用mod 26。mod 26将索引26包装回0。


欢迎使用CodeGolf SE!我不是Python方面的专家,但我认为您可以将Tab交换4个空格以节省大量字节。
AdmBorkBork

我仅通过消除空格就将其增加到131个字节。可以意识到(x+27)%26与“(x+1)%26
Owl Black Owl Kai

@AdmBorkBork BlackOwlKai感谢您的帮助!我已经编辑了帖子。
asdf60367134

您可以使用三进制with str(d)==d来检查它是否是字符串,而不是依赖try / except。然后,由于您不再需要try / except,因此可以通过列表理解来完成整个工作!我会让您再想想,但您可以轻松地以这种方式获得100字节以下的内容;)
Value Ink



2

Gema,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']

在线尝试!

Gema,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不是有限的,因为它们被强制转换numericis.finite,因此是NA
朱塞佩

@朱塞佩(Giuseppe)认为这可能是些事情。即使它与is.double相同,我也需要使用它:)
MickyT


很抱歉摆脱你is.finite,我想我自己也要解决一下
Giuseppe

1
@Giuseppe非常好,不会想到Mapand 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

视网膜52 50 48 58 41 37字节

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

感谢@FryAmTheEggman -4个字节(并且提到我有一个bug:1 → -1而不是1 → 0)。
+10个字节来修复与1和的错误0。.这种令人讨厌的边缘情况使我费了好一阵子..但是现在打到41个字节了。(现在,我对注释中提到的<40字节版本@Neil@CowsQuack感到好奇。。感谢@Neil提供了将转换0-,并首先处理负值的技巧。将那些值从一元转换回整数帮了很多忙。)
显然我现在不需要边界,所以-4个字节..>>

I / O以逗号分隔。

在线尝试。

说明:

全部音译"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 -m13 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小写字母


看起来好像不是从包装za
毛茸茸的

@Shaggy Whoops,我错过了。我为+2个字节添加了一个临时修复程序
Oliver

无法找到一种方法来修复我的(至今)没有三元数的方法,这使它与我的喜好过于相似,因此我现在将其删除。o-> ¤将在这里为您节省一个字节。
粗野的

1
+2然后-1感谢Shaggy会更准确!: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",则返回"a";否则为false 。如果字符串的第一个字符是> '`'(即字母,而不是数字),则返回字符串中字符的后继字符;否则它必须是数字,因此请转换为整数,然后减去1并再次变成字符串。

编辑:-1字节感谢@cole。


对于51个字节有效吗?
科尔

@cole:是的。谢谢!
nimi

1

果冻,13个字节

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

在线尝试!

巧妙地解决 乔纳森•艾伦的

注意:这不是一个完整的程序,TIO的页脚使您可以使用命令行参数进行输入以测试该功能。


无法在输入中(或超过chr范围内)使用负片。®i‘ị®µ’e?€Øa©我相信是零的修正。
乔纳森·艾伦

@JonathanAllan Hah,我忘了在这种情况下不完全有效。具有讽刺意味的是,由于我避免在输入中~使用-1s 作为条件...而且,我将如何缩短®i‘ị®...
的Outgolfer Erik

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

dzaima / APL,21 20字节

{0::⍵-1⋄⎕l(⍳⊇1⌽⊣)⍵}¨

在线尝试!

-1感谢ngn。


(⎕l⍳⍵)⊇1⌽⎕l->⎕l(⍳⊇1⌽⊣)⍵
ngn

1

K(oK),27个字节

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

在线尝试!

-8感谢ngn和dzaima :)


1
{$[-9=@x;x-1;90=x;"A";`c$1+x]}'内联31字节的特殊情况并使用大写(并且'必须算作输入应该是列表)
dzaima

@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减去“a”的ASCII码)可以替换8为它采取模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(强制转换为字符串),然后转换回数字(单个char始终返回-1),然后与输入进行比较。如果相同,则必须为数字,然后减去1并打印。如果不相同,则必须为char,然后减去1,再与进行比较{。如果少于,请打印,否则用替换a并打印。

重复执行直到程序执行堆栈下溢。

;为了分隔1个字节,输出被分隔开(并且尾随一个)。输入以空格分隔。


0

萨克斯,17个字节

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

运行并调试

感觉应该可以做的更短一些,但是我无法抗拒使用最新发行版中的新stax功能的机会。

将整个输入视为字符串:

  1. 正则表达式用数字替换数字 eval(match) - 1。这是新功能,因为正则表达式块替换不是字符串,而是整数。
  2. 正则表达式通过围绕小写字母对它们进行环翻译来替换字母行。


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;}

复制链接

取消高尔夫:

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

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);}

在线尝试!

输入是-terminated字符串的NULL-terminated数组'\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 @

在线尝试


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;}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.