Eine Funktion zum Nehmen von drei Ganzzahlen und zum Zurückgeben einer Liste von Ganzzahlen und Buchstaben


10

Herausforderung

Wir nehmen drei positive ganze Zahlen sind a, bund cals Eingabe. Erstellen Sie mit diesen Ganzzahlen zunächst eine Sequenz im Bereich [0, c](einschließlich an beiden Enden) in Schritten von b. Zum Beispiel a=4, b=2, c=100wäre die Sequenz [0,2,4,...,96,98,100].

aErsetzen Sie für jede Zahl in dieser Sequenz, die durch teilbar ist, diese durch den nächsten Buchstaben im Kleinbuchstaben, beginnend mit dem Buchstaben 'a' und umlaufend zu 'a', nachdem Sie 'z' erreicht haben.

Beispiel:

Eingabe: a=4, b=2, c=100
Ausgabe:a2b6c10d14e18f22g26h30i34j38k42l46m50n54o58p62q66r70s74t78u82v86w90x94y98z

Herausforderungsregeln:

  • Sie können davon ausgehen, dass a, bund cnur positive ganze Zahlen sind, wo b ≤ a ≤ c.
  • Sie können davon ausgehen, dass aes sich um ein Vielfaches von handelt b.
  • Sie können davon ausgehen, cist teilbar durch b.
  • Die bevorzugte Ausgabe ist eine einzelne verkettete Zeichenfolge wie oben, aber eine Liste / ein Array ist ebenfalls akzeptabel.

Testfälle:

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

Ich würde wirklich gerne eine Antwort in PHP sehen , aber diese Herausforderung ist für jede Sprache offen. Dies ist , daher sollte die Antwort so kurz wie möglich sein. Für Funktionen / Programme gelten Standardregeln, und Standardlücken sind verboten .


1
Verwenden Sie The Sandbox auch , um Ratschläge und Feedback zu Fragen zu erhalten, bevor Sie es an main senden.
Jo King

3
Hallo, willkommen bei PPCG! Obwohl ich die Herausforderung selbst mag, fehlen der Beschreibung viele Dinge. Wie von @JoKing erwähnt Ein primäres Gewinn-Tag ist obligatorisch, wo [codegolf]es das häufigste ist, das ich empfehlen würde. Auch von JoKing erwähnt, wird es nicht empfohlen, es sprachspezifisch zu machen. Es ist am besten, es stattdessen für alle Sprachen zu öffnen. Geben Sie für die Herausforderung selbst etwas mehr an und fügen Sie einige weitere Testfälle hinzu. Anhand des Beispiels kann ich sehen, dass der Bereich ist [0,c], aber dies sollte klar sein, ohne das Beispiel zu betrachten.
Kevin Cruijssen

1
Ich denke, alles was Sie tun müssen, ist den Titel in etwas Beschreibenderes zu ändern und das ist gut zu gehen
Jo King

1
Ich habe mir erlaubt, Ihre Herausforderung zu beheben, damit sie wieder geöffnet werden kann. Verwenden Sie das nächste Mal die Sandbox wie empfohlen, um eine Herausforderung zu perfektionieren, bevor Sie sie in der Hauptversion veröffentlichen. Bitte schauen Sie sich an, was ich bearbeitet habe, damit Sie dies für zukünftige Herausforderungen wissen. Wenn etwas nicht stimmt oder ich etwas falsch interpretiere, können Sie es erneut bearbeiten.
Kevin Cruijssen

5
Es scheint, dass sich keiner Ihrer Testfälle von 'z'bis dreht 'a'. Könnten Sie bitte eine hinzufügen, die dies tut?
OOBalance

Antworten:


8

PHP , 67 Bytes

Zunächst einmal vielen Dank, dass Sie eine so coole Herausforderung gepostet haben! Ich habe es wirklich genossen, es zu lösen :) Hier ist meine 67-Byte-Lösung:

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

Um es auszuführen:

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

Oder probieren Sie es online!


Hier ist die gleiche Lösung ohne Wolf und mit erklärenden Kommentaren:

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

Ich habe eine 60-Byte-Lösung erstellt, die sich jedoch nicht umgibt :(

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

Probieren Sie es online aus!


6

Japt , 15 Bytes

;0ôWV £CgX/U ªX

Testen Sie es online!

Erläuterung

;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 Bytes, die in der Reihenfolge eingegeben werden 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}

Probieren Sie es online aus!

2 Bytes dank JayCe gespart!

Gibt eine Liste von Zeichenfolgen zurück, da R Zahlen zu Zeichenfolgen zwingt. Ersetzen Sie zum Drucken einfach den nachgestellten zdurch cat(z,sep="").


Es sieht so aus, als wäre das l=nicht erforderlich. TIO
JayCe

@ JayCe ah natürlich. Ich habe es dort abgelegt, um zu verhindern, dass es zu viele Werte generieren muss, aber es ist nicht Golf, das zu tun!
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))

Gib Lisp ein bisschen Liebe

Probieren Sie es online aus!

(-7 Bytes dank @NikoNyrh!)


Willkommen bei PPCG! Wissen Sie, was hinzugefügt werden muss, um die Funktion aufzurufen und das Ergebnis auf Online testen zu drucken ?
Laikoni

1
@Laikoni Ich habe meinem Beitrag ein "Try it online" hinzugefügt. Ich habe auch einen Fehler in meinem Code korrigiert. Vielen Dank, dass Sie mich daran erinnert haben!
Lispy Louie

Gute Arbeit :) Sie können 3 Bytes sparen, wenn Sie die äußere Funktion über ausführen #(...)und verwenden fn, um die innere auszudrücken. Während Sie gerade dabei sind , können Sie ersetzen mapmit forKonstrukt und speichern weitere 4 Bytes.
NikoNyrh

@NikoNyrh gute Beobachtung!
Lispy Louie

Und %1kann ersetzt werden durch %;)
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;}

Probieren Sie es hier online aus . Vielen Dank an Scrooble für das Golfen von 10 Bytes.

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 Bytes

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

Probier es aus

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

Probier es aus

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

Sie verlieren ein Byte, indem Sie Folgendes verwenden ->\a,\b,\c: Verwenden Sie nur $^ausw. Und es chr 97+$++%26ist ziemlich viel kürzer als ("a".."z")[$++%26]. Schließlich können Sie die Verkettung weglassen, da die Herausforderung dies nicht erfordert. Das würde insgesamt 10 Bytes sparen und 50
Ramillies


3

05AB1E , 17 15 Bytes

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

-2 Bytes dank @MagicOctopusUrn .

Übernimmt die Eingabe in der Reihenfolge bca.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

/               # 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
Dies scheint zu funktionieren, aber welche Sprache ist das bitte. Und kann ich es in eine PHP-Funktion aufteilen und wie?
Mochesane

1
Die Sprache ist 05AB1E. Ein Link zum Github und steht im Titel meines Beitrags. Und ich fürchte, diese Sprache ist völlig anders als PHP. 05AB1E wurde für Codegolf entwickelt, während PHP ein Hypertext-Vorprozessor für die Webentwicklung ist. Ich würde empfehlen, die Challenge-Beschreibung zu bearbeiten und für alle Sprachen verfügbar zu machen, aber geben Sie an, dass Sie eine PHP-Antwort bevorzugen. Sobald es wieder geöffnet ist, kann sicher jemand, der mit PHP vertraut ist, eine Code-Golf-Antwort darauf geben. Wenn Sie Hilfe beim Bearbeiten / Beheben Ihrer Herausforderung benötigen, lassen Sie es mich wissen.
Kevin Cruijssen

1
/ݹ*vyD³ÖiA¾è¼}?ist 16, dupliziert nur das yanstatt zu verwenden ë, was ?ignoriert wird, wenn es ein Alphabet-Zeichen drückt. Funktioniert /ݹ*εD³ÖiA¾è¼}?sogar für 15, da wir das Ausgabearray überschreiben, können Sie den aktuellen Gewinner binden> :).
Magic Octopus Urn

@MagicOctopusUrn Danke! :) Das Implizite vergessen ë.
Kevin Cruijssen



2

CJam , 23 Bytes

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

Probieren Sie es online aus!

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'

Das Lesen der Eingabe als b a cund das Löschen der Eingabe @wären 22 Byte (nicht sicher, ob dies gültig ist).


2

Python 2 , 65 63 Bytes

Gibt eine Liste zurück, da das OP dies für akzeptabel erklärt hat.

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

Probieren Sie es online aus!


Frühere Versionen, die während des kreativen Prozesses verwendet wurden (rückwärts arbeiten):

84 Bytes

Gibt einen Generatorausdruck zurück.

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

Verwendet einen Generator für das Alphabet und gibt eine Liste zurück.

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 richtig. Das war keine Option, als ich benutzte next. Nett.
mbomb007


1

Excel VBA, 76 Bytes

Nimmt Eingang a, bund caus [A1], [B1]und [C1]jeweils dann ausgibt , auf die VBE Direktfenster.

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 Bytes

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

Probieren Sie es online aus!

Mein erstes Mal Golf spielen (oder etwas anderes machen) in Kotlin! Kann wahrscheinlich verbessert werden.

Sehr ähnlich zu dieser Java-Antwort , wurde mir nach dem Schreiben klar. Sparen Sie auf dem returnund verlieren Sie auf dem Ternär für fast die gleiche Punktzahl.


Es ist nicht viel, aber -1 Byte, indem das Leerzeichen nach dem weggelassen wird 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)]]

Wahrscheinlich nicht die kürzeste, aber es gibt Raum für Verbesserungen

Probieren Sie es online aus!


1
Sie können ein paar Leerzeichen entfernennext(q)if x%a==0else x for x in[y*b
mbomb007

@ mbomb007 Guter Anruf, wusste nicht, dass du das kannst. Vielen Dank!
Braeden Smith

1
Vielleicht
möchten

1

Holzkohle , 22 Bytes

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

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:

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 Bytes

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

Probieren Sie es online aus!


Vorherige 71 Bytes:

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

Probieren Sie es online aus!

Erläuterung:

(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 Bytes ( autsch )

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

Probieren Sie es online aus!

Erläuterung

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

Dies könnte definitiv verbessert werden, also zögern Sie nicht mitzumachen!


Änderungen

Helen hat ein Byte abgeschnitten!

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

Durch Ändern 1+zu können )wir ein Byte abschneiden.



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

Solch ein Imperativ. : /


0

C (gcc / clang), 80 bis 68 Bytes

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

Port meiner Java- Antwort . Probieren Sie es hier online aus .


Schlagen Sie printf(L"搥挥"+!(i%a),i%a?i:i/a%26+97)statti%a?printf("%d",i):putchar(i/a%26+97)
Deckenkatze


0

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

Sie müssen f=vor das stellen lambdaund es dann mit anrufen, f(a,b,c)aber ich bin mir ziemlich sicher, dass das erlaubt ist.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.