用相应的字母替换数字


23

创建一个将数字作为输入的函数或程序,并输出一个字符串,在该字符串中,小写和大写字母的ASCII码点被其等效字符替代。

  • 大写字母使用以下代码点: 65-90
  • 小写字母使用以下代码点: 97-122

如果输入中的任何相邻数字等于字母的代码点,则该字母应替换输出字符串中的数字。

规则:

  • 输入将是1到99位之间的正整数
  • 您可以假设仅给出有效输入
  • 您开始用整数(976-> a6而不是9L)的开头替换
  • 输入可以采用任何合适的格式(字符串表示形式可以)
  • 输出可以是任何合适的格式
  • 适用标准规则

例子:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

以字节为单位的最短代码获胜!


排行榜

这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

## Ruby, <s>104</s> <s>101</s> 96 bytes


2
“输入将是一个介于1到99位之间的正整数”在我所知道的几乎所有编程语言中,它都将是一个介于1到99位之间的字符串,因为即使是64位int最多也只能容纳19个小数位数...
TJ Crowder

3
@TJCrowder我假设他的意思是数学意义上的整数,而不是数据类型。
丹尼斯

1
@TJCrowder有效点:-)尽管,如果我没记错的话,从技术上讲1e99仍然是整数。long int还不够,您需要super long int
Stewie Griffin '02

1
@StewieGriffin:哈!:-)我敢肯定,某处有一种语言可以处理这种事情。
TJ Crowder '02

Answers:


2

Jolf,18个16字节

在这里尝试!我知道有一天,upperLower函数会很有用!替换ó΢,或仅使用解释器链接。这是在ISO 8859-7中编码的。

ρiLaΜGpwpuEdóH΅A
      pw           upper and lower
        pu         of the uppercase alphabet
     G    E        split by nothing (E = "")
    Μ      dóH     map each char to its numeric counterpart
  La               regex alternate array (e.g. La[1,2,3] => "1|2|3")
ρi            ΅A   replace input with the character code of the match (΅ is string lambda)

17

Perl,39 38字节

(为-p标志添加了1个字节。)

$"="|";s/@{[65..90,97..122]}/chr$&/ge
s/                           /          replace...
  @{[                      ]}           this string, treated as a regex:
     join"|",65..90,97..122             65|66|67|68|...|121|122
                                   /ge  ...with this string, eval()'d:
                                 $&     the entirety of the last match
                              chr       convert to char from ASCII code

Job™的正确工具。

经过一个小的优化(感谢dev-null!),它的解释已经过时了,它使它缩短了一个字节(但不太优雅):该$"变量表示join将arrray插入字符串中时要做什么,因此设置$"="|"不需要join

演示:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf

我想您可以通过设置$"="|"而不是加入来保存单个字节?
andlrc'2

例如。$"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc

@ dev-null可行,谢谢!
门把手

11

Javascript,80个字节

s=>s.replace(/6[5-9]|[78]\d|9[0789]|1[01]\d|12[012]/g,x=>String.fromCharCode(x))

此处查看正则表达式的实际操作:https//regex101.com/r/iX8bJ2/1

出于好奇,我在这里学到了一件事:

我不能改变x=>String.fromCharCode(x),以String.fromCharCode 因...


6

CJam,22个字节

q{+'[,_el^{_is@\/*}/}*

在线尝试!

背景

用相应的字母简单地替换所有出现的数字组(以我们可能选择的任何顺序)将无法遵守从左到右的规则。

相反,我们可以生成输入字符串的所有前缀,并在生成它们时尝试进行所有可能的替换。由于另一个代码点中不包含任何代码点,因此这些尝试的顺序并不重要。

例如:

67466

6     -> 6
67    -> C
 C4   -> C4
 C46  -> C46
 C467 -> C4B

C4B

怎么运行的

q                       Read all input from STDIN.
 {                  }*  Fold; push the first character, and for each subsequent
                        character, push it and do the following:
  +                       Append the character to the string on the stack.
   '[,_el^                Push the string of all ASCII letters.
                          See: http://codegolf.stackexchange.com/a/54348
          {       }/      For each ASCII letter:
           _                Push a copy of the letter.
            i               Convert to integer, i.e., compute its code point.
             s              Cast to string.
              @\            Rotate and swap.
                /           Split the modified input characters at occurrences (at
                            most one) of the string repr. of the code point.
                 *          Join, separating by the corresponding letter.

4

PHP,110 102 101 68 67个字节

相当艰巨的挑战。这是我能想到的最好的。这是一个全新的版本。

for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);

像这样运行:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • 通过使用ctype_alpha代替代替preg_matchthx 节省了8个字节
  • 通过0在字符串之前而不是检查非空字符串来节省1个字节:当输入的最后一个字符为0时,我要使用的子字符串将为“ 0”,这是虚假的,而“ 00”是真实的,因此它不会跳过打印最后一个0。
  • 通过strtr构建具有转换对的数组后使用,节省了大量的33个字节
  • 使用简短打印标签保存了一个字节

1
Yo将必须将正则表达式更改为,#[A-Z]#i因为当前表达式将很乐意允许将“ 92”转换为“ \”。或者尝试ctype_alpha()代替preg_match()。到目前为止似乎可行。
manatwork '16

"0", which is falsy, whereas "00" is truthy祝一切顺利,PHP。

3

Python 3中,211个 189 188字节

def f(c,i=0,n=""):
 while i<len(c):a=1;x=int(c[i:i+2]);a=2 if 64<x<91 or 96<x<100 else a;x=int(c[i:i+3]) if a<2 else x;a=3 if 99<x<123 else a;x=chr(x) if a>1 else c[i];n+=x;i+=a
 return n
  • 通过用\ n替换\ n节省23个字节。感谢丹尼斯

测试

在此处输入图片说明


1
如果使用;而不是换行符,则可以将整个while循环放在一行上。另外,第一行可以变为def f(c,i=0,n=""):
丹尼斯

1
a=1;a=2 if 64<x<91 or 96<x<100 else a-> a=1+(64<x<91or 96<x<100)
Seequ '16

2

Pyth,20 18字节

.Uu:G`CHHsrBG1+bZz

与@Dennis相同的算法。在手机上用Pyth编写代码要比在Jelly中容易得多。

                implicit: z=input
.U              Reduce the following lambda b, Z over z
                b is the string being built; z is the next char
   u                Reduce the following lambda G,H over +bZ
                    G is the string, H is the next letter to match
     :                  Replace
       G                in G
       ` C H            the char code of H
       H                with H
     s rB            where H takes on values:
          G              the lowercase alphabet (that's the global value of G)
          1              concatenated to its uppercased self.
     +          
       b
       Z
   z

谢谢@isaacg

在这里尝试。


您只是不能在手机上停留在该站点之外,可以...吗?
科纳·奥布莱恩

1
尤其是当我拥有所有可打印ASCII编码的奢侈时:D
lirtosiast

1
是的,可以放松一下所有的果冻……均衡饮食;)
Conor O'Brien

0

05AB1E,12 个字节

õsvy«žnvyÇy:

在线尝试验证所有测试用例

说明:

õ             # Push an empty string ""
 sv           # Swap to get the (implicit) input-string, and loop over its characters:
   y«         #  Append the current character to the string
     žn       #  Push builtin "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
       v      #  Inner loop over each of these letters:
           :  #   Replace in the string all occurrences (should be either 0 or 1 occurrence)
        yÇ    #   of the ordinal value of the current letter
          y   #   by this letter
              # (after the loops, implicitly output the top of the stack as result)

使用reduce-by的12 个字节的替代方法:

Å»«žnvyÇy:]θ

在线尝试验证所有测试用例,仅使用前10个字节即可逐步进行缩减

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.