Sebuah fungsi untuk mengambil tiga bilangan bulat dan mengembalikan daftar bilangan bulat dan huruf alfabet


10

Tantangan

Kami mengambil tiga bilangan bulat positif a, bdan csebagai masukan. Menggunakan bilangan bulat ini, pertama buat urutan dalam rentang [0, c](inklusif di kedua ujungnya), dalam langkah-langkah b. Misalnya, untuk a=4, b=2, c=100, urutannya [0,2,4,...,96,98,100].

Untuk setiap angka dalam urutan ini yang dapat habis dibagi a, gantilah dengan huruf berikutnya dalam alfabet huruf kecil, dimulai dengan huruf 'a' dan balut kembali ke 'a' setelah Anda mencapai 'z'.

Contoh:

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

Aturan tantangan:

  • Anda dapat mengasumsikan bahwa a,, bdan chanya bilangan bulat positif, di mana b ≤ a ≤ c.
  • Anda dapat menganggap aadalah kelipatan b.
  • Anda dapat menganggap dapat cdibagi oleh b.
  • Output yang disukai adalah string tunggal yang disatukan seperti di atas, tetapi daftar / array juga dapat diterima.

Kasus uji:

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

Saya benar-benar ingin melihat jawaban dalam PHP , tetapi tantangan ini terbuka untuk bahasa apa pun. Ini , jadi jawabannya harus sesingkat mungkin. Aturan standar berlaku untuk fungsi / program dan celah default dilarang .


1
Juga pertimbangkan menggunakan The Sandbox untuk mendapatkan saran dan umpan balik tentang pertanyaan sebelum mempostingnya ke utama.
Jo King

3
Hai, selamat datang di PPCG! Meskipun saya menyukai tantangan itu sendiri, uraiannya kurang banyak hal. Seperti yang disebutkan oleh @ JoKing Tag pemenang utama adalah wajib, di mana [codegolf]yang paling umum saya sarankan. Disebutkan juga oleh JoKing, membuatnya spesifik bahasa tidak dianjurkan. Lebih baik membukanya ke semua bahasa saja. Adapun tantangan itu sendiri, harap tentukan lebih sedikit dan tambahkan beberapa kasus uji lagi. Berdasarkan contoh saya dapat melihat kisarannya [0,c], tetapi ini harus jelas tanpa melihat contoh.
Kevin Cruijssen

1
Saya pikir semua yang perlu Anda lakukan adalah mengubah judul menjadi sesuatu yang lebih deskriptif dan ini bagus
Jo King

1
Saya mengambil kebebasan untuk memperbaiki tantangan Anda sehingga dapat dibuka kembali. Lain kali silakan gunakan Sandbox seperti yang disarankan untuk menyempurnakan tantangan sebelum mempostingnya di utama. Silakan lihat apa yang telah saya edit sehingga Anda tahu ini untuk tantangan di masa depan. Jika ada yang tidak benar atau saya salah mengartikan sesuatu, silakan mengeditnya lagi.
Kevin Cruijssen

5
Tampaknya tidak ada kasus uji Anda membungkus dari 'z'ke 'a'. Bisakah Anda memasukkan satu yang bisa?
OOBalance

Jawaban:


8

PHP , 67 byte

Pertama-tama, terima kasih telah memposting tantangan yang sangat keren! Saya sangat menikmati pemecahannya :) Sekarang, inilah solusi 67 byte saya:

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

Untuk menjalankannya:

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

Atau Coba online!


Inilah solusi yang sama tanpa ungolfed dan dengan komentar penjelasan:

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

Saya melakukan solusi 60 byte, tetapi tidak membungkus :(

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

Cobalah online!


6

Japt , 15 byte

;0ôWV £CgX/U ªX

Uji secara online!

Penjelasan

;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 mengambil input dalam urutan c,a,b.
Shaggy

5

R , 65 63 byte

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

Cobalah online!

2 byte disimpan berkat JayCe!

Mengembalikan daftar string, karena R akan memaksa angka ke string. Untuk mencetak, cukup ganti trailing zdengan cat(z,sep="").


Sepertinya l=tidak diperlukan. TIO
JayCe

@JayCe ah tentu saja. Saya meletakkannya di sana untuk mencegahnya harus menghasilkan terlalu banyak nilai, tetapi tidak bisa melakukannya!
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))

Berikan sedikit cinta

Cobalah online!

(-7 byte terima kasih kepada @NikoNyrh!)


Selamat datang di PPCG! Apakah Anda tahu apa yang perlu ditambahkan untuk memanggil fungsi dan mencetak hasilnya di Coba online ?
Laikoni

1
@Laikoni Saya menambahkan "Coba online" ke posting saya. Saya juga memperbaiki kesalahan dalam kode saya, jadi terima kasih telah mengingatkan saya!
Lispy Louie

Kerja bagus :) Anda dapat menyimpan 3 byte jika Anda membuat fungsi luar melalui #(...)dan gunakan fnuntuk mengekspresikan yang dalam. Ketika Anda berada di sana Anda dapat mengganti mapdengan formembangun dan menyimpan lebih lanjut 4 byte.
NikoNyrh

@NikoNyrh pengamatan yang bagus!
Lispy Louie

Dan %1dapat digantikan oleh %;)
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;}

Cobalah online sini . Terima kasih kepada Scrooble untuk bermain golf 10 byte.

Tidak Disatukan:

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

Menguji

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

Menguji

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

Anda kehilangan satu byte dengan menggunakan ->\a,\b,\c: gunakan saja $^adll. Dan chr 97+$++%26sedikit lebih pendek dari ("a".."z")[$++%26]. Akhirnya, Anda dapat menghilangkan rangkaian karena tantangan tidak memerlukannya. Itu akan menghemat 10 byte secara total, meninggalkan 50
Ramillies


3

05AB1E , 17 15 byte

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

-2 byte terima kasih kepada @MagicOctopusUrn .

Mengambil input dalam urutan bca.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

/               # 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
Ini sepertinya berhasil, tapi bahasa apa ini? Dan bisakah saya memecahnya menjadi fungsi php dan bagaimana?
Mochesane

1
Bahasanya adalah 05AB1E. Tautan ke github dan dalam judul posting saya. Dan saya khawatir bahasa ini sama sekali berbeda dari PHP .. 05AB1E dirancang untuk codegolfing, sedangkan PHP adalah pre-processor hypertext untuk pengembangan web. Saya akan menyarankan untuk mengedit deskripsi tantangan dan membuatnya tersedia untuk semua bahasa, tetapi sebutkan Anda lebih suka jawaban PHP. Setelah dibuka kembali, saya yakin seseorang yang ahli dengan PHP mampu membuat jawaban kode-golf untuk itu. Jika Anda membutuhkan bantuan dalam mengedit / memperbaiki tantangan Anda, beri tahu saya.
Kevin Cruijssen

1
/ݹ*vyD³ÖiA¾è¼}?adalah 16, hanya duplikat ydaripada menggunakan ë, yang ?akan mengabaikan jika itu mendorong karakter alfabet. Sebenarnya, /ݹ*εD³ÖiA¾è¼}?bekerja untuk 15 genap, karena kita terlalu banyak menulis array output maka Anda dapat mengikat pemenang saat ini> :).
Magic Gurita Guci

@MagicOctopusUrn Terima kasih! :) Lupa tentang yang tersirat ë.
Kevin Cruijssen



2

CJam , 23 byte

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

Cobalah online!

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'

Membaca input as b a cdan dropping @akan menjadi 22 byte (tidak yakin apakah itu valid).


2

Python 2 , 65 63 byte

Mengembalikan daftar, karena OP mengatakan itu dapat diterima.

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

Cobalah online!


Versi sebelumnya yang digunakan selama proses kreatif (bekerja mundur):

84 byte

Mengembalikan ekspresi generator.

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

Menggunakan generator untuk alfabet dan mengembalikan daftar.

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

Ah benar Itu bukan pilihan ketika saya menggunakan next. Bagus.
mbomb007

1

PHP , 79 byte

Catatan: Tidak terlalu bagus di PHP

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

Cobalah online!


PHP , 84 byte

Ini hanya kode di atas yang sama hanya dalam format fungsi (karena Anda menginginkan jawaban PHP, mungkin ini lebih baik untuk Anda)

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

Cobalah online!


1

Excel VBA, 76 byte

Mengambil input, a, b, dan cdari [A1], [B1]dan [C1]masing-masing kemudian output ke jendela segera 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 berkat 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}

Cobalah online!

Pertama kali saya bermain golf (atau melakukan hal lain) di Kotlin! Mungkin bisa diperbaiki.

Sangat mirip dengan jawaban Java ini , saya sadar setelah menulisnya. Simpan returndan kalahkan terner untuk skor yang hampir sama.


Tidak banyak, tetapi -1 byte dengan menghilangkan spasi setelah else.
OOBalance


1

Arang , 22 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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)

Cobalah online!


71 byte sebelumnya:

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

Cobalah online!

Penjelasan:

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

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

Cobalah online!

Penjelasan

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

Ini pasti bisa dibuat lebih baik sehingga merasa bebas untuk bergabung!


Perubahan

Helen memotong satu byte!

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

Dengan mengubah 1+ke )kita dapat memotong satu 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)))))

Sangat penting. : /


0

C (gcc / dentang), 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);}

Port jawaban Java saya . Cobalah online di sini .


Sarankan printf(L"搥挥"+!(i%a),i%a?i:i/a%26+97)alih-alihi%a?printf("%d",i):putchar(i/a%26+97)
ceilingcat


0

Python 2 dan 3 - 123 128 Bytes

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]

Anda harus meletakkannya f=di depan lambdadan kemudian menyebutnya dengan f(a,b,c)tetapi saya cukup yakin itu diizinkan.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.