Une fonction pour prendre trois entiers et retourner une liste d'entiers et de lettres alphabétiques

10

Défi

Nous prenons trois entiers positifs a, bet cen entrée. À l'aide de ces nombres entiers, créez d'abord une séquence dans la plage [0, c](incluse aux deux extrémités), par étapes de b. Par exemple, pour a=4, b=2, c=100, la séquence serait [0,2,4,...,96,98,100].

Pour chaque nombre de cette séquence divisible par a, remplacez-le par la lettre suivante de l'alphabet minuscule, en commençant par la lettre «a» et en revenant à «a» après avoir atteint «z».

Exemple:

Entrée: a=4, b=2, c=100
Sortie:a2b6c10d14e18f22g26h30i34j38k42l46m50n54o58p62q66r70s74t78u82v86w90x94y98z

Règles du défi:

  • Vous pouvez supposer que a, bet csont uniquement des entiers positifs, où b ≤ a ≤ c.
  • Vous pouvez supposer qu'il as'agit d'un multiple de b.
  • Vous pouvez supposer qu'il cest divisible par b.
  • La sortie préférée est une seule chaîne concaténée comme ci-dessus, mais une liste / tableau est également acceptable.

Cas de test:

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

J'aimerais vraiment voir une réponse en PHP , mais ce défi est ouvert à tous les langages. Il s'agit de , donc la réponse doit être aussi courte que possible. Les règles standard s'appliquent aux fonctions / programmes et les failles par défaut sont interdites .

Mochesane
la source
1
Pensez également à utiliser The Sandbox pour obtenir des conseils et des commentaires sur les questions avant de les publier sur main.
Jo King
3
Salut, bienvenue à PPCG! Bien que j'aime le défi en lui-même, la description manque de beaucoup de choses. Comme mentionné par @JoKing Une balise gagnante principale est obligatoire, où [codegolf]est la plus courante que je recommanderais. Également mentionné par JoKing, le rendre spécifique au langage n'est pas recommandé. Il est préférable de l'ouvrir à toutes les langues à la place. En ce qui concerne le défi lui-même, veuillez en préciser un peu plus et ajouter quelques cas de test supplémentaires. Sur la base de l'exemple, je peux voir que la plage est [0,c], mais cela devrait être clair sans regarder l'exemple.
Kevin Cruijssen
1
Je pense que tout ce que vous devez faire est de changer le titre en quelque chose de plus descriptif et c'est bon d'y aller
Jo King
1
J'ai pris la liberté de fixer votre défi afin qu'il puisse être rouvert. La prochaine fois, veuillez utiliser le Sandbox comme conseillé pour perfectionner un défi avant de le publier dans le principal. Veuillez jeter un œil à ce que j'ai édité afin que vous le sachiez pour les défis à venir. Si quelque chose est incorrect ou que j'interprète mal quelque chose, n'hésitez pas à le modifier à nouveau.
Kevin Cruijssen
5
Il semble qu'aucun de vos cas de test ne passe de 'z'à 'a'. Pourriez-vous s'il vous plaît en inclure un qui le fait?
OOBalance

Réponses:

8

PHP , 67 octets

Tout d'abord, merci d'avoir publié un défi aussi cool! J'ai vraiment apprécié de le résoudre :) Maintenant, voici ma solution de 67 octets:

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

Pour l'exécuter:

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

Ou essayez-le en ligne!


Voici la même solution non golfée et avec des commentaires d'explication:

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

J'ai fait une solution de 60 octets, mais elle ne se termine pas :(

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

Essayez-le en ligne!

Ethan
la source
6

Japt , 15 octets

;0ôWV £CgX/U ªX

Testez-le en ligne!

Explication

;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
ETHproductions
la source
1
14 octets prenant une entrée dans la commande c,a,b.
Shaggy
5

R , 65 63 octets

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

Essayez-le en ligne!

2 octets économisés grâce à JayCe!

Renvoie une liste de chaînes, car R contraindra les nombres aux chaînes. Pour imprimer, remplacez simplement la fin zpar cat(z,sep="").

Giuseppe
la source
Il semble que le l=n'est pas requis. TIO
JayCe
@JayCe ah bien sûr. Je l'ai mis là pour l'empêcher d'avoir à générer trop de valeurs, mais ce n'est pas golfique de le faire!
Giuseppe
5

Clojure, 84 79 77 octets

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

Donner un peu d'amour à Lisp

Essayez-le en ligne!

(-7 octets grâce à @NikoNyrh!)

Lispy Louie
la source
Bienvenue chez PPCG! Savez-vous ce qui doit être ajouté pour appeler la fonction et imprimer le résultat sur Essayez-le en ligne ?
Laikoni
1
@Laikoni J'ai ajouté un "Essayez-le en ligne" à mon message. J'ai également corrigé une erreur dans mon code, alors merci de me le rappeler!
Lispy Louie
Bon travail :) vous pouvez économiser 3 octets si vous effectuez la fonction externe via #(...)et utilisez fnpour exprimer la fonction interne. Pendant que vous y êtes, vous pouvez le remplacer mappar la forconstruction et économiser encore 4 octets.
NikoNyrh
@NikoNyrh bonne observation!
Lispy Louie
Et %1peut être remplacé par %;)
NikoNyrh
3

Java 10, 93 83 octets

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

Essayez-le en ligne ici . Merci à Scrooble pour avoir joué au golf 10 octets.

Non golfé:

(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
}
OOBalance
la source
3

Perl 6 ,  60  50 octets

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

Essaye-le

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

Essaye-le

{  # 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'
  }
}
Brad Gilbert b2gills
la source
Vous perdez un octet en utilisant ->\a,\b,\c: utilisez simplement $^aetc. Et chr 97+$++%26est un peu plus court que ("a".."z")[$++%26]. Enfin, vous pouvez omettre la concaténation car le défi ne l'exige pas. Cela économiserait 10 octets au total, ce qui en laisserait 50
Ramillies
3

05AB1E , 17 15 octets

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

-2 octets grâce à @MagicOctopusUrn .

Prend l'entrée dans l'ordre bca.

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

/               # 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)
Kevin Cruijssen
la source
1
Cela semble fonctionner, mais dans quelle langue est-ce s'il vous plaît. Et puis-je le décomposer en une fonction php et comment?
Mochesane
1
La langue est 05AB1E. Un lien vers le github et se trouve dans le titre de mon message. Et j'ai bien peur que ce langage soit complètement différent de PHP. 05AB1E est conçu pour le codegolfing, alors que PHP est un pré-processeur hypertexte pour le développement web. Je conseillerais de modifier la description du défi et de la rendre disponible pour toutes les langues, mais indiquez que vous préférez une réponse PHP. Une fois qu'il est rouvert, je suis sûr que quelqu'un qui maîtrise PHP est en mesure de faire une réponse au code-golf. Si vous avez besoin d'aide pour modifier / corriger votre défi, faites-le moi savoir.
Kevin Cruijssen
1
/ݹ*vyD³ÖiA¾è¼}?est 16, reproduit juste le yau lieu d'utiliser ë, qui ?ignorera s'il pousse un caractère alphabétique. En fait, /ݹ*εD³ÖiA¾è¼}?fonctionne même pour 15, car nous remplaçons le tableau de sortie, vous pouvez alors lier le gagnant actuel> :).
Urne Magic Octopus
@MagicOctopusUrn Merci! :) Oublié l'implicite ë.
Kevin Cruijssen
2

Python 2, 80 70 octets

Renvoie une liste, puisque l'OP a dit que c'était acceptable.

lambda a,b,c:map(lambda x:x if x%a else chr(x/a%26+97),range(0,c+1,b))

Approche très différente de l' autre réponse Python 2 .

Essayez-le en ligne!

Khuldraeseth na'Barya
la source
2

CJam , 23 octets

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

Essayez-le en ligne!

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'

La lecture de l'entrée en tant que b a cet la suppression du @serait de 22 octets (je ne sais pas si c'est valide).

Lynn
la source
2

Python 2 , 65 63 octets

Renvoie une liste, puisque l'OP a dit que c'était acceptable.

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

Essayez-le en ligne!


Versions précédentes utilisées pendant le processus de création (travail en arrière):

84 octets

Renvoie une expression de générateur.

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 octets

Utilise un générateur pour l'alphabet et renvoie une liste.

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)]
mbomb007
la source
Ah, c'est vrai. Ce n'était pas une option lorsque j'utilisais next. Agréable.
mbomb007
1

PHP , 79 octets

Remarque: Pas trop bon en PHP

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

Essayez-le en ligne!


PHP , 84 octets

C'est juste le même code ci-dessus juste au format de fonction (puisque vous vouliez une réponse PHP, c'est peut-être mieux pour vous)

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

Essayez-le en ligne!

Luis felipe De jesus Munoz
la source
1

Excel VBA, 76 octets

Prend entrée a, bet cà partir de [A1], [B1]et [C1]respectivement délivre alors à la fenêtre immédiate VBE.

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

Kotlin, 80 79 octets

-1 grâce à 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}

Essayez-le en ligne!

Ma première fois jouer au golf (ou faire autre chose) à Kotlin! Peut probablement être amélioré.

Très similaire à cette réponse Java , j'ai réalisé après l'avoir écrite. Économisez sur returnet perdez sur le ternaire pour presque le même score.

Khuldraeseth na'Barya
la source
Ce n'est pas beaucoup, mais -1 octet en omettant l'espace après le else.
OOBalance
1

Python3 - 111 , 101 , 98 , 94 octets

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

Probablement pas le plus court, mais il y a place à amélioration

Essayez-le en ligne!

Braeden Smith
la source
1
Vous pouvez supprimer quelques espacesnext(q)if x%a==0else x for x in[y*b
mbomb007
@ mbomb007 Bon appel, je ne savais pas que tu pouvais faire ça. Merci!
Braeden Smith
1
Vous aimerez peut-être consulter les conseils pour jouer au golf en Python
mbomb007
1

Fusain , 22 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

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
Neil
la source
1

Haskell , 71 69 octets

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

Essayez-le en ligne!


71 octets précédents:

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

Essayez-le en ligne!

Explication:

(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
Laikoni
la source
1

CJam , 64 63 octets ( aïe )

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

Essayez-le en ligne!

Explication

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

Cela pourrait certainement être amélioré, alors n'hésitez pas à nous rejoindre!


Changements

Helen a coupé un octet!

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

En changeant 1+en, )nous pouvons couper un octet.

Hélène
la source
0

Clojure, 117 octets

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

Un tel impératif. : /

NikoNyrh
la source
0

C (gcc / clang), 80 68 octets

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

Port de ma réponse Java . Essayez-le en ligne ici .

OOBalance
la source
Suggérer à la printf(L"搥挥"+!(i%a),i%a?i:i/a%26+97)place dei%a?printf("%d",i):putchar(i/a%26+97)
plafondcat
0

Python 2 et 3 - 123 128 octets

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]

Vous devrez vous mettre f=devant le lambda, puis l'appeler avec, f(a,b,c)mais je suis presque sûr que c'est autorisé.

sonrad10
la source