Hàm lấy ba số nguyên và trả về danh sách các số nguyên và chữ cái


10

Thử thách

Chúng tôi mất ba số nguyên dương a, bcnhư là đầu vào. Sử dụng các số nguyên này, trước tiên hãy tạo một chuỗi trong phạm vi [0, c](bao gồm cả hai đầu), theo các bước của b. Ví dụ, cho a=4, b=2, c=100, trình tự sẽ được [0,2,4,...,96,98,100].

Đối với mỗi số trong dãy này chia hết cho a, hãy thay thế nó bằng chữ cái tiếp theo trong bảng chữ cái viết thường, bắt đầu bằng chữ 'a' và gói lại thành 'a' sau khi bạn đạt đến 'z'.

Thí dụ:

Đầu vào: a=4, b=2, c=100
Đầu ra:a2b6c10d14e18f22g26h30i34j38k42l46m50n54o58p62q66r70s74t78u82v86w90x94y98z

Quy tắc thử thách:

  • Bạn có thể giả sử rằng a, bcchỉ là số nguyên dương, ở đâu b ≤ a ≤ c.
  • Bạn có thể giả sử alà bội số của b.
  • Bạn có thể giả sử clà chia hết cho b.
  • Đầu ra ưa thích là một chuỗi nối đơn như trên, nhưng một danh sách / mảng cũng được chấp nhận.

Các trường hợp thử nghiệm:

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

Tôi thực sự muốn thấy một câu trả lời trong PHP , nhưng thách thức này là mở cho bất kỳ ngôn ngữ nào. Đây là , vì vậy câu trả lời nên càng ngắn càng tốt. Các quy tắc tiêu chuẩn áp dụng cho các chức năng / chương trình và các lỗ hổng mặc định bị cấm .


1
Đồng thời xem xét sử dụng The Sandbox để nhận lời khuyên và phản hồi về các câu hỏi trước khi đăng lên chính.
Jo King

3
Xin chào mừng đến với PPCG! Mặc dù tôi thích bản thân thử thách, nhưng phần mô tả thiếu rất nhiều thứ. Như được đề cập bởi @JoKing Một thẻ chiến thắng chính là bắt buộc, đây [codegolf]là thẻ phổ biến nhất tôi muốn giới thiệu. Cũng được đề cập bởi JoKing, làm cho ngôn ngữ cụ thể không được khuyến khích. Thay vào đó, tốt nhất là mở nó cho tất cả các ngôn ngữ. Đối với bản thân thử thách, vui lòng chỉ định thêm một chút và thêm một vài trường hợp thử nghiệm. Dựa vào ví dụ tôi có thể thấy phạm vi là [0,c], nhưng điều này sẽ rõ ràng mà không cần nhìn vào ví dụ.
Kevin Cruijssen

1
Tôi nghĩ rằng tất cả những gì bạn cần làm là thay đổi tiêu đề thành một cái gì đó mô tả hơn và điều này là tốt để đi
Jo King

1
Tôi đã tự do sửa chữa thử thách của bạn để nó có thể được mở lại. Lần tới, vui lòng sử dụng Sandbox theo lời khuyên để hoàn thiện một thử thách trước khi đăng nó vào mục chính. Xin hãy xem những gì tôi đã chỉnh sửa để bạn biết điều này cho những thách thức trong tương lai. Nếu bất cứ điều gì không chính xác hoặc tôi hiểu sai điều gì đó, vui lòng chỉnh sửa lại.
Kevin Cruijssen

5
Dường như không có trường hợp thử nghiệm nào của bạn bao quanh từ 'z'đến 'a'. Bạn có thể vui lòng bao gồm một trong đó không?
OOBalance

Câu trả lời:


8

PHP , 67 byte

Trước hết, cảm ơn bạn đã đăng một thử thách tuyệt vời như vậy! Tôi thực sự rất thích giải quyết nó :) Bây giờ, đây là giải pháp 67 byte của tôi:

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

Để chạy nó:

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

Hoặc dùng thử trực tuyến!


Đây là giải pháp tương tự vô căn cứ và với ý kiến ​​giải thích:

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

Tôi đã thực hiện một giải pháp 60 byte, nhưng nó không bao quanh :(

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

Hãy thử trực tuyến!


6

Japt , 15 byte

;0ôWV £CgX/U ªX

Kiểm tra nó trực tuyến!

Giải trình

;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 byte lấy đầu vào theo thứ tự c,a,b.
Xù xì

5

R , 65 63 byte

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

Hãy thử trực tuyến!

Lưu 2 byte nhờ JayCe!

Trả về một danh sách các chuỗi, vì R sẽ ép các số thành chuỗi. Để in, bạn chỉ cần thay thế các dấu zvới cat(z,sep="").


Có vẻ như l=không bắt buộc. TIO
JayCe

@JayCe ah tất nhiên rồi. Tôi đặt nó ở đó để ngăn nó khỏi phải tạo ra quá nhiều giá trị, nhưng thật phi thường khi làm điều đó!
Giuseppe

5

Clojure, 84 79 77 byte

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

Givin 'Lisp một chút tình yêu

Hãy thử trực tuyến!

(-7 byte nhờ @NikoNyrh!)


Chào mừng đến với PPCG! Bạn có biết những gì cần được thêm vào để gọi hàm và in kết quả trên Dùng thử trực tuyến ?
Laikoni

1
@Laikoni Tôi đã thêm "Thử trực tuyến" vào bài đăng của mình. Tôi cũng đã sửa một lỗi trong mã của mình, vì vậy cảm ơn bạn đã nhắc nhở tôi!
Lispy Louie

Tốt lắm :) bạn có thể lưu 3 byte nếu bạn thực hiện chức năng bên ngoài thông qua #(...)và sử dụng fnđể thể hiện chức năng bên trong. Trong khi bạn đang ở đó, bạn có thể thay thế mapbằng forcấu trúc và lưu thêm 4 byte.
NikoNyrh

@NikoNyrh quan sát tốt!
Lispy Louie

%1có thể được thay thế bằng %;)
NikoNyrh

3

Java 10, 93 83 byte

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

Hãy thử trực tuyến tại đây . Cảm ơn Scrooble vì đã chơi golf 10 byte.

Ung dung:

(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 byte

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

Kiểm tra nó

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

Kiểm tra nó

{  # 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'
  }
}

Bạn đang mất một byte bằng cách sử dụng ->\a,\b,\c: chỉ sử dụng $^avv Và chr 97+$++%26khá ngắn hơn một chút ("a".."z")[$++%26]. Cuối cùng, bạn có thể bỏ qua phần nối vì thử thách không yêu cầu. Điều đó sẽ tiết kiệm tổng cộng 10 byte, để lại 50
Ramillies


3

05AB1E , 17 15 byte

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

-2 byte nhờ @MagicOctopusUrn .

Đưa đầu vào theo thứ tự bca.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

/               # 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
Điều này dường như đang làm việc, nhưng ngôn ngữ này là gì xin vui lòng. Và tôi có thể chia nó thành một hàm php không và bằng cách nào?
Mochesane

1
Ngôn ngữ là 05AB1E. Một liên kết đến github và trong tiêu đề của bài viết của tôi. Và tôi e rằng ngôn ngữ này hoàn toàn khác với PHP .. 05AB1E được thiết kế để mã hóa, trong khi PHP là một bộ xử lý tiền siêu văn bản để phát triển web. Tôi sẽ khuyên bạn nên chỉnh sửa mô tả thách thức và làm cho nó có sẵn cho tất cả các ngôn ngữ, nhưng nói rõ bạn thích câu trả lời của PHP. Khi nó được mở lại, tôi chắc chắn ai đó có kỹ năng về PHP có thể đưa ra câu trả lời về môn đánh gôn cho nó. Nếu bạn cần bất kỳ trợ giúp chỉnh sửa / sửa chữa thách thức của bạn cho tôi biết.
Kevin Cruijssen

1
/ݹ*vyD³ÖiA¾è¼}?là 16, chỉ cần nhân đôi ythay vì sử dụng ë, nó ?sẽ bỏ qua nếu nó đẩy một bảng chữ cái char. Trên thực tế, /ݹ*εD³ÖiA¾è¼}?hoạt động trong 15 chẵn, vì chúng ta viết quá nhiều mảng đầu ra nên bạn có thể buộc người chiến thắng hiện tại> :).
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Cảm ơn! :) Quên về ẩn ë.
Kevin Cruijssen



2

CJam , 23 byte

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

Hãy thử trực tuyến!

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'

Đọc đầu vào là b a cvà thả xuống @sẽ là 22 byte (không chắc là có hợp lệ không).


2

Con trăn 2 , 65 63 byte

Trả về một danh sách, vì OP cho rằng có thể chấp nhận được.

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

Hãy thử trực tuyến!


Các phiên bản trước được sử dụng trong quá trình sáng tạo (hoạt động ngược):

84 byte

Trả về một biểu thức tạo.

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 byte

Sử dụng một trình tạo cho bảng chữ cái và trả về một danh sách.

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)]

À, đúng rồi. Đó không phải là một lựa chọn khi tôi đang sử dụng next. Đẹp.
mbomb007

1

PHP , 79 byte

Lưu ý: Không quá giỏi về PHP

<?for(@$l=a;$i<=($p=$argv)[3];$i+=$p[2])$o.=$i%$p[1]?$i:substr($l++,-1);echo$o;

Hãy thử trực tuyến!


PHP , 84 byte

Đây chỉ là cùng một mã ở trên chỉ ở định dạng hàm (vì bạn muốn có câu trả lời PHP có thể điều này tốt hơn cho bạn)

function f($a,$b,$c,$l=a){for(;$i<=$c;$i+=$b)$o.=$i%$a?$i:substr($l++,-1);return$o;}

Hãy thử trực tuyến!


1

VBA Excel, 76 byte

Đưa đầu vào, a, b, và ctừ [A1], [B1][C1], tương ứng sau đó kết quả đầu ra phía cửa sổ ngay lập tức 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 byte

-1 cảm ơn 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}

Hãy thử trực tuyến!

Lần đầu tiên tôi chơi golf (hoặc làm bất cứ điều gì khác) ở Kotlin! Có lẽ có thể được cải thiện.

Rất giống với câu trả lời Java này , tôi nhận ra sau khi viết nó. Tiết kiệm returnvà mất trên ternary cho gần như cùng số điểm.


Nó không nhiều, nhưng -1 byte bằng cách bỏ qua khoảng trắng sau else.
OOBalance

1

Python3 - 111 , 101 , 98 , 94 byte

q=iter(map(chr,range(97,123)))
[next(q)if x%a==0else x for x in[y*b for y in range((c+b)//b)]]

Có lẽ không phải là ngắn nhất, nhưng có chỗ để cải thiện

Hãy thử trực tuyến!


1
Bạn có thể xóa một vài khoảng trắngnext(q)if x%a==0else x for x in[y*b
mbomb007

@ mbomb007 Cuộc gọi tốt, không nhận ra bạn có thể làm điều đó. Cảm ơn!
Braeden Smith

1
Bạn có thể muốn xem Mẹo chơi gôn trong Python
mbomb007

1

Than , 22 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

Haskell , 71 69 byte

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

Hãy thử trực tuyến!


71 byte trước:

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

Hãy thử trực tuyến!

Giải trình:

(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

CJam , 64 63 byte ( ouch )

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

Hãy thử trực tuyến!

Giải trình

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

Điều này chắc chắn có thể được thực hiện tốt hơn vì vậy hãy tham gia!


Thay đổi

Helen cắt một byte!

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

Bằng cách thay đổi 1+thành )chúng ta có thể cắt bỏ một byte.



0

Clojure, 117 byte

#(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)))))

Mệnh lệnh như vậy. : /


0

C (gcc / clang), 80 68 byte

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

Cổng câu trả lời Java của tôi . Hãy thử trực tuyến tại đây .


Đề xuất printf(L"搥挥"+!(i%a),i%a?i:i/a%26+97)thay vìi%a?printf("%d",i):putchar(i/a%26+97)
trần mèo


0

Python 2 và 3 - 123 128 byte

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]

Bạn sẽ cần đặt f=trước lambdavà sau đó gọi nó với f(a,b,c)nhưng tôi khá chắc chắn rằng điều đó được cho phép.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.