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,n−1]

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

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)0≤n<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.