Una función para tomar tres enteros y devolver una lista de enteros y letras del alfabeto

10

Desafío

Tomamos tres números enteros positivos a, by ccomo entrada. Usando estos enteros, primero cree una secuencia en el rango [0, c](inclusive en ambos extremos), en pasos de b. Por ejemplo, para a=4, b=2, c=100, la secuencia sería [0,2,4,...,96,98,100].

Para cada número en esta secuencia que es divisible entre a, reemplácelo con la siguiente letra del alfabeto en minúscula, comenzando con la letra 'a' y volviendo a 'a' después de llegar a 'z'.

Ejemplo:

Entrada: a=4, b=2, c=100
Salida:a2b6c10d14e18f22g26h30i34j38k42l46m50n54o58p62q66r70s74t78u82v86w90x94y98z

Reglas de desafío:

  • Puede suponer que a, by cson enteros positivos solamente, donde b ≤ a ≤ c.
  • Puede suponer que aes un múltiplo de b.
  • Puede suponer que ces divisible por b.
  • La salida preferida es una sola cadena concatenada como la anterior, pero una lista / matriz también es aceptable.

Casos de prueba:

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

Realmente me gustaría ver una respuesta en PHP , pero este desafío está abierto a cualquier lenguaje. Este es , por lo que la respuesta debe ser lo más breve posible. Se aplican reglas estándar para funciones / programas y las lagunas predeterminadas están prohibidas .

Mochesane
fuente
1
También considere usar The Sandbox para obtener consejos y comentarios sobre preguntas antes de publicarlo en main.
Jo King
3
Hola bienvenido a PPCG! Aunque me gusta el desafío en sí, la descripción carece de muchas cosas. Como mencionó @JoKing Una etiqueta ganadora primaria es obligatoria, donde [codegolf]es la más común que recomendaría. También mencionado por JoKing, no se recomienda hacerlo específico del idioma. Es mejor abrirlo a todos los idiomas. En cuanto al desafío en sí, especifique un poco más y agregue algunos casos de prueba más. Según el ejemplo, puedo ver que el rango es [0,c], pero esto debería quedar claro sin mirar el ejemplo.
Kevin Cruijssen
1
Creo que todo lo que tienes que hacer es cambiar el título a algo más descriptivo y esto es bueno para empezar
Jo King
1
Me tomé la libertad de arreglar tu desafío para que pueda volver a abrirse. La próxima vez, utilice el Sandbox como se recomienda para perfeccionar un desafío antes de publicarlo en el menú principal. Eche un vistazo a lo que he editado para que sepa esto para futuros desafíos. Si algo es incorrecto o si malinterpreto algo, puede editarlo nuevamente.
Kevin Cruijssen
55
Parece que ninguno de sus casos de prueba se envuelve de 'z'a 'a'. ¿Podría incluir uno que sí lo haga?
OOBalance

Respuestas:

8

PHP , 67 bytes

En primer lugar, ¡gracias por publicar un desafío tan genial! Realmente disfruté resolverlo :) Ahora, aquí está mi solución de 67 bytes:

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

Para ejecutarlo:

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

O Pruébelo en línea!


Aquí está la misma solución sin pretensiones y con comentarios explicativos:

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

Hice una solución de 60 bytes, pero no se ajusta :(

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

Pruébalo en línea!

Ethan
fuente
6

Japt , 15 bytes

;0ôWV £CgX/U ªX

¡Pruébalo en línea!

Explicación

;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
fuente
1
14 bytes tomando entrada en el orden c,a,b.
Shaggy
5

R , 65 63 bytes

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

Pruébalo en línea!

¡2 bytes guardados gracias a JayCe!

Devuelve una lista de cadenas, ya que R obligará a los números a cadenas. Para imprimir, simplemente reemplace el final zcon cat(z,sep="").

Giuseppe
fuente
Parece que l=no se requiere. TIO
JayCe
@ JayCe ah, por supuesto. Lo puse allí para evitar que tenga que generar demasiados valores, ¡pero no es golfístico hacerlo!
Giuseppe
5

Clojure, 84 79 77 bytes

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

Dando un poco de amor a Lisp

Pruébalo en línea!

(-7 bytes gracias a @NikoNyrh!)

Lispy Louie
fuente
Bienvenido a PPCG! ¿Sabe qué debe agregarse para llamar a la función e imprimir el resultado en Probar en línea ?
Laikoni
1
@Laikoni Agregué un "Pruébelo en línea" a mi publicación. También corregí un error en mi código, ¡así que gracias por recordármelo!
Lispy Louie
Buen trabajo :) puede guardar 3 bytes si realiza la función externa mediante #(...)y utiliza fnpara expresar la interna. Mientras lo hace, puede reemplazarlo mapcon forconstruir y guardar más 4 bytes.
NikoNyrh
@NikoNyrh buena observación!
Lispy Louie
Y %1puede ser reemplazado por %;)
NikoNyrh
3

Java 10, 93 83 bytes

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

Pruébelo en línea aquí . Gracias a Scrooble por jugar al golf 10 bytes.

Sin 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
fuente
3

Perl 6 ,  60  50 bytes

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

Pruébalo

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

Pruébalo

{  # 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
fuente
Está perdiendo un byte usando ->\a,\b,\c: use just $^aetc. Y chr 97+$++%26es bastante más corto que ("a".."z")[$++%26]. Finalmente, puede omitir la concatenación porque el desafío no lo requiere. Eso ahorraría 10 bytes en total, dejando 50
Ramillies
3

05AB1E , 17 15 bytes

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

-2 bytes gracias a @MagicOctopusUrn .

Toma la entrada en el orden bca.

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

/               # 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
fuente
1
Esto parece estar funcionando, pero qué idioma es este, por favor. ¿Y puedo dividirlo en una función php y cómo?
Mochesane
1
El idioma es 05AB1E. Un enlace al github y está en el título de mi publicación. Y me temo que este lenguaje es completamente diferente al PHP. 05AB1E está diseñado para codegolfing, mientras que PHP es un preprocesador de hipertexto para el desarrollo web. Yo recomendaría editar la descripción del desafío y ponerla a disposición para todos los idiomas, pero declare que prefiere una respuesta PHP. Una vez que se vuelve a abrir, estoy seguro de que alguien experto en PHP es capaz de dar una respuesta de código de golf. Si necesita ayuda para editar / solucionar su desafío, hágamelo saber.
Kevin Cruijssen
1
/ݹ*vyD³ÖiA¾è¼}?es 16, solo duplica el en ylugar de usar ë, lo ?que ignorará si empuja un alfabeto char. En realidad, /ݹ*εD³ÖiA¾è¼}?funciona para 15 pares, porque estamos sobreescribiendo la matriz de salida, entonces puede vincular el ganador actual> :).
Urna mágica del pulpo
@MagicOctopusUrn ¡Gracias! :) Olvidé lo implícito ë.
Kevin Cruijssen
2

CJam , 23 bytes

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

Pruébalo en línea!

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'

Leer la entrada como b a cy soltarla @sería de 22 bytes (no estoy seguro si eso es válido).

Lynn
fuente
2

Python 2 , 65 63 bytes

Devuelve una lista, ya que el OP dijo que es aceptable.

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

Pruébalo en línea!


Versiones anteriores utilizadas durante el proceso creativo (trabajando hacia atrás):

84 bytes

Devuelve una expresión generadora.

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 bytes

Utiliza un generador para el alfabeto y devuelve una lista.

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
fuente
Ah bien. Esa no era una opción cuando estaba usando next. Agradable.
mbomb007
1

PHP , 79 bytes

Nota: No es muy bueno en PHP

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

Pruébalo en línea!


PHP , 84 bytes

Este es el mismo código anterior solo en formato de función (ya que quería una respuesta PHP tal vez esto sea mejor para usted)

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

Pruébalo en línea!

Luis felipe De jesus Munoz
fuente
1

Excel VBA, 76 bytes

Toma la entrada, a, b, y cdesde [A1], [B1]y [C1], respectivamente, a continuación, da salida a la ventana inmediata 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
fuente
1

Kotlin, 80 79 bytes

-1 gracias a 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}

Pruébalo en línea!

¡Mi primera vez jugando al golf (o haciendo cualquier otra cosa) en Kotlin! Probablemente se puede mejorar.

Muy similar a esta respuesta de Java , me di cuenta después de escribirla. Ahorre en returny pierda en el ternario por casi el mismo puntaje.

Khuldraeseth na'Barya
fuente
No es mucho, pero -1 byte omitiendo el espacio después de else.
OOBalance
1

Python3 - 111 , 101 , 98 , 94 bytes

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

Probablemente no sea el más corto, pero hay margen de mejora

Pruébalo en línea!

Braeden Smith
fuente
1
Puede eliminar algunos espaciosnext(q)if x%a==0else x for x in[y*b
mbomb007
@ mbomb007 Buena llamada, no me di cuenta de que podías hacer eso. ¡Gracias!
Braeden Smith
1
Es posible que
desee
1

Carbón de leña , 22 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicació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
Neil
fuente
1

Haskell , 71 69 bytes

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

Pruébalo en línea!


71 bytes anteriores:

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

Pruébalo en línea!

Explicación:

(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
fuente
1

CJam , 64 63 bytes ( ouch )

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

Pruébalo en línea!

Explicación

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

¡Esto definitivamente podría mejorarse, así que siéntase libre de unirse!


Cambios

¡Helen cortó un byte!

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

Al cambiar 1+a )podemos cortar un byte.

Helen
fuente
0

Clojure, 117 bytes

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

Que imperativo. : /

NikoNyrh
fuente
0

C (gcc / clang), 80 68 bytes

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

Puerto de mi respuesta Java . Pruébelo en línea aquí .

OOBalance
fuente
Sugerir en printf(L"搥挥"+!(i%a),i%a?i:i/a%26+97)lugar dei%a?printf("%d",i):putchar(i/a%26+97)
ceilingcat
0

Python 2 y 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]

Tendrás que ponerlo f=delante lambday luego llamarlo, f(a,b,c)pero estoy bastante seguro de que está permitido.

sonrad10
fuente