数数和拼写


26

编写一个程序,该程序以一个字符串作为输入,该字符串输出具有以下属性的字符串。

  • 如果字符串中的字符是大写字母(ASCII 41-5A),则该字符串将替换为一个字符串,该字符串包含每个字母,直至并包括大写的原始字母。例如,如果输入字符串为I,则输出为ABCDEFGHI
  • 同样,如果字符是小写字母(ASCII 61-7A),则该字符将以相同的方式替换。i将由替换abcdefghi
  • 如果字符是数字(ASCII 30-39),则该字符将替换为从0该数字开始直至该数字为止的每个数字。
  • 如果输入包含串联的各个字符,那么替换序列将串联在一起。
  • 所有其他字符均按原样打印。

样本输入(用空白行分隔)

AbC123

pi=3.14159

Hello, World!

样本输出

AabABC010120123

abcdefghijklmnopabcdefghi=0123.0101234010123450123456789

ABCDEFGHabcdeabcdefghijklabcdefghijklabcdefghijklmno, ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnoabcdefghijklmnopqrabcdefghijklabcd!

这是代码高尔夫,伙计。适用标准规则。以字节为单位的最短代码获胜。


要查看排行榜,请单击“显示代码段”,滚动到底部,然后单击“►运行代码段”。优化程序制作的代码段。


10
续集的想法:撤消这种转变。
ETHproductions 2015年

2
@ETHproductions也许,尽管这对我来说似乎更好,因为它可以接受任何输入。如果输入相反,该Hello, World!怎么办?
Arcturus

我们是否必须在输入字符串中支持NUL(ASCII 0x00)字符?
nimi 2015年

在这种情况下,@Eridan,代码应该打印错误或者为了进行有趣的转换而执行上面的转换。即,f(f(输入))==输入。我认为任何字母数字输入都不可能违背这种关系。
2015年

1
完全正确-我假设“如果字符串可以成为转换的结果,则将其反转。否则,应用转换。” -这是您的挑战,您可以指定自己选择的任何规则,只要(a)它们是一致的,并且(b)它们是可验证的,并且不需要全新的数学分支即可解决。旁注:辐照(b)会很有趣;您永远不会知道有人会为NP问题提出多项式时间算法,从而意外地使计算机科学发生革命性变化-只要节省4个字节,这在这里实际上是合理的。
2015年

Answers:


11

Pyth,19个字节

sXzsJ+rBG1jkUTs._MJ

在线尝试:演示测试套件

说明

sXzsJ+rBG1jkUTs._MJ
      rBG1            the list ["abc...xyz", "ABC...XYZ"]
     +    jkUT        appends the string "0123456789"
    J                 save this list of 3 strings in J
   sJ                 join the strings in J
               ._MJ   create all prefixes of the strings in J
              s       and combine them to one list
 XzsJ         s._MJ   translate the input string, chars from sJ
                      get translated to the correct prefix,
                      chars that don't appear in sJ don't get translated
s                     join all resulting translation strings

8

Python 2.7版,100个 98 96字节

a=[]
for c in raw_input():d=ord(c);a+=range(max(d&96|1,48),d)*c.isalnum()+[d]
print bytearray(a)

7

TeaScript,24字节26 28

TeaScript是用于高尔夫的JavaScript

xl(#(i=lN()1)h(ii(l)+1))

很短

在线尝试

说明

x.l(#            // Loops through each character of the string

     (i=l.N()1)  // Determines whether a character is alphanumeric
                 // Will return A-Z, a-z or 0-9 depending on result
                 // Assigns to variable i

     .h(         // Get characters up to...
        i.i      // where the character is in "i"
     ) + 1       // Increased by one
)

6

Ruby,137 87 82 76 67 55字节

取消高尔夫,但您可以看到图案。

$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}

编辑:打高尔夫球只到一个正则表达式。

编辑2:有很多额外的空间。

编辑3:感谢manatwork高尔夫球12字节!


1
$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}
manatwork

@manatwork该死的很聪明!
Peter Lenkefi

4

Python 2中,145 140 133 103 102字节

使用列表推导的不太时髦的匿名函数。我觉得逻辑应该短很多,我会尝试找出答案。

lambda k:''.join([c,`map(chr,range(48+17*(c>'@')+32*(c>'`'),ord(c)+1))`[2::5]][c.isalnum()]for c in k)

应该给出一个要使用的名称,即 f=...


@Mego哦,哈哈!不用担心:)
Kade 2015年

4

Haskell,95 91 86 60字节

c#(a:o:r)|c<a||c>o=c#r|1<2=[a..c]
c#_=[c]
f=((#"AZaz09")=<<)

用法示例:f "pi=3.14159"->"abcdefghijklmnopabcdefghi=0123.0101234010123450123456789"

工作原理:复制输入字符串中的每个字符c,除非c介于A/ Za/ z0/之间9,如果是,则取的列表[<first char in pair> ... <c>]

编辑:@Zgarb保存了许多字节。谢谢!


我认为您可以完全定义c#_=[c]和跳过t
Zgarb 2015年

@Zgarb:是的,确实s是多余的。非常感谢!
nimi 2015年

4

的JavaScript(ES6),143个 138字节

使用字符串比较来测试要使用的字符。

s=>s.replace(/[A-Z0-9]/gi,c=>(a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`,(c>'Z'?a:a.toUpperCase()).split``.filter(x=>x<=c&(x>'9'|c<'A')).join``))

在线演示。在Firefox和Chrome中进行了测试。

编辑:通过更换保存5个字节a='0123456789abcdefghijklmnopqrstuvwxyz'

a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`

3

PHP,146字节

打高尔夫球

function f($n,&$l){for(;$c=$n[$r],$b=0,$d=ord($c);$r++,$b?:$l.=$c)foreach([58=>48,91=>65,123=>97] as $m=>$i)while($d<$m&&$d>=$i)$b=$l.=chr($i++);}

修订1:将ord范围直接放入foreach。增加ord范围的最大值并更改$d<=$m$d<$m。使用for迭代字符,而不是foreachstr_split{}通过将代码移入将其全部删除for

不打高尔夫球

function f($input,&$output){
foreach (str_split($input) as $char){
  $ord = ord($char);
  $ords = [57=>48,90=>65,122=>97];
  $b = 0;
  foreach ($ords as $max=>$min){
     while ($ord<=$max&&$ord>=$min){
         $b = $max;
         $output .= chr($min);
         $min++;
     }
  }
  $b ?: $output.=$char;
}
};

$output = NULL;
$input = "pi=3.141592";
f($input,$output);
echo $output;

说明: 将字符串拆分为数组。如果ascii值落在一个范围内(对于az,AZ,0-9),则将计数器从该范围的最小值增加到char的ascii值,并附加每个值,直到达到char的ascii值。

我通过了,&$var所以输出是通过引用而不是通过return


不需要变量$ z来保存范围数组,您可以将数组文字直接放在中foreach
manatwork

尝试使用range()pastebin.com/k2tqFEgD
manatwork

@manatwork,我从声明更改为$z其他内容。range()可能会更好。以后我可能会尝试一些范围。
Reed

使用range,我得到了function f($n,&$l){$o=['a'=>'z','A'=>'Z','0'=>'9'];foreach(str_split($n) as $c){$b=0;foreach($o as $m=>$x)!($c>$m&&$c<=$x)?:$b=$l.=implode(range($m,$c));$b?:$l.=$c;}}166。–
里德

1
是的,使用重写为146个字符后效果不佳range()。但是166太长了:数组文字的$ o回来了,as关键字周围有多余的空格,join()是的别名implode()。(?,勾选引擎收录代码我前面链接显示了另一种可能性来存储范围端点)关于你提到的146个字符的解决方案,可以将分配移动到内$ C ord()电话:$d=ord($c=$n[$r])
manatwork

2

Python,143个字节

lambda s:''.join(map(chr,sum(map(lambda a,r=range:r(65,a+1)if 64<a<97else r(97,a+1)if 96<a<123else r(48,a+1)if 47<a<58else[a],map(ord,s)),[])))

在线尝试


2
您可以使用z = range来保存4个字节。
Arcturus

1
可以肯定的是,您可以用一个选项卡替换双倍空格的缩进,这样可以节省一些字节
Fund Monica的诉讼案

2

Perl 6,101位元组

这是第一遍:

sub MAIN($_ is copy){
  s:g/<[0..9]>/{(0..$/).join}/;
  s:g/<[a..z]>/{('a'..~$/).join}/;
  s:g/<[A..Z]>/{('A'..~$/).join}/;
  .say
}
sub MAIN($_ is copy){s:g/<[0..9]>/{(0..$/).join}/;s:g/<[a..z]>/{('a'..~$/).join}/;s:g/<[A..Z]>/{('A'..~$/).join}/;.say}

119


使用.trans$_删除is copy

sub MAIN($_){
  .trans(
    /\d/       => {(0..$/).join},
    /<[a..z]>/ => {('a'..~$/).join},
    /<[A..Z]>/ => {('A'..~$/).join}
  ).say
}
sub MAIN($_){.trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say}

106


作用于@*ARGS定义的,而不是直接MAIN子。
(否则与前面的示例相同)

@*ARGS[0].trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say

101


2

Scala,111 91字节

val f=(_:String).flatMap(x=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else('a'to x))

失败pi=3.14159。解决方案可以val f=(_:String).flatMap(x:String=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else if(x.isLower)('a'to x)else x.toString)是多达128个字符吗?
莱昂纳多

2

朱莉娅102 98 90 84字节

s->join([(i=Int(c);join(map(Char,(64<c<91?65:96<c<123?97:47<c<58?48:i):i)))for c=s])

这将创建一个未命名的函数,该函数接受一个字符串并返回一个字符串。

取消高尔夫:

function f(s::AbstractString)
    # For each character in the input, get the codepoint and construct
    # a range of codepoints from the appropriate starting character to
    # the current character, convert these to characters, and join them
    # into a string
    x = [(i = Int(c);
          join(map(Char, (isupper(c) ? 65 :
                          islower(c) ? 97 :
                          isdigit(c) ? 48 : i):i))
         ) for c in s]

    # Join the array of strings into a single string
    return join(x)
end

2

PowerShell,155字节

($args-split''|%{$b=$_;switch([int][char]$_){{$_-in(65..90)}{[char[]](65..$_)}{$_-in(97..122)}{[char[]](97..$_)}{$_-in(48..57)}{0..$b}default{$b}}})-join''

从技术上讲是一线客,PowerShell就是这些;-)

将输入拆分,将其传递到ForEach-Object循环中,打开强制转换字符的整数值,然后生成新char[]的适当范围。请注意,我们必须花费字节来设置临时变量,$b因为$_在switch语句中强制转换输入的行为意味着我们不能只是继续使用,$_否则会得到时髦的输出。

编辑-我应该指出,这将抛出错误,因为要馈入的第一个对象%{...}是空对象。由于默认情况下忽略 STDERR ,所以这不是问题。如果有问题,请将第一位更改为($args-split''-ne''|...以消除空对象。


2

的JavaScript(ES6),340个 258 273 271字节

a=s=>{s=s.split``;Q=x=>x.toUpperCase();A="ABCDEFGHIJKLMNOPQRSTUVWXYZ";D="0123456789";f="";for(i=0;i<s.length;i++){j=s[i];c="to"+(Q(j)==j?"Upper":"Lower")+"Case";j=Q(j);if(q=A.search(j)+1)f+=g=A.slice(0,q)[c]();else if(q=D.search(j)+1)f+=g=D.slice(0,q);else f+=j}return f}

您可以在for循环中使用模板字符串``进行拆分,而不是("")and f=i=""。您也许可以再保存一些字节。
intrepidcoder

@intrepidcoder第一个会工作。我正在检查第二个。
Conor O'Brien

2

C(269字节)

(为清楚起见添加了换行符)

#include<stdio.h>
#define F(x,y,z)if(c>=T[0][x]&&c<=T[1][y]){z}
#define L(x,y)for(i=0;i<x;++i){y}
main(){int c,i,n;char o,*T[]={"0Aa","9Zz"};while((c=getchar())!=EOF)
{F(0,2,L(3,F(i,i,o=T[0][i],n=++c-o;L(n,putchar(o++));break;))else putchar(c);)}}

不打高尔夫球

#include<stdio.h>
int main(void)
{
  int c, i, n;
  char output;
  char *char_table[] = {"0Aa", "9Zz"};

  while ((c = getchar()) != EOF) {
    if (c < '0' || c > 'z') {
      putchar(c);
    } else {
      for (i = 0; i < 3; ++i) {
        if (c >= char_table[0][i] && c <= char_table[1][i]) {
          output = char_table[0][1];
          n = c - output;
          break;
        }
      }
      for (i = 0; i <= n; ++i) {
        putchar(output);
        ++output;
      }
    }
  }
  return(0);
}

2

Perl 5中66 61(51个字节+ 1)52

在这种情况下,将正则表达式与条件运算符结合起来效果很好。
使用联接使用映射将范围合并到数组中。

say map{(/\d/?0:/[A-Z]/?A:/[a-z]/?a:$_)..$_}split//

测试

$ echo "A0C1.a3c_2!" |perl -M5.010 -n count_and_spell_up.pl
A0ABC01.a0123abc_012!

说明

say                # print output
  map{             # loop through the array that's at the end of the other mustache. 
                   # outputs an array. 
     (
        /\d/?0            # if $_ is a digit then 0
          :/[A-Z]/?A      # else, if it's an uppercase character then A
             :/[a-z]/?a   # else, if it's a lowercase character then a
               :$_        # else the current character
     )..$_         # generate a sequenced string of characters 
                   # that ends with the magic variable $_ 
                   # ($_ is currently a character from the array)
  }split//     # split the magic variable $_ (currently the input string)
               # to an array of characters

1

JavaScript(ES7),125个字节

已经有两个JS答案专注于字符串编码,所以我决定使用一种更算法的方法String.fromCharCode()

x=>x.replace(/[^\W_]/g,z=>(c=z.charCodeAt(),f=c<65?48:c<97?65:97,String.fromCharCode(...[for(i of Array(c-f).keys())i+f])+z))

使用此方法的好处是它可以使用任意数量的字符代码,因此join无需列出该列表。结果比任何其他技术都短,所以我对结果感到满意。


1

MUMPS,131个字节

u(l,h) i l'>a,a'>h f j=l:1:a s o=o_$C(j),f=0
    q
t(s) f i=1:1:$L(s) s a=$A(s,i),f=1 d u(48,57),u(65,90),u(97,122) s:f o=o_$C(a)
    q o

多亏了MUMPS的动态作用域,我确实在这里节省了不少字节。这是一个大致等效的非高尔夫版本,如果仅提供对MUMPS Prettify模块的支持,我肯定希望对语法进行突出显示。

convert(str) ;
    new asciiCode,flag,i,output
    for i=1:1:$LENGTH(str) do
    . set asciiCode=$ASCII(str,i)
    . set flag=1
    . do helper(48,57)
    . do helper(65,90)
    . do helper(97,122)
    . if 'flag do
    . . set output=output_$CHAR(asciiCode)
    quit
helper(low,high) ;
    if low'>asciiCode,asciiCode'>high do
    . for code=low:1:asciiCode do
    . . set output=output_$CHAR(code)
    . . set flag=0
    quit

1

Perl 6,78 77字节

@*ARGS[0].trans(/\d/=>{[~] 0..$/},/<:L>/=>{[~] samecase("a",~$/)..~$/}).say

知道可以结合使用'a'..'z''A'..'Z'案例来缩短它,我应该更努力地尝试。
布拉德·吉尔伯特b2gills 2015年

我建议<!-- language-all: lang-perl6 -->在之后添加,## Perl 6这样它才能正确突出显示。(此答案的更改尚未完成)
布拉德·吉尔伯特b2gills

您可以切换{[~](0..$/)}{[~] 0..$/}哪个将节省一个字节。
布拉德·吉尔伯特b2gills,2015年

0

Mathematica,102个字节

FromCharacterCode@Flatten[Which[64<#<91,65,96<#<123,97,47<#<58,48,1>0,#]~Range~#&/@ToCharacterCode@#]&

那好吧...


0

CJam,32 31字节

q_'[,_el^A,s+26/ff{_@#)<}:s\.e|

CJam解释器中在线尝试。

怎么运行的

q_    e# Push two copies of the user input.
'[,   e# Push the string of all ASCII characters up to Z.
_el   e# Push a copy and convert it to lowercase.
^     e# Perform symmetric difference this keeps only letters.
A,s+  e# Append the string "0123456789".
26/   e# Split the result into chunks of length 26.
ff{   e# For each character from input: For each chunk:
  _@  e#   Copy the chunk and rotate the character on top of it.
  #   e#   Push the index of the character in the string (-1 for not found).
  )<  e#   Increment and keep that many characters from the left of the chunk.
      e#   This pushes "" for index -1.
}
:s    e# Flatten the resulting arrays of strings.
      e# The results will be empty strings iff the character wan't alphanumeric.
\     e# Swap the result with the input string.
.e|   e# Perform vectorized logical OR.

0

Python 2中,135个 117字节

s=''
for c in raw_input():
 b=ord(c);e=b+1
 if c.isalnum():
  b=max(b&96,47)+1
 for i in range(b,e):s+=chr(i)
print s

0

PHP-291字节

将字符串传递给GET["s"]

<?php $s=$_GET["s"];$m="array_map";echo implode($m(function($v){$i="in_array";$l="implode";$r="range";global$m;$a=ord($v);if($i($a,$r(48,57)))$v=$l($m("chr",$r(48,$a)));if($i($a,$r(65,90)))$v=$l($m("chr",$r(65,$a)));if($i($a,$r(97,122)))$v=$l($m("chr",$r(97,$a)));return$v;},str_split($s)));

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.