Fizzbuzz в любой базе


10

Вызов

Входные данные:

Целое число b от 2 до 62 (включительно).

Вывод:

Посчитайте от 1 до эквивалента 500010 в базе b , используя любое разумное представление для цифр.

Однако:

  • Если число делится на b÷2+1 (округленное в меньшую сторону, например, основание 7 будет равно 7/2 = 3,5, 3,5 + 1 = 4,5, округлено до 4 ), вместо числа выведите «Fizz».

  • Если число делится на b÷3+3 (округленное в большую сторону , например, 11/3 = 3,666, 3,666 + 3 = 6,666, округленное до 7 ), выведите «Buzz».

  • Как вы можете догадаться, если ваш номер делится на оба, выведите 'Fizzbuzz'.

Примеры

Используя [0-9] , [AZ] и [az] в качестве цифр

(Я включил только первые 10 значений, чтобы примеры были короткими - обычно в каждой последовательности было бы на 4990 элементов больше)

Ввод: 10 (поэтому «Fizz» = 6 и «Buzz» = 7)

Выход: 1, 2, 3, 4, 5, Fizz, Buzz, 8, 9, 10

Вход: 2 (поэтому «Fizz» = 2 и «Buzz» = 4)

Выход: 1, Fizz, 11, Fizzbuzz, 101, Fizz, 111, Fizzbuzz, 1001, Fizz

(Я включил первые 50 значений следующего, чтобы лучше показать, как они работают)

Ввод: 55 (поэтому «Fizz» = 2810 = s55 и «Buzz» = 2210 = m55 )

Выход: 1, 2, 3, 4, 5, 6, 7, 8, 9, а, б, в, г, д, е, е, г, ч, я, j, к, л, Базз, н, о, p, q, r, Fizz, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N

правила

  • Стандартные лазейки запрещены
  • Это Code Golf, поэтому выигрывает самый короткий ответ в байтах
  • Ввод и вывод могут быть через консоль или аргументы функции / возврат
  • Лидирующий / завершающий пробел в порядке, как и пустые строки
  • Пробелы между 'Fizz' и 'Buzz' запрещены
  • Подойдет любой вариант с заглавными буквами «Fizz» / «Buzz» / «Fizzbuzz».
  • Выходы должны быть разделены новыми строками.
  • Если вы возвращаете массив из 10 основных цифр вместо того, чтобы представлять их символами, то они должны быть в правильном порядке!

2
Я не против. Если вы хотите использовать эмодзи вместо цифр, я все еще не против. Важна база, а не представление.
Геза

2
Хорошо, уточнил сейчас.
Геза

5
Технически, в базе 36 слово buzzпоявляется само по себе в индексах 553391, fizzв 724463и fizzbuzzв 1216820199599. К сожалению, ни один из них не делится на номера этой базы
Джо Кинг,

3
Почему база 10 не оригинальная FizzBuzz? Я не мог придумать алгоритм, который бы генерировал исходные числа в базе 10 и хорошо переносил их в другие базы. И я не хотел добавлять специальный случай для отрицания, так как это, по моему мнению, просто усложнит вопрос.
Геза

3
Для ваших будущих задач, пожалуйста, рассмотрите возможность более гибкого ввода-вывода. Громоздкие форматы ввода / вывода - самая популярная тема в « Вещи», которую следует избегать при написании задач .
Арно

Ответы:


3

Желе ,  42 38 34 33 29  32 байта

+3 придерживаться строгих правил форматирования

5ȷɓ;8Ä:2,3‘ḍȧ"“Ƈד=%»ḟ0Fȯb@K¥ð€Y

Полная программа , которая выводит 5000 строк текста, каждая строка , содержащая ряд целых чисел (цифр) или один из fizz, buzzили fizzbuzz(работает штраф за основание 62).

Попробуйте онлайн!

Как?


b÷2+1 =b÷2+1

b÷3+3=b÷3+2+1=(b+6)÷3+1=(b+8)÷3+1

обновление ...

5ȷɓ;8Ä:2,3‘ḍȧ"“Ƈד=%»ḟ0Fȯb@ð€ - Link: integer, b
5ȷ                            - 5*10³ = 5000
  ɓ                        ð€ - for €ach n in [1,2,...,5000] get this f(b,n):
    8                         -   eight
   ;                          -   concatenate      -> [b,8]
     Ä                        -   cumulative sums  -> [b,b+8]
       2,3                    -   pair literal        [2,3]
      :                       -   integer division -> [b//2, (b+8)//3]
          ‘                   -   increment        -> [b//2+1, (b+8)//3+1]
           ḍ                  -   divides n?       -> [n is fizzy?, n is buzzy?]
              “Ƈד=%»         -   list of dictionary strings = ['fizz','buzz']
             "                -   zip with:
            ȧ                 -     logical AND    -> [0,0], ['fizz',0], [0,'buzz'],
                              -                       or ['fizz','buzz']
                      0       -   zero
                     ḟ        -   filter discard   -> [], ['fizz'], ['buzz'],
                              -                       or ['fizz','buzz']
                       F      -   flatten          -> [], ['fizz'], ['buzz'],
                              -                       or ['fizzbuzz']
                          @   -   using swapped arguments:
                         b    -     (n) to a list of digits in base (b)  (say, [nb])
                        ȯ     -   logical OR       -> [nb], ['fizz'], ['buzz'],
                              -                       or ['fizzbuzz']

Задача гласит, что выход должен быть на отдельных линиях
Embodiment of Ignorance

Правда. Хотя я в порядке с представлением (хотя оно и граничит), вывод массива не то же самое, что играть в игру. Однако, если вы выведите массив цифр в каждой строке, я приму это.
Геза

3
[0,n1]

Более краткая реализация могла бы просто взять список желаемых цифр вместо числовой базы, как это .
Джонатан Аллан

3

Древесный уголь , 40 байт

NθE…·¹×⁵φ∨⁺⎇﹪ι⊕÷θ²ωFizz⎇﹪ι÷⁺¹¹θ³ωBuzz⍘ιθ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

Nθ                                      Input `b` into variable `q`
   ¹                                    Literal 1
 …·                                     Inclusive range to
      φ                                 Predefined variable 1000
    ×                                   Multiplied by
     ⁵                                  Literal 5
E                                       Map to
           ι                            Current value
          ﹪                             Modulo
              θ                         Input value
             ÷                          Floor divide
               ²                        Literal 2
            ⊕                           Incremented
         ⎇                              If nonzero
                ω                       Then predefined empty string
                 Fizz                   Otherwise literal `Fizz`
        ⁺                               Concatenated with
                       ι                Current value
                      ﹪                 Modulo
                            θ           Input value
                         ⁺              Plus
                          ¹¹            Literal 11
                        ÷               Integer divided by
                             ³          Literal 3
                     ⎇                  If nonzero
                              ω         Then predefined empty string
                               Buzz     Otherwise literal `Buzz`
       ∨                                Logical Or
                                    ι   Current value
                                   ⍘    Converted to base
                                     θ  Input value
                                        Implicitly print each result on its own line

3

R , 163 131 байт

b=scan();for(d in 1:5e3)cat(list(d%/%b^rev(0:log(d,b))%%b,'fizz','buzz','fizzbuzz')[[1+(!d%%((b+2)%/%2))+2*!d%%((b+11)%/%3)]],'\n')

Попробуйте онлайн!

Спасибо @digEmAll за сохранение 23 байтов. Затем я продолжил попытки @ digEmAll спасти еще 9.


140 байт Я работал над этим, не глядя на ваш ответ, но он слишком похож на другой пост;)
digEmAll

@digEm Всем спасибо. Я добавил ваш ответ, чтобы получить 131 байт и дать вам кредит; надеюсь, что все в порядке.
Ник Кеннеди

абсолютно! ;)
digEmAll

Кстати, если у вас есть какие-либо дискуссии о гольфе в R, спросите в этом чате
digEmAll

Ой, не понимал, что уже был ответ R, мой ответ мог бы быть полезным для большего количества игры в гольф?
Только для ASCII

3

JavaScript (ES6),  117  116 байт

19201921201,1

b=>(g=n=>n>1?g(n-1)+`
`+((s=n%(b+2>>1)?'':'Fizz',n%(b/3+3.9|0)?s:s+'Buzz')||(g=n=>n?[...g(n/b|0),n%b]:s)(n)):1)(5e3)

Попробуйте онлайн!

(ограничено 100, чтобы выход TIO не взрывался)


Есть ли шанс, что вы могли бы объяснить, что |0и (5e3)как?
njras

0nMath.floor(n)0n<2315e35000g


1

05AB1E , 39 37 36 байт

8+‚U5₄*LεX23S÷>Ö”FizzÒÖ”#×JDõQiyIв]»

-2 байта, создав порт ответа @JonathanAllan 's Jelly .

Попробуйте онлайн или проверьте все тестовые случаи (но в виде списка-вывода и с первыми 100 вместо 5000).

Объяснение:

8+               # Add 8 to the (implicit) input
                # Pair it with the (implicit) input
   U             # Pop and store it in variable `X`
5₄*L             # Create a list in the range [1,5000]
    ε            # Map each value `y` to:
     X23S÷       #  Integer-divide the input by 2, and the input+8 by 3
          >      #  Increase both by 1
           Ö     #  Check for both if they divide value `y` evenly (1 if truthy; 0 if falsey)
     FizzÒÖ”    #  Push dictionary string "Fizz Buzz"
             #   #  Split on spaces
              ×  #  Repeat the strings the result amount of times (0 or 1)
               J #  Join both strings together to a single string
     DõQi        #  If this string is empty:
         yIв     #   Push value `y` in Base-input (as list) instead
    ]            # Close the if-statement and map
     »           # Join the list by new-lines (and inner lists by spaces implicitly)
                 # (and output the result implicitly)

Смотрите этот 05AB1E наконечник шахты (раздел Как использовать словарь? ) , Чтобы понять , почему ”FizzÒÖ”это "Fizz Buzz".


У меня есть зацикленная версия на 33 байта на случай, если вы захотите попробовать и оптимизировать это. Тем не менее, еще на байт дольше, чем у желе :(
Эминья,

@ Emigna Вы уже опубликовали это? Или это довольно похоже на мой ответ и подразумевается как гольф? PS: у Jelly есть несколько коротких встроенных элементов, например, с [input, input+8]частью и фильтрующей частью после DõQi yIвнее (что я сейчас и делаю , но у меня есть ощущение, что это можно сыграть еще немного ..)
Кевин Круйссен,

На расстоянии Левенштейна он сильно отличается от вашего (хотя части можно переписать так, чтобы они больше походили на ваши). Но я также использую трюк Джонатана с n + 8, поэтому я решил, что позволю вам попробовать и прислушаться к нему, если хотите. В противном случае я выложу это как отдельный ответ.
Emigna

@ Emigna В настоящее время я немного занят на работе, поэтому у меня нет времени, чтобы ответить на этот вопрос. Так что если вы хотите, вы можете опубликовать его в качестве собственного ответа. У тебя мой голос. ;)
Кевин Круйссен

К сожалению, я обнаружил ошибку в своей версии, так что теперь ее 34. У меня есть некоторые идеи, которые могут сделать вашу или мою более короткой, которую я расскажу позже. Хотя избивать / завязывать желе сейчас сложно.
Эминья

0

Perl 6 , 91 байт

{$!=0;('Fizz'x++$!%%($_/2+|0+1)~'Buzz'x$!%%(($_+8)/3+|0+1)||[R,] $!.polymod($_ xx*))xx𐄦}

Попробуйте онлайн!

Блок анонимного кода, который возвращает список строк Fizz/Buzz/FizzBuzzили обращенный список целых чисел в базе.


См. Codegolf.stackexchange.com/questions/180247/… . Я добавил уточнение в вопрос об этом.
Геза


0

C # (интерактивный компилятор Visual C #) , 180 171 байт

n=>{for(int i=1,p;i<5001;){p=i;var j=new Stack<int>();for(;p>0;p/=n)j.Push(p%n);var s=i%(n/2+1)<1?"Fizz":"";Print(i++%((n+8)/3+1)<1?s+"Buzz":s==""?string.Join("-",j):s);}}

Выходы, как ответ Арно. Спасибо digEmAll за идею использования стека для обратного вывода.

Попробуйте онлайн!


1
Я собираюсь сказать «нет» обратным цифрам. Хотя математически это правильная идея, это не программа Fizzbuzz, скажем, хотел бы работодатель. К сожалению, в C # нет функции обратного массива.
Геза

0

05AB1E , 34 байта

Использует математическое понимание Джонатана, что ceil(n/3+3)=floor((n+8)//3)+1

ŽJćG8+‚2L>÷>NsÖ…™Ázz'ÒÖ‚×JNIв‚õKн,

Попробуйте онлайн!

объяснение

ŽJćG                                # for N in [1 ...5001)
    8+‚2L>÷>                        # push [input//2+1, (input+8)//3+1]
            NsÖ                     # check each if N is divisible by it
               …™Ázz                # push "fizz"
                    'ÒÖ             # push "buzz"
                       ‚            # pair
                        ×           # repeat a number of times corresponding to the result of the 
                                    # divisibility test
                         J          # join to string
                          NIв‚      # pair with N converted to base <input>
                              õK    # remove empty string
                                н,  # print head of the remaining list
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.