Функція приймати три цілі числа та повертати список цілих чисел та букв алфавіту


10

Виклик

Візьмемо три позитивних цілих чисел a, bі в cякості вхідних даних. Використовуючи ці цілі числа, спочатку створіть послідовність у діапазоні [0, c](включно з обох кінців), кроками b. Наприклад, для a=4, b=2, c=100, послідовність буде [0,2,4,...,96,98,100].

Для кожного числа в цій послідовності, яке ділиться на a, замініть його на наступну букву з малого алфавіту, починаючи з літери "a" і обертаючись назад до "a" після досягнення "z".

Приклад:

Вхід: a=4, b=2, c=100
Вихід:a2b6c10d14e18f22g26h30i34j38k42l46m50n54o58p62q66r70s74t78u82v86w90x94y98z

Правила виклику:

  • Можна припустити , що a, bі cє позитивними цілими числами тільки, де b ≤ a ≤ c.
  • Ви можете припустити a, що це кратний b.
  • Ви можете припустити c, що ділиться на b.
  • Переважний вихід - це один об'єднаний рядок, як зазначено вище, але список / масив також прийнятний.

Тестові приклади:

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

Я дуже хотів би побачити відповідь на PHP , але ця проблема є відкритою для будь-якої мови. Це , тому відповідь повинна бути якомога . Для функцій / програм застосовуються стандартні правила, а лазівки за замовчуванням заборонені .


1
Також рекомендуйте скористатися програмою «Пісочниця», щоб отримати поради та відгуки щодо питань, перш ніж розміщувати її на головній.
Джо Кінг

3
Привіт, ласкаво просимо до PPCG! Хоча мені подобається сам виклик, в описі бракує багато речей. Як згадував @JoKing, основний тег виграшу є обов'язковим, де [codegolf]є найпоширенішим, який я рекомендував би. Також згаданий JoKing, що робить його специфічним для мови, не рекомендується. Краще відкрити його на всіх мовах. Що стосується самого виклику, то вкажіть трохи більше та додайте ще кілька тестових випадків. На підставі прикладу я можу бачити, що діапазон є [0,c], але це повинно бути зрозумілим, не дивлячись на приклад.
Kevin Cruijssen

1
Я думаю, що все, що вам потрібно зробити, - це змінити назву на щось більш описове, і це добре робити
Джо Кінг

1
Я взяв на себе сміття виправити ваш виклик, щоб його можна було знову відкрити. Наступного разу, будь ласка, використовуйте пісочницю, як рекомендується, щоб вдосконалити виклик, перш ніж розміщувати її в основному. Погляньте, що я редагував, щоб ви знали це для майбутніх проблем. Якщо щось невірно або я неправильно трактую щось, сміливо відредагуйте його ще раз.
Kevin Cruijssen

5
Здається , жоден з ваших тестових випадків обернути навколо від 'z'до 'a'. Чи можете ви включити ту, що робить?
OOBalance

Відповіді:


8

PHP , 67 байт

Перш за все, дякую за повідомлення про такий класний виклик! Мені дуже сподобалося її вирішити :) Тепер ось моє рішення з 67 байт:

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

Щоб запустити його:

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

Або спробуйте в Інтернеті!


Ось те саме рішення, що не має волі і з поясненнями коментарів:

$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-байтне рішення, але воно не завершується :(

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

Спробуйте в Інтернеті!


6

Japt , 15 байт

;0ôWV £CgX/U ªX

Перевірте це в Інтернеті!

Пояснення

;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 байт, що приймають вхід у порядку c,a,b.
Кошлатий

5

R , 65 63 байти

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

Спробуйте в Інтернеті!

2 байти збережено завдяки JayCe!

Повертає список рядків, оскільки R буде примушувати числа до рядків. Щоб надрукувати, просто замініть простір zна cat(z,sep="").


Схоже l=, не потрібно. TIO
JayCe

@JayCe ах, звичайно. Я поклав його туди, щоб запобігти тому, щоб генерувати занадто багато значень, але робити це не гольфу!
Джузеппе

5

Clojure, 84 79 77 байт

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

Givin 'Lisp трохи кохання

Спробуйте в Інтернеті!

(-7 байт завдяки @NikoNyrh!)


Ласкаво просимо до PPCG! Чи знаєте ви, що потрібно додати для виклику функції та друку результату на " Спробуйте в Інтернеті" ?
Лайконі

1
@Laikoni Я додав "Спробуйте в Інтернеті" до своєї публікації. Я також виправив помилку в коді, тому дякую, що нагадали!
Lispy Louie

Хороша робота :) Ви можете зберегти 3 байти, якщо виконати зовнішню функцію за допомогою #(...)та використати fnдля вираження внутрішньої. Поки ви знаходитесь біля нього, ви можете замінити mapна forконструювання та зберегти ще 4 байти.
NikoNyrh

@NikoNyrh гарне спостереження!
Lispy Louie

І %1можна замінити %;)
NikoNyrh

3

Java 10, 93 83 байти

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

Спробуйте його онлайн тут . Завдяки Scrooble за теніс на 10 байт.

Безголівки:

(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 байт

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

Перевірте це

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

Перевірте це

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

Ви втрачаєте байт, використовуючи ->\a,\b,\c: use just $^aetc. І chr 97+$++%26це зовсім трохи коротше, ніж ("a".."z")[$++%26]. Нарешті, ви можете опустити конкатенацію, оскільки виклик цього не вимагає. Це врятувало б 10 байт, залишивши 50
Раміллі


3

05AB1E , 17 15 байт

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

-2 байти завдяки @MagicOctopusUrn .

Бере введення в порядку bca.

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

/               # 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
Здається, це працює, але будь ласка, якою це мова. І чи можу я розбити його на функцію php і як?
Mochesane

1
Мова - 05AB1E. Посилання на github і є в заголовку моєї публікації. І я боюся, ця мова зовсім інша, ніж PHP .. 05AB1E призначений для кодового гольфу, тоді як PHP - це гіперпростовий попередній процесор для веб-розробок. Я радив би відредагувати опис виклику та зробити його доступним для всіх мов, але констатуйте, що ви віддаєте перевагу відповідь PHP. Після його відкриття я впевнений, що хтось досвідчений з PHP може зробити відповідь на гольф коду. Якщо вам потрібна допомога з редагуванням / виправленням виклику, дайте мені знати.
Kevin Cruijssen

1
/ݹ*vyD³ÖiA¾è¼}?16, просто дублює yзамість використання ë, що ?ігнорує, якщо він натискає алфавітну таблицю. Насправді /ݹ*εD³ÖiA¾è¼}?працює навіть для 15, тому що ми переписуємо вихідний масив, то ви можете прив'язати поточного переможця> :).
Чарівний восьминіг Урна

@MagicOctopusUrn Дякую! :) Забув про неявне ë.
Kevin Cruijssen



2

CJam , 23 байти

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

Спробуйте в Інтернеті!

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'

Читання введення як b a cі випадання значень @буде 22 байти (не впевнений, що це дійсно).


2

Python 2 , 65 63 байт

Повертає список, оскільки ОП заявила, що це прийнятно.

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

Спробуйте в Інтернеті!


Попередні версії, використовувані під час творчого процесу (працюють назад):

84 байти

Повертає вираз генератора.

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 байт

Використовує генератор алфавіту і повертає список.

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

Ага, правильно. Це не був варіант, коли я використовував next. Приємно.
mbomb007

1

PHP , 79 байт

Примітка: Не дуже добре для PHP

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

Спробуйте в Інтернеті!


PHP , 84 байти

Це точно той самий код вище, лише у форматі функції (оскільки ви хотіли відповіді PHP, можливо, це краще для вас)

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

Спробуйте в Інтернеті!


1

Excel VBA, 76 байт

Приймає вхідний сигнал, a, b, і cз [A1], [B1]і [C1], відповідно , потім виводить до негайного вікні 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

Котлін, 80 79 байт

-1 завдяки 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}

Спробуйте в Інтернеті!

Мій перший гольф (або щось інше) в Котліні! Напевно, можна вдосконалити.

Дуже схожий на цю відповідь Java , я зрозумів після її написання. Заощаджуйте на програмі returnта програйте на тернарі майже за той самий бал.


Це не багато, але -1 байт, опустивши пробіл після else.
OOBalance

1

Python3 - 111 , 101 , 98 , 94 байт

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

Напевно, не найкоротший, але є місце для вдосконалення

Спробуйте в Інтернеті!


1
Ви можете видалити декілька пробілівnext(q)if x%a==0else x for x in[y*b
mbomb007

@ mbomb007 Добрий дзвінок, не зрозумів, що ти можеш це зробити. Дякую!
Braeden Smith

1
Можливо, ви хочете переглянути поради щодо гри в гольф у Python
mbomb007

1

Вугілля деревне , 22 байти

NθNη⭆Φ⊕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

1

Haskell , 71 69 байт

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

Спробуйте в Інтернеті!


Попередні 71 байт:

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

Спробуйте в Інтернеті!

Пояснення:

(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 байт ( ой )

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

Спробуйте в Інтернеті!

Пояснення

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

Це, безумовно, можна зробити краще, тому сміливо приєднуйтесь!


Зміни

Олена відрізала байт!

Старий: 97:Y;riri:Bri\/1+,[{B*}*]{X\_@\%0={Yc\Y):Y'{i={97:Y;}&}{X\}?}fX;
Новий:97:Y;riri:Bri\/),[{B*}*]{X\_@\%0={Yc\Y):Y'{i={97:Y;}&}{X\}?}fX;

Змінившись 1+на )ми можемо відрізати байт.



0

Clojure, 117 байт

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

Такий імператив. : /


0

C (gcc / clang), 80 68 байт

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

Порт моєї відповіді на Java . Спробуйте його онлайн тут .


Запропонувати printf(L"搥挥"+!(i%a),i%a?i:i/a%26+97)замістьi%a?printf("%d",i):putchar(i/a%26+97)
roofcat


0

Python 2 і 3 - 123 128 байт

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]

Вам потрібно поставити f=перед, lambdaа потім зателефонувати, f(a,b,c)але я впевнений, що це дозволено.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.