Üç tamsayı alma ve bir tamsayılar ve alfabe harfleri listesi döndürme işlevi


10

Meydan okuma

Biz üç pozitif tamsayılar almak a, bve cgirdi olarak. Bu tamsayıları kullanarak, önce [0, c]adımda (her iki uçta dahil) bir dizi oluşturun b. Örneğin a=4, b=2, c=100, sıra, olacaktır [0,2,4,...,96,98,100].

Bu dizideki bölünebilen her sayı için, a'a' harfinden başlayıp 'z' harfine ulaştıktan sonra 'a' harfine geri sararak, küçük harfli alfabe içindeki bir sonraki harfle değiştirin.

Misal:

Giriş: a=4, b=2, c=100
Çıkış:a2b6c10d14e18f22g26h30i34j38k42l46m50n54o58p62q66r70s74t78u82v86w90x94y98z

Zorluk kuralları:

  • Sen varsayabiliriz a, bve c, nerede sadece pozitif tamsayılar vardır b ≤ a ≤ c.
  • aBir katı olduğunu varsayabilirsiniz b.
  • cİle bölünebilir olduğunu varsayabilirsiniz b.
  • Tercih edilen çıktı, yukarıdaki gibi tek bir birleştirilmiş dizedir, ancak bir liste / dizi de kabul edilebilir.

Test senaryoları:

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

Gerçekten PHP'de bir cevap görmek istiyorum , ama bu meydan okuma herhangi bir dile açıktır. Bu , bu yüzden cevap mümkün olduğunca kısa olmalı. Fonksiyonlar / programlar için standart kurallar geçerlidir ve varsayılan boşluklar yasaktır .


1
Ayrıca , soruları ana sayfaya göndermeden önce tavsiye ve geri bildirim almak için Sandbox'ı kullanmayı düşünün .
Jo King

3
Merhaba PPCG'ye hoş geldiniz! Zorluğun kendisini sevmeme rağmen, açıklama çok şey eksik. @JoKing tarafından belirtildiği gibi Birincil kazanan etiket zorunludur, [codegolf]en çok tavsiye ettiğim etikettir . JoKing tarafından da belirtildiği gibi, dile özgü yapılması önerilmez. Bunun yerine tüm dillere açmak en iyisidir. Mücadelenin kendisine gelince, lütfen biraz daha belirtin ve birkaç test örneği ekleyin. Örneğe göre aralığın olduğunu görebiliyorum [0,c], ancak örneğe bakmadan bu açık olmalı.
Kevin Cruijssen

1
Tek yapmanız gereken başlığı daha açıklayıcı bir şeye değiştirmek ve bu gitmek iyi
Jo King

1
Zorluğunuzu tekrar çözme özgürlüğünü aldım, böylece yeniden açılabilir. Bir dahaki sefere, Sandbox'ı ana olarak göndermeden önce bir meydan okumayı mükemmelleştirmek için tavsiye edildiği gibi kullanın. Gelecekteki zorluklar için bunu bilmeniz için lütfen düzenlediğim şeye göz atın. Bir şey yanlışsa veya bir şeyi yanlış yorumlarsam, tekrar düzenlemekten çekinmeyin.
Kevin Cruijssen

5
Sizin test olguların hiçbiri etrafına sarılmak gibi görünüyor 'z'için 'a'. Lütfen bir tane ekler misiniz?
OOBalance

Yanıtlar:


8

PHP , 67 bayt

Her şeyden önce, böyle havalı bir meydan okuma gönderdiğiniz için teşekkürler! Çözmekten gerçekten keyif aldım :) Şimdi, 67 baytlık çözümüm:

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

Çalıştırmak için:

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

Veya çevrimiçi deneyin!


İşte aynı çözüm çözülmemiş ve açıklama yorumlarıyla:

$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 baytlık bir çözüm yaptım, ancak etrafına sarılmıyor :(

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

Çevrimiçi deneyin!


6

Japt , 15 bayt

;0ôWV £CgX/U ªX

Çevrimiçi test edin!

açıklama

;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
Sıralı girdi alan 14 baytc,a,b .
Shaggy

5

R , 65 63 bayt

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

Çevrimiçi deneyin!

JayCe sayesinde 2 byte tasarruf!

R sayıları dizelere zorlayacağından, bir dize listesi döndürür. Yazdırmak için, arkadaki zile değiştirin cat(z,sep="").


l=Gerekli değil gibi görünüyor . TIO
JayCe

@JayCe ah tabii. Çok fazla değer üretmesini önlemek için oraya koydum, ama bunu yapmak golf için değil!
Giuseppe

5

Clojure, 84 79 77 bayt

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

Lisp'e küçük bir aşk ver

Çevrimiçi deneyin!

(@NikoNyrh sayesinde -7 bayt!)


PPCG'ye Hoşgeldiniz! İşlevi çağırmak ve sonucu yazdırmayı çevrimiçi denemek için nelerin eklenmesi gerektiğini biliyor musunuz ?
Laikoni

1
@Laikoni Yazıma bir "Çevrimiçi deneyin" i ekledim. Ayrıca kodumdaki bir hatayı düzelttim, bu yüzden hatırlattığınız için teşekkürler!
Lispy Louie

İyi iş :) dış fonksiyonu üzerinden yapar ve iç işlevini ifade etmek için #(...)kullanırsanız 3 bayt kaydedebilirsiniz fn. Siz oradayken yapı mapile değiştirebilir forve 4 bayt daha kaydedebilirsiniz.
NikoNyrh

@NikoNyrh iyi gözlem!
Lispy Louie

Ve %1değiştirilebilir %;)
NikoNyrh

3

Java 10, 93 83 bayt

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

Burada çevrimiçi deneyin . Scrooble'a 10 bayt golf yaptığı için teşekkürler .

Ungolfed:

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

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

Dene

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

Dene

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

Kullanarak bir bayt kaybediyorsunuz ->\a,\b,\c: adil $^avb kullanın . Ve chr 97+$++%26biraz daha kısadır ("a".."z")[$++%26]. Son olarak, meydan okuma gerektirmediğinden birleştirme işlemini atlayabilirsiniz. Bu, toplamda 10 bayt tasarruf eder, 50
Ramillies


3

05AB1E , 17 15 bayt

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

@MagicOctopusUrn sayesinde -2 bayt .

Girdileri sırayla alır bca.

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

/               # 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
Bu işe yarıyor gibi görünüyor, ama bu hangi dil lütfen. Ve ben bir php fonksiyonu içine kırmak ve nasıl?
Mochesane

1
Dil 05AB1E'dir. Github bağlantısı ve yazımın başlığında. Ve korkarım ki bu dil PHP'den tamamen farklı .. 05AB1E kod golf için tasarlanmışken, PHP web geliştirme için bir hipermetin ön işlemcisidir. Zorluk açıklamasını düzenlemenizi ve tüm diller için kullanılabilir hale getirmenizi tavsiye ederim, ancak bir PHP cevabı tercih ettiğinizi belirtin. Yeniden açıldıktan sonra, PHP ile yetenekli birinin bunun için bir kod golf cevabı yapabildiğinden eminim. Sorununuzu düzenlemek / düzeltmek için herhangi bir yardıma ihtiyacınız olursa bana bildirin.
Kevin Cruijssen

1
/ݹ*vyD³ÖiA¾è¼}?Sadece çoğaltan, 16 ykullanmak yerine ë, hangi ?bir alfabe kömürü iter eğer göz ardı eder. Aslında, /ݹ*εD³ÖiA¾è¼}?15 bile çalışıyor, çünkü çıkış dizisinin üzerine yazıyoruz, o zaman mevcut kazananı bağlayabilirsiniz> :).
Sihirli Ahtapot Urn

@MagicOctopusUrn Teşekkürler! :) Örtükleri unuttum ë.
Kevin Cruijssen



2

CJam , 23 bayt

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

Çevrimiçi deneyin!

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'

Girişi okurken b a cve atmak @22 bayt olur (bunun geçerli olup olmadığından emin değildir).


2

Python 2 , 65 63 bayt

OP kabul edilebilir olduğunu söylediğinden bir liste döndürür.

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

Çevrimiçi deneyin!


Reklam öğesi oluşturma işlemi sırasında kullanılan önceki sürümler (geriye doğru çalışma):

84 bayt

Bir jeneratör ifadesi döndürür.

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 bayt

Alfabe için bir jeneratör kullanır ve bir liste döndürür.

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 doğru. Ben kullanırken bu bir seçenek değildi next. Güzel.
mbomb007

1

PHP , 79 bayt

Not: PHP'de çok iyi değil

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

Çevrimiçi deneyin!


PHP , 84 bayt

Bu sadece yukarıdaki kod sadece fonksiyon formatında aynıdır (çünkü bir PHP cevap istedim belki bu sizin için daha iyi)

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

Çevrimiçi deneyin!


1

Excel VBA, 76 bayt

Giriş, alır a, bve cgelen [A1], [B1]ve [C1], sırası ile, sonra vbe hemen pencerede verir.

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 bayt

-1 sayesinde 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}

Çevrimiçi deneyin!

Benim ilk kez Golf (veya başka bir şey yapıyor) Kotlin! Muhtemelen geliştirilebilir.

Bu Java cevabına çok benzer şekilde , yazdıktan sonra fark ettim. Tasarruf edin returnve neredeyse aynı puan için üçlüde kaybedin.


Çok değil, ancak -1 bayt else.
OOBalance


1

Kömür , 22 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

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 bayt

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

Çevrimiçi deneyin!


Önceki 71 bayt:

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

Çevrimiçi deneyin!

Açıklama:

(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 bayt ( ah )

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

Çevrimiçi deneyin!

açıklama

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

Bu kesinlikle daha iyi yapılabilir yani katılmak için çekinmeyin!


değişiklikler

Helen bir bayt kesti!

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

Değiştirerek 1+için )bir byte kesebilirsiniz.



0

Clojure, 117 bayt

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

Böyle bir zorunluluk. : /


0

C (gcc / clang), 80 68 bayt

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

Java yanıtımın bağlantı noktası . Burada çevrimiçi deneyin .


printf(L"搥挥"+!(i%a),i%a?i:i/a%26+97)Bunun yerine öneri%a?printf("%d",i):putchar(i/a%26+97)
ceilingcat


0

Python - 2 ve 3'de 123 128 Bayt

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]

Bunun f=önüne koymanız lambdave sonra çağırmanız gerekir, f(a,b,c)ancak buna izin verildiğinden eminim.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.