接受三个整数并返回整数和字母列表的函数


10

挑战

我们需要三个正整数ab以及c作为输入。使用这些整数,首先[0, c]以的步长在范围内(包括两端)创建一个序列b。例如,对于a=4, b=2, c=100,序列将为[0,2,4,...,96,98,100]

对于此序列中可被整除的每个数字a,将其替换为小写字母中的下一个字母,从字母“ a”开始,到“ z”后回绕到“ a”。

例:

输入:a=4, b=2, c=100
输出:a2b6c10d14e18f22g26h30i34j38k42l46m50n54o58p62q66r70s74t78u82v86w90x94y98z

挑战规则:

  • 你可以假设ab以及c只为正整数,其中b ≤ a ≤ c
  • 您可以假设a是的倍数b
  • 您可以假定c被整除b
  • 首选输出是如上所述的单个串联字符串,但是列表/数组也是可以接受的。

测试用例:

Input: a=4, b=2, c=100
Output:
a2b6c10d14e18f22g26h30i34j38k42l46m50n54o58p62q66r70s74t78u82v86w90x94y98z

Input: a=9, b=3, c=174
Output:
a36b1215c2124d3033e3942f4851g5760h6669i7578j8487k9396l102105m111114n120123o129132p138141q147150r156159s165168t174

Input: a=10, b=2, c=50
Output:
a2468b12141618c22242628d32343638e42444648f

Input: a=25, b=1, c=25
Output:
a123456789101112131415161718192021222324b

Input: a=6, b=6, c=48
Output:
abcdefghi

Input: a=6, b=3, c=48
Output: a3b9c15d21e27f33g39h45i

Input: a=2, b=1, c=100
Output: a1b3c5d7e9f11g13h15i17j19k21l23m25n27o29p31q33r35s37t39u41v43w45x47y49z51a53b55c57d59e61f63g65h67i69j71k73l75m77n79o81p83q85r87s89t91u93v95w97x99y

我真的很想看到用PHP给出的答案,但是这个挑战对任何语言都是开放的。这是,因此答案应尽可能短。标准规则适用于功能/程序,并且默认漏洞是禁止的


1
在将其发布到main之前,还可以考虑使用The Sandbox获得有关问题的建议和反馈。
Jo King

3
嗨,欢迎来到PPCG!尽管我喜欢挑战本身,但是描述中缺少很多东西。正如@JoKing所提到的,主要的获胜标记是强制性的,这[codegolf]是我推荐的最常见的标记。JoKing也提到过,不建议使其特定于语言。最好改为对所有语言开放。至于挑战本身,请多指定一些并添加一些测试用例。根据示例,我可以看到范围是[0,c],但无需查看示例即可清楚了解。
凯文·克鲁伊森

1
我认为,所有你需要做的是将标题更改为更具描述性,这是好走
乔金

1
我可以自由解决您的挑战,以便可以重新打开它。下次,请根据建议使用沙盒完成挑战,然后再将其发布到主机上。请看一下我编辑过的内容,以便您以后应对挑战。如果有任何错误或我误解了某些内容,请随时对其进行编辑。
凯文·克鲁伊森

5
似乎您的测试用例都没有从'z'到环绕'a'。你能包括一个吗?
OOBalance

Answers:


8

PHP,67字节

首先,感谢您发布如此酷的挑战!我真的很喜欢解决它:)现在,这是我的67字节解决方案:

<?for(;$i<=($p=$argv)[3];$i+=$p[2])echo$i%$p[1]?$i:chr($l++%26+97);

要运行它:

php -n <filename> {a} {b} {c}

在线尝试!


这是相同的解决方案,附带说明注释:

$a      = $argv[1];
$b      = $argv[2];
$c      = $argv[3];
$letter = 'a';
for ($i = 0; $i <= $c; $i += $b) {
    if ($i % $a) { // If $i is divisible by $a, the modulo (%) operator will return a remainder of 0, which PHP sees as a falsey value.
        echo $i;
    } else {
        $letter++;
        $letter %= 26; // Wrap $letter around to `a` after it gets to `z`.
        echo chr($letter + 97); // Use PHP's chr function to get the character. 97 is the index of `a`. http://php.net/manual/en/function.chr.php
    }
}

我做了一个60字节的解决方案,但它并没有环绕:(

<?for($l=a;$i<=($p=$argv)[3];$i+=$p[2])echo$i%$p[1]?$i:$l++;

在线尝试!


6

Japt,15个字节

;0ôWV £CgX/U ªX

在线测试!

说明

;0ôWV £CgX/U ªX    Implicit: U, V, W = inputs
;                  Reset C to the lowercase alphabet (among other variable resets).
 0ôWV              Create the inclusive range [0...W], using a step of V.
      £            Map each item X by this function:
       CgX/U         Get the character at index (X / U) in the lowercase alphabet. If X is
                     not divisible by U, this is a non-integer and the result is undefined.
             ªX      In this case (literally, if falsy), replace it with X.
                   Implicit: output result of last expression

1
14个字节按顺序输入c,a,b
毛茸茸的

5

R65 63字节

function(a,b,c,z=seq(0,c,b)){z[x]=rep(letters,sum(x<-!z%%a));z}

在线尝试!

感谢JayCe,节省了2个字节!

返回字符串列表,因为R会将数字强制转换为字符串。要进行打印,只需更换尾随zcat(z,sep="")


看起来好像l=不是必需的。TIO
JayCe

@JayCe当然是啊。我将其放在此处以防止它必须生成太多值,但是这样做实在不可行!
朱塞佩

5

Clojure,84 79 77字节

#(for[i(range 0(inc %3)%2)](if(=(mod i %1)0)(char(+(mod(/ i %1)26)(int \a)))i))

Givin'Lisp有点爱

在线尝试!

(-7个字节感谢@NikoNyrh!)


欢迎来到PPCG!您是否知道需要添加什么才能调用该函数并在“ 在线试用”上打印结果?
Laikoni '18

1
@Laikoni我在帖子中添加了“在线试用”。我还纠正了我的代码中的错误,因此感谢您提醒我!
Lispy Louie

干得好:)如果通过制作外部函数#(...)并用于fn表示内部一个,则可以节省3个字节。在使用它时,您可以替换mapforconstruct,并再保存4个字节。
NikoNyrh

@NikoNyrh好观察!
Lispy Louie,

%1可以替换为%;)
NikoNyrh

3

Java 10,93 83字节

(a,b,c)->{var r="";for(int i=0;i<=c;i+=b)r+=i%a<1?(char)(i/a%26+97):i+"";return r;}

在这里在线尝试。感谢Scrooble打高尔夫球10个字节。

取消高尔夫:

(a, b, c) -> { // lambda taking 3 integer arguments and returning a String
    var r = ""; // we build the result String in steps
    for(int i = 0; i <= c; i+=b) // loop over the range [0,c] in steps of b
        r += i % a < 1 ? (char) (i / a % 26 + 97) : "" + i; // if i is a multiple of a, append the next letter to r as a char, else append i
    return r; // return the result
}

3

Perl 6的 60  50个字节

->\a,\b,\c{[~] (0,b...c).map:{$_%a??$_!!('a'..'z')[$++%26]}}

测试一下

{$^a;(0,$^b...$^c).map:{$_%$a??$_!!chr 97+$++%26}}

测试一下

{  # bare block lambda with parameters $a,$b,$c

  $^a; # declare param $a, but don't use it
       # (so $a can be used in the inner block)

  (
    0, $^b ... $^c  # the base sequence

  ).map:            # for each of those values
  {
    $_ % $a         # is it not divisible by `$a` ( shorter than `%%` )

    ??  $_          # if it isn't divisible just return it

    !!              # otherwise return the following

        chr         # a character from the following number

          97 +      # 'a'.ord +
          $++       # self incrementing value (starts at 0)
          % 26      # wrap around back to 'a'
  }
}

您正在使用丢失一个字节->\a,\b,\c:使用just $^a等。并且chr 97+$++%26比短很多("a".."z")[$++%26]。最后,您可以省略连接,因为挑战不需要它。那将总共节省10个字节,剩下50个
Ramillies


3

05AB1E17 15 字节

/ݹ*εD³ÖiA¾è¼}?

-2个字节,感谢@MagicOctopusUrn

按顺序接受输入bca

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

说明:

/               # Divide the second (implicit) input `c` by the first (implicit) input `b`
                #  i.e. 2 and 100 → 50
 Ý              # Take the range [0, `divided_c`]
                #  i.e. 50 → [0,1,2,...,48,49,50]
  ¹*            # Multiply it with the first input `b`
                #  [0,1,2,...,48,49,50] → [0,2,4,...,96,98,100]
    εD          # For-each in this list:
      ³Öi       #  If the current number is divisible by the third input `a`:
                #   i.e. 8 and `a=4` → 1 (truthy)
                #   i.e. 10 and `a=4` → 0 (falsey)
         A      #   Push the lowercase alphabet
          ¾     #   Push the counter_variable (which starts at 0 by default)
           è    #   Index the alphabet with this counter_variable (wraps around by default)
         ¼      #   Increase the counter_variable by 1
            }   #  Close the if
             ?  #  Output without new-line
                #  (If the if was not entered, the input is implicitly output as else-case)

1
这似乎可行,但是请用什么语言。我可以将其分解为php函数吗?
Mochesane '18年

1
语言是05AB1E。指向github的链接,在我的帖子标题中。而且恐怕这种语言与PHP完全不同。05AB1E是为代码高尔夫设计的,而PHP是用于Web开发的超文本预处理器。我建议编辑挑战说明并使其适用于所有语言,但是请声明您希望使用PHP答案。重新打开它后,我确定会熟练使用PHP的人可以为它打出代码高尔夫球的答案。如果您在编辑/解决挑战方面需要帮助,请告诉我。
凯文·克鲁伊森

1
/ݹ*vyD³ÖiA¾è¼}?是16,只是复制,y而不是使用ë?如果它按字母字符,它将忽略。实际上,/ݹ*εD³ÖiA¾è¼}?甚至可以工作15个,因为我们要覆盖输出数组,那么您可以将当前赢家> :)绑定在一起。
魔术章鱼缸

@MagicOctopusUrn谢谢!:)忘记了隐式ë
凯文·克鲁伊森



2

CJam,23个字节

q~),@/f%{0W):W26%'a+t}%

在线尝试!

q~                              a b c
  ),                            a b [0…c]
    @/                          b [[0…a-1] [a…2a-1] ... […c]]
      f%                        [[0 b…a-b] [a a+b…2a-b] ... […c]]

        {0          t}%         Replace each first with:
          W):W26%'a+            ++W % 26 + 'a'

读取输入as b a c并将其删除@将是22个字节(不确定是否有效)。


2

Python 2 65 63字节

返回列表,因为OP认为可以接受。

lambda a,b,c:[[chr(n/a%26+97),n][n%a>0]for n in range(0,c+1,b)]

在线尝试!


在创作过程中使用的先前版本(向后工作):

84字节

返回生成器表达式。

def f(a,b,c,x=0):
    for n in range(0,c+1,b):yield n%a and n or chr(x%26+97);x+=n%a==0

111字节

使用生成器生成字母并返回列表。

def g(x=0):
    while 1:yield chr(x%26+97);x+=1
A=g()
f=lambda a,b,c:[n%a and n or next(A)for n in range(0,c+1,b)]

嗯对 当我使用时,这不是一个选择next。真好
mbomb007 '18


1

Excel VBA,76个字节

取输入,ab,和c[A1][B1][C1],然后分别输出到VBE即时窗口。

For i=0To[C1]Step[B1]:j=i Mod[A1]:?IIf(j,i,Chr(97+k)):k=(k-(j=0))Mod 26:Next


1

Kotlin,80 79字节

-1感谢OOBalance

{a,b,c->var s="";for(x in 0..c step b)s+=if(x%a>0)x else(x/a%26+97).toChar();s}

在线尝试!

我第一次在Kotlin打高尔夫球(或做其他事情)!大概可以改善。

这个Java答案非常相似,我在编写它后就意识到了。节省点return,输掉三元点几乎得到相同的分数。


它不是很多,但是通过省略else。之后的空格为-1字节。
OOBalance


1

木炭,22字节

NθNη⭆Φ⊕N¬﹪ιη⎇﹪ιθι§β÷ιθ

在线尝试!链接是详细版本的代码。说明:

Nθ                      Input `a`
  Nη                    Input `b`
       N                Third input (`c`)
      ⊕                 Increment
     Φ                  Filter over implicit range
           η            `b`
          ι             Current value
         ﹪              Modulo
        ¬               Not (i.e. divisible)
    ⭆                   Map over result and join
              ι         Current value
               θ        `a`
             ﹪          Modulo
            ⎇           Ternary
                ι       Current value
                    ι   Current value
                     θ  `a`
                   ÷    Divide
                  β     Predefined lowercase alphabet
                 §      Cyclically index

1

Haskell71 69字节

(a#b)c=do n<-[0,b..c];[show n,[['a'..]!!mod(div n a)26]]!!(0^mod n a)

在线尝试!


前71个字节:

(a#b)c=do n<-[0,b..c];last$show n:[[['a'..]!!mod(div n a)26]|mod n a<1]

在线尝试!

说明:

(a#b)c=                         -- given the inputs a, b and c
  do n<-[0,b..c];               -- take n from the range from 0 to c with increments of b
  last$   :[   |mod n a<1]      -- if n is not divisible by a
       show n                   -- then use n converted to a string
            [   mod(div n a)26] -- otherwise divide n by a 
             ['a'..]!!          -- and use the character at this position in the alphabet

1

CJam64 63个字节(哎哟

97:Y;riri:Bri\/),[{B*}*]{X\_@\%0={Yc\Y):Y'{i={97:Y;}&}{X\}?}fX;

在线尝试!

说明

97:Y;                                                                 Set a variable "Y" to the ASCII value of 'a' and pop the variable from the stack
     ri                                                               Read one chunk of the input (Space-delimited)
       ri:B                                                           Set a variable "B" to the next input chunk
           ri\/                                                       Divide the next input chunk by the top value in the stack (B)
               1+                                                     Add one to make the values inclusive
                 ,                                                    Turn it into an array
                   {B*}*                                              Multiply all the array values by B
                  [     ]                                             Capture the results in an array
                         {                                   }fX      Massive for loop
                          X\_@\%0=                                    If X modulo (A value) equals zero
                                  {                   }               If condition true
                                   Yc\                                Push the character with an ASCII value of Y
                                      Y):Y                            Increase the value of Y
                                          '{i=                        If Y's value is that same as that of "{" (the character after z in ASCII)
                                              {97:Y;}                 Set Y's value back to ASCII 'a'
                                                     &                If-only flag
                                                       {  }           If condition false (from X\_@\%0=)
                                                        X\            Push X onto the stack
                                                           ?          If-else flag
                                                               ;      Pop A value from the stack

绝对可以做得更好,所以随时加入!


变化

海伦砍了一个字节!

旧:97:Y;riri:Bri\/1+,[{B*}*]{X\_@\%0={Yc\Y):Y'{i={97:Y;}&}{X\}?}fX;
新:97:Y;riri:Bri\/),[{B*}*]{X\_@\%0={Yc\Y):Y'{i={97:Y;}&}{X\}?}fX;

通过更改1+为,)我们可以截断一个字节。



0

Clojure,117个字节

#(loop[R""A 0 i 0](if(> i %3)R(let[?(=(mod i %)0)](recur(str R(if ?(char(+(mod A 26)97))i))(if ?(inc A)A)(+ i %2)))))

这样势在必行。:/


0

C(gcc / clang),80 68字节

f(a,b,c,i){for(i=0;i<=c;i+=b)i%a?printf("%d",i):putchar(i/a%26+97);}

我的Java 回答的端口。在这里在线尝试。


建议printf(L"搥挥"+!(i%a),i%a?i:i/a%26+97)而不是i%a?printf("%d",i):putchar(i/a%26+97)
ceilingcat '18


0

Python 2和3 - 123个 128字节

d=-1
lambda a,b,c:[s()if i%a<1else i for i in range(0,c+1,b)]
def s():global d;d=(d+1)%26;return'abcdefghijklmnopqrstuvwxyz'[d]

您需要放在f=的前面,lambda然后用进行调用,f(a,b,c)但我敢肯定这是允许的。


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.