Una funzione per prendere tre numeri interi e restituire un elenco di numeri interi e lettere alfabetiche


10

Sfida

Prendiamo tre interi positivi a, be ccome input. Usando questi numeri interi, crea prima una sequenza nell'intervallo [0, c](inclusivo su entrambe le estremità), a passi di b. Ad esempio, per a=4, b=2, c=100, la sequenza sarebbe [0,2,4,...,96,98,100].

Per ogni numero in questa sequenza che è divisibile per a, sostituiscilo con la lettera successiva dell'alfabeto minuscolo, iniziando con la lettera 'a' e tornando indietro a 'a' dopo aver raggiunto 'z'.

Esempio:

Ingresso: a=4, b=2, c=100
Uscita:a2b6c10d14e18f22g26h30i34j38k42l46m50n54o58p62q66r70s74t78u82v86w90x94y98z

Regole della sfida:

  • Puoi supporre che a, be csono solo numeri interi positivi, dove b ≤ a ≤ c.
  • Puoi presumere che asia un multiplo di b.
  • Puoi presumere che csia divisibile per b.
  • L'output preferito è una singola stringa concatenata come sopra, ma è accettabile anche un elenco / array.

Casi 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

Mi piacerebbe davvero vedere una risposta in PHP , ma questa sfida è aperta a qualsiasi lingua. Questo è , quindi la risposta dovrebbe essere il più breve possibile. Si applicano regole standard per funzioni / programmi e sono vietate le scappatoie predefinite .


1
Prendi anche in considerazione l'utilizzo di The Sandbox per ottenere consigli e feedback sulle domande prima di pubblicarlo sulla pagina principale.
Jo King,

3
Ciao benvenuto in PPCG! Sebbene mi piaccia la sfida stessa, la descrizione manca di molte cose. Come menzionato da @JoKing È obbligatorio un tag vincente principale , dove [codegolf]è quello più comune che consiglierei. Anche citato da JoKing, non è raccomandato renderlo specifico per la lingua. È meglio invece aprirlo in tutte le lingue. Per quanto riguarda la sfida stessa, specifica un po 'di più e aggiungi alcuni altri casi di test. Sulla base dell'esempio posso vedere che l'intervallo è [0,c], ma questo dovrebbe essere chiaro senza guardare l'esempio.
Kevin Cruijssen,

1
Penso che tutto ciò che devi fare è cambiare il titolo in qualcosa di più descrittivo e questo è buono per andare
Jo King

1
Mi sono preso la libertà di risolvere la tua sfida in modo che possa essere riaperta. La prossima volta, utilizza Sandbox come consigliato per perfezionare una sfida prima di pubblicarla nella main. Si prega di dare un'occhiata a ciò che ho modificato in modo da sapere questo per le sfide future. Se qualcosa non è corretto o interpreto male qualcosa, sentiti libero di modificarlo di nuovo.
Kevin Cruijssen,

5
Sembra che nessuno dei tuoi casi di test si concluda da 'z'a 'a'. Potresti includerne uno che lo fa?
OOBalance

Risposte:


8

PHP , 67 byte

Prima di tutto, grazie per aver pubblicato una sfida così interessante! Mi è davvero piaciuto risolverlo :) Ora, ecco la mia soluzione a 67 byte:

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

Per eseguirlo:

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

Oppure provalo online!


Ecco la stessa soluzione non golfata e con commenti esplicativi:

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

Ho fatto una soluzione da 60 byte, ma non si chiude :(

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

Provalo online!


6

Japt , 15 byte

;0ôWV £CgX/U ªX

Provalo online!

Spiegazione

;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 prendendo input nell'ordine 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}

Provalo online!

2 byte salvati grazie a JayCe!

Restituisce un elenco di stringhe, poiché R forzerà i numeri in stringhe. Per stampare, è sufficiente sostituire il finale zcon cat(z,sep="").


Sembra che l=non sia richiesto. TIO
JayCe,

@JayCe ah ovviamente. L'ho messo lì per impedirgli di generare troppi valori, ma non è facile farlo!
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))

Offri un po 'di amore a Lisp

Provalo online!

(-7 byte grazie a @NikoNyrh!)


Benvenuti in PPCG! Sai cosa bisogna aggiungere per chiamare la funzione e stampare il risultato su Provalo online ?
Laikoni,

1
@Laikoni Ho aggiunto un "Provalo online" al mio post. Ho anche corretto un errore nel mio codice, quindi grazie per avermelo ricordato!
Lispy Louie,

Ottimo lavoro :) puoi salvare 3 byte se esegui la funzione esterna #(...)e usi fnper esprimere quella interna. Mentre ci sei, puoi sostituirlo mapcon un forcostrutto e salvare altri 4 byte.
NikoNyrh,

@NikoNyrh buona osservazione!
Lispy Louie,

E %1può essere sostituito da %;)
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;}

Provalo online qui . Grazie a Scrooble per giocare a golf 10 byte.

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 byte

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

Provalo

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

Provalo

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

Stai perdendo un byte usando ->\a,\b,\c: usa solo $^aecc. Ed chr 97+$++%26è un po 'più breve di ("a".."z")[$++%26]. Infine, puoi omettere la concatenazione perché la sfida non la richiede. Ciò consentirebbe di risparmiare 10 byte in totale, lasciando 50
Ramillies


3

05AB1E , 17 15 byte

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

-2 byte grazie a @MagicOctopusUrn .

Accetta l'input nell'ordine bca .

Provalo online o verifica tutti i casi di test .

Spiegazione:

/               # 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
Sembra funzionare, ma che lingua è per favore. E posso romperlo in una funzione php e come?
Mochesane,

1
La lingua è 05AB1E. Un link al github ed è nel titolo del mio post. E temo che questo linguaggio sia completamente diverso da PHP. 05AB1E è progettato per il codegolfing, mentre PHP è un pre-processore ipertestuale per lo sviluppo web. Consiglierei di modificare la descrizione della sfida e renderla disponibile per tutte le lingue, ma dichiaro di preferire una risposta PHP. Una volta riaperto, sono sicuro che qualcuno che è esperto di PHP è in grado di dare una risposta in codice golf. Se hai bisogno di aiuto per modificare / risolvere la tua sfida, fammelo sapere.
Kevin Cruijssen,

1
/ݹ*vyD³ÖiA¾è¼}?è 16, duplica yinvece di usare ë, il che ?ignorerà se spinge un carattere alfabetico. In realtà, /ݹ*εD³ÖiA¾è¼}?funziona anche per 15, perché stiamo sovrascrivendo l'array di output, quindi puoi legare l'attuale vincitore> :).
Magic Octopus Urn

@MagicOctopusUrn Grazie! :) Dimenticato l'implicito ë.
Kevin Cruijssen,



2

CJam , 23 byte

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

Provalo 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'

La lettura dell'input come b a ce il rilascio di @sarebbero 22 byte (non sono sicuro che sia valido).


2

Python 2 , 65 63 byte

Restituisce un elenco, poiché l'OP ha dichiarato che è accettabile.

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

Provalo online!


Versioni precedenti utilizzate durante il processo creativo (all'indietro):

84 byte

Restituisce un'espressione del generatore.

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

Utilizza un generatore per l'alfabeto e restituisce un elenco.

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 giusto. Quella non era un'opzione quando stavo usando next. Bello.
mbomb007,

1

PHP , 79 byte

Nota: non troppo bravo in PHP

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

Provalo online!


PHP , 84 byte

Questo è esattamente lo stesso codice sopra solo nel formato della funzione (poiché volevi una risposta PHP forse questo è meglio per te)

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

Provalo online!


1

Excel VBA, 76 byte

Riceve l'input, a, b, e cda [A1], [B1]e [C1], rispettivamente, poi emette alla finestra immediata 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 grazie 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}

Provalo online!

La mia prima volta a giocare a golf (o fare qualsiasi altra cosa) a Kotlin! Probabilmente può essere migliorato.

Molto simile a questa risposta Java , mi sono reso conto dopo averlo scritto. Risparmia sul returne perdi sul ternario per quasi lo stesso punteggio.


Non è molto, ma -1 byte omettendo lo spazio dopo il 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)]]

Probabilmente non il più breve, ma c'è spazio per miglioramenti

Provalo online!


1
Puoi rimuovere alcuni spazinext(q)if x%a==0else x for x in[y*b
mbomb007,

@ mbomb007 Buona chiamata, non avevo capito che potevi farlo. Grazie!
Braeden Smith,


1

Carbone , 22 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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)

Provalo online!


71 byte precedenti:

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

Provalo online!

Spiegazione:

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

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

Provalo online!

Spiegazione

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

Questo potrebbe sicuramente essere migliorato, quindi sentiti libero di unirti!


I cambiamenti

Helen ha tagliato un byte!

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

Passando 1+a )possiamo tagliare un 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)))))

Tale imperativo. : /


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

Porta della mia risposta Java . Provalo online qui .


Suggerisci printf(L"搥挥"+!(i%a),i%a?i:i/a%26+97)invece dii%a?printf("%d",i):putchar(i/a%26+97)
ceilingcat,


0

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

Dovrai metterlo f=di fronte lambdae poi chiamarlo con f(a,b,c)ma sono abbastanza sicuro che sia permesso.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.