Тест множественности

21

Используйте любой язык программирования для отображения чисел от 1 до 99 (включая оба) таким образом, чтобы:

  • числа разделены одним пробелом,
  • если число делится на 3, оно должно быть в скобках,
  • если число делится на 4, оно должно быть в квадратных скобках,
  • если число делится на 3 и 4, оно должно быть в скобках и в квадратных скобках (квадратные скобки должны быть ближе к числу).

Ваша программа должна отображать точно:

1 2 (3) [4] 5 (6) 7 [8] (9) 10 11 ([12]) 13 14 (15) [16] 17 (18) 19 [20] (21) 22 23 ([24]) 25 26 (27) [28] 29 (30) 31 [32] (33) 34 35 ([36]) 37 38 (39) [40] 41 (42) 43 [44] (45) 46 47 ([48]) 49 50 (51) [52] 53 (54) 55 [56] (57) 58 59 ([60]) 61 62 (63) [64] 65 (66) 67 [68] (69) 70 71 ([72]) 73 74 (75) [76] 77 (78) 79 [80] (81) 82 83 ([84]) 85 86 (87) [88] 89 (90) 91 [92] (93) 94 95 ([96]) 97 98 (99)
Monolica
источник
6
Связанные
ETHproductions
3
Можем ли мы вывести каждую запись в новой строке или все выходные должны быть в одной строке?
ETHproductions
4
Может ли вывод заканчиваться пробелом? Несколько ответов, похоже, предполагают это.
Денис

Ответы:

7

05AB1E , 23 байта

-1 байт благодаря Кевину Круйссену

тGND4Öi…[ÿ]}N3Öi…(ÿ)]ðý

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

Okx
источник
1
-1 байт, изменив }?ð?на ]ðý(закройте и цикл if, и цикл, и соедините весь стек пробелами)
Кевин Круйссен
@KevinCruijssen Спасибо, это именно то, что я искал!
Okx
5

R 61 байт

"+"=c
r=""+""
cat(paste0(r+"(",r+""+"[",1:99,r+""+"]",r+")"))

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

j.doe
источник
2
блестящий псевдоним!
Джузеппе
Как это вообще работает? Это восхитительно! +1 тебе мой друг
Sumner18
4

Желе , 21 20 байт

³Ṗµ3,4ṚƬḍד([“])”j)K

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

Как это устроено

³Ṗµ3,4ṚƬḍד([“])”j)K  Main link. No arguments.

³                     Set the return value to 100.
 Ṗ                    Pop; yield [1, ..., 99].
  µ               )   Map the chain in between over [1, ..., 9]; for each integer k:
   3,4                    Set the return value to [3, 4].
      ṚƬ                  Reverse until a loop is reached. Yields [[3, 4], [4, 3]].
        ḍ                 Test k for divisibility by [[3, 4], [4, 3]], yielding a
                          matrix of Booleans.
         ד([“])”         Repeat the characters of [['(', '['], [']', ')']] as many
                          times as the Booleans indicate.
                 j        Join the resulting pair of strings, separated by k.
                   K  Join the resulting array of strings, separated by spaces.
Деннис
источник
3

D , 110 байт

import std.stdio;void f(){for(int i;i<99;)write(++i%3?"":"(",i%4?"":"[",i,i%4?"":"]",i%3?"":")",i%99?" ":"");}

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

Портировано из ответа C ++ от @ HatsuPointerKun.

Zachary
источник
3

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

⪫EEE⁹⁹I⊕ι⎇﹪⊕κ⁴ι⪫[]ι⎇﹪⊕κ³ι⪫()ι 

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

    ⁹⁹                          Literal 99
   E                            Map over implicit range
        ι                       Current value
       ⊕                        Incrementd
      I                         Cast to string
  E                             Map over list of strings
            κ                   Current index
           ⊕                    Incremented
             ⁴                  Literal 4
          ﹪                     Modulo
              ι                 Current value
                []              Literal string `[]`
                  ι             Current value
               ⪫                Join i.e wrap value in `[]`
         ⎇                      Ternary
 E                              Map over list of strings
                      κ         Current index
                     ⊕          Incremented
                       ³        Literal 3
                    ﹪           Modulo
                        ι       Current value
                          ()    Literal string `()`
                            ι   Current value
                         ⪫      Join i.e wrap value in `()`
                   ⎇            Ternary
                                Literal space
⪫                               Join list
                                Implicitly print
Нил
источник
3

J , 54 53 байта

На 1 байт меньше благодаря @Jonah

(*stdout(3|.0=4 3 1 3 4&|,1=":)#3|.']) ([',":)@>i.100

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

FrownyFrog
источник
Спасибо за это. Кроме того, почему ты должен делать stdoutздесь ... Я никогда не видел этого раньше. @FrownyFrog
Иона
@Jonah Я не могу вывести ее как целую строку, она обрезается (...). Stdout этого не делает, и не выводит также новую строку, поэтому я также могу печатать каждое число отдельно. По какой-то причине, хотя это приводит к появлению конечных пробелов (их 4, и только 1 намеренно присутствует)
FrownyFrog
Этот подход действительно умный, как вращение, так и выбор в использовании #. Я представил вспомогательный глагол для объемного звучания с ()и []: g=. {.@[ , ":@] , {:@[. тьфу многословие!
Иона
Еще один вопрос: любая причина, которую вы использовали LFвместо _. последний, похоже, тоже работает.
Иона
3

C, C ++, 136 133 131 129 128 124 байтов

-5 байт благодаря Zacharý и вдохновлены функцией write () на языке D (см. Zacharý ответ)

-2 байта благодаря Мриклойн

-12 байт для версии C благодаря Мриклойн

-4 байта благодаря потолку

#include<cstdio>
void f(){for(int i=0;i++<99;)printf("(%s%d%s%s%s"+!!(i%3),i%4?"":"[",i,i%4?"":"]",i%3?"":")",i%99?" ":"");}

Специфичная оптимизация: 115 байт

#include<stdio.h>
i;f(){for(;i++<99;)printf("(%s%d%s%s%s"+!!(i%3),i%4?"":"[",i,i%4?"":"]",i%3?"":")",i%99?" ":"");}
HatsuPointerKun
источник
MSVC позволяет тебе делать inf f()это? Извините, но я
удалил
@ Zacharý Нет, я думаю, что функция слишком проста, и она генерирует "f должен вернуть int". Кстати, ваше решение было на 3 байта короче (включая сжатие в сочетании с перемещением инкремента i)
HatsuPointerKun
1
Черт, точно забыл, была printfвещь. Не могли бы вы тогда использовать C stdio?
Захари
2
Еще одна вещь, которую вы можете использовать / эксплуатировать, это то, что, по крайней мере, в gcc 5.3.1 вам не нужен #include, и вы также можете удалить тип возвращаемого значения функции. Кроме того, если вы объявляете int iвнешнюю функцию (в глобальной области видимости), то ее значение по умолчанию равно 0, а тип данных по умолчанию равен int. Это приведет к тому, что ваш цикл начнется с 0, и чтобы исправить это, вы можете переместить приращение в выражение условия в цикле for, чтобы оно выглядело какi;f(){for(;++i<=99;)
mriklojn
1
Предлагаю ")\0"+i%3вместо i%3?"":")". Кроме того, я думаю, что вы должны добавить i=0в начале цикла.
потолок кошка
3

Powershell, 60 байт

"$(1..99|%{($_,"($_)","[$_]","([$_])")[!($_%3)+2*!($_%4)]})"

Объяснение:

  • массив с 4 элементами: $_, "($_)", "[$_]", "([$_])"
  • и индекс: [!($_%3)+2*!($_%4)]
  • повторить для каждого числа
  • преобразовать результат в строку

Менее гольф-тестовый сценарий:

$f = {

$r = 1..99|%{
    ($_, "($_)", "[$_]", "([$_])") [!($_%3)+2*!($_%4)]
}
"$($r)"

}

$expected = '1 2 (3) [4] 5 (6) 7 [8] (9) 10 11 ([12]) 13 14 (15) [16] 17 (18) 19 [20] (21) 22 23 ([24]) 25 26 (27) [28] 29 (30) 31 [32] (33) 34 35 ([36]) 37 38 (39) [40] 41 (42) 43 [44] (45) 46 47 ([48]) 49 50 (51) [52] 53 (54) 55 [56] (57) 58 59 ([60]) 61 62 (63) [64] 65 (66) 67 [68] (69) 70 71 ([72]) 73 74 (75) [76] 77 (78) 79 [80] (81) 82 83 ([84]) 85 86 (87) [88] 89 (90) 91 [92] (93) 94 95 ([96]) 97 98 (99)'
$result = &$f
$result-eq$expected
$result

Выход:

True
1 2 (3) [4] 5 (6) 7 [8] (9) 10 11 ([12]) 13 14 (15) [16] 17 (18) 19 [20] (21) 22 23 ([24]) 25 26 (27) [28] 29 (30) 31 [32] (33) 34 35 ([36]) 37 38 (39) [40] 41 (42) 43 [44] (45) 46 47 ([48]) 49 50 (51) [52] 53 (54) 55 [56] (57) 58 59 ([60]) 61 62 (63) [64] 65 (66) 67 [68] (69) 70 71 ([72]) 73 74 (75) [76] 77 (78) 79 [80] (81) 82 83 ([84]) 85 86 (87) [88] 89 (90) 91 [92] (93) 94 95 ([96]) 97 98 (99)
Mazzy
источник
3

MathGolf , 41 40 34 29 байт

♀({îû)(î+╫îa_'(\')ßyΓî34α÷ä§ 

ПРИМЕЧАНИЕ: у него есть пробел

Только мой второй ответ MathGolf.
-5 байтов благодаря @JoKing .

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

Объяснение:

♀(             # Push 99 (100 decreased by 1)
  {            # Start a loop, which implicitly loops down to (and excluding) 0
   û)(         #  Push string ")("
      î+       #  Append the 1-indexed index
              #  Rotate the string once towards the right
   îa          #  Push the 1-indexed index of the loop, wrap in a list
   _           #  Duplicate it
    '(        '#  Push string "("
      \        #  Swap the top two items of the stack
       ')     '#  Push string ")"
         ßy    #  Wrap all three into a list, and join them
   Γ           #  Wrap all four into a list
               #  (We now have a list [N, "(N)", "[N]", "([N])"], where N is the index)
   î           #  Push the 1-indexed index of the loop
    34         #  Push 3 and 4 to the stack
      α        #  Wrap all three into a list
       ÷       #  Check for each if the index is divisible by it
               #  (resulting in either [0,0], [0,1], [1,0], or [1,1]
        ä      #  Convert from binary to integer
               #  (resulting in either 0, 1, 2, or 3
         §     #  Push the string at that index from the array
               #  Push a space
               # (After the loop, output the entire stack joined together implicitly)
Кевин Круйссен
источник
@ JoKing Спасибо! Не знал, что qможно опустить, и это делается неявно в циклах. Кроме того, не знал, что есть 2/3/4-струнная встроенная. Жаль, что трюк поворота не работает с обернутым массивом.
Кевин Круйссен
Ну, более того, вместо этого я обменивал явный вывод каждой итерации на неявный вывод в конце программы
Джо Кинг,
@JoKing Да, но я не знал, что это выведет весь стек, а не только верх. :)
Кевин Круйссен
Мое решение приближалось к 40 байтам, хотя я неправильно прочитал и подумал, что вместо квадратных скобок следует использовать фигурные скобки. Хорошая работа над решением!
maxb
2

Lua, 161 123 байта

b=""for i=1,99 do;c,d=i%3==0,i%4==0;b=b..(c and"("or"")..(d and"["or"")..i..(d and"]"or"")..(c and")"or"").." "end;print(b)

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

Ungolfed:

b = ""
for i = 1, 99 do
    c = 1 % 3 == 0
    d = 1 % 4 == 0
    a = ""
    if c then
        a = a .. "("
    end
    if d then
        a = a .. "["
    end
    a = a .. i
    if d then
        a = a .. "]"
    end
    if c then
        a = a .. ")"
    end
    b = b .. a .. " "
end
print(b)
Дэвид Уитли
источник
2

C (gcc) , 84 байта

main(i){while(99/i++)printf("%s%s%d%s%s ","("+i%3,"["+i%4,i-1,"]"+i%4,")"+i%3);}

В начале каждой "строки скобок" есть нулевой байт.

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

Деннис
источник
И в "(" + i% 3 откуда вы знаете, что адрес для i = 2 указывает на нулевое значение символа? То же самое для "[" + i% 4 для i в {2,3}?
РосЛюП
Он работает с gcc, что достаточно хорошо, поскольку PPCG определяет языки по их реализациям.
Денис
Я думаю, вы не можете сказать, что код хорошо скомпилирован в каждой реализации компилятора gcc, возможно, только тот, который запускается на вашем компьютере (но возможно, не слишком)
RosLuP
@RosLuP НКУ делает работать так же , как на большинстве компьютеров , хотя, по крайней мере , на что - нибудь с той же архитектурой
ASCII-только
@ ASCII-только возможно, если скомпилировано, оптимизировано для пространства или скорости, результат отличается ... Я не знаю, выходит ли это за пределы стандарта ...
RosLuP
2

PowerShell , 67 62 байта

"$(1..99|%{'('*!($x=$_%3)+'['*!($y=$_%4)+$_+']'*!$y+')'*!$x})"

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

В основном это FizzBuzz, использующий логические переменные умножения строк (неявно приведенный к 1 или 0). Эти строки остаются в конвейере и собираются внутри блока скрипта внутри кавычек. Поскольку по умолчанию $OutputFieldSeparatorдля массива используются пробелы, это неявно дает нам разделенные пробелами элементы массива.

AdmBorkBork
источник
2

C #, 124 117 123 байта

-5 байт благодаря Кевину Круйссену

x=>{for(int i=0;i++<99;)System.Console.Write((i%3<1?"(":"")+(i%4<1?"[":"")+i+(i%4<1?"]":"")+(i%3<1?")":"")+(i>98?"":" "));}

Тест с:

Action<int> t = x=>{for(int i=0;i++<99;)System.Console.Write((i%3<1?"(":"")+(i%4<1?"[":"")+i+(i%4<1?"]":"")+(i%3<1?")":"")+(i>98?"":" "));}
t.Invoke(0);
Console.ReadKey();
HatsuPointerKun
источник
В поисках C #, я вижу. Разрешает ли C # целые числа в качестве левого аргумента для тернарного оператора, или он должен быть логическим?
Захари
Я не знаю много о C #, но вы могли бы использовать xвместо i, таким образом, не нужно беспокоиться о int ? (Вы все равно должны были бы установить его, конечно).
Захари
@ Zacharý Нет, выдает ошибку CS0029 "Не удается неявно преобразовать int в логическое значение". И да, я мог бы использовать iи тот факт, что я могу инициализировать его в 0, когда я Invoke. Но разве это не значит, что я должен был бы включить объявление t ( Action<int>) и call ( t.Invoke(0)) в счетчик байтов?
HatsuPointerKun
Я спрашиваю x=>{for(x=0;x++<99;)Console.Write((x%3==0?"(":"")+(x%4==0?"[":"")+x+(x%4==0?"]":"")+(x%3==0?")":"")+(x%99==0?"":" "));};, сработает ли что-то подобное .
Захари
1
Все пять ==0может быть <1.
Кевин Круйссен
2

Рубин , 72 66 байт

p [*1..99].map{|x|a=x
a="[#{x}]"if x%4<1
a="(#{a})"if x%3<1
a}*' '

Спасибо @ jonathan-frech и @ conor-obrien за дополнительную обрезку.

Будет крест
источник
Привет и добро пожаловать в PPCG! 70 байтов .
Джонатан Фрех
Добро пожаловать в PPCG! Вот еще 4 байта из предложения @JonathanFrench для 66 байтов , поскольку a.join bдля массива aи строки bэквивалентноa*b
Конор О'Брайен
2

PowerShell, 98 82 74 67 63 62 байта

Колоссальные -31 байт благодаря @Veskah -5 байт благодаря @ ASCII-only

(1..99|%{(($a=($_,"[$_]")[!($_%4)]),"($a)")[!($_%3)]})-join' '

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

Я до сих пор не совсем уверен, что я здесь сделал.

Габриэль Миллс
источник
Просто немного быстрой игры в гольф на 70 байтов . Вам не нужно приводить $ a в виде строки и "$a"все равно подставить в значение. (Примечание: одинарные кавычки не заменяют $foo, а только двойные) Еще один трюк, если ifs заботятся только о 0 или 1, поэтому вы можете использовать логическую логику для сохранения байта
Веска
67 байт, если вы используете индексацию списка.
Веска
также 67
только ASCII
63?
Только для ASCII
62?
Только для ASCII
1

perl -E, 60 байт

$,=$";say map$_%12?$_%3?$_%4?$_:"[$_]":"($_)":"([$_])",1..99

Некоторые байты могут быть сохранены, если мы можем использовать переводы строк между числами: в этом случае мы можем удалить $,=$";, преобразовать mapв forцикл, перемещая его sayв цикл.


источник
1
Вы Абигайль? Изобретатель ? /^1$|^(11+?)\1+$/
msh210
1
Вау. Какая честь, что ты здесь!
msh210
1

Perl 6 , 51 48 байтов

put {$_%3??$^a!!"($a)"}(++$_%4??$_!!"[$_]")xx 99

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

nwellnhof
источник
Я собирался злоупотребить различием между списками и представлениями массивов, как это , но я не уверен, как избавиться от заключающих в скобки вокруг всего списка ...
Джо Кинг,
@JoKing Я тоже об этом думал, но я придумал только этот 51-байтер .
nwellnhof
1

Пакет, 145 байт

@set s=
@for /l %%i in (1,1,99)do @set/an=%%i,b=n%%4,p=n%%3&call:c
@echo%s%
:c
@if %b%==0 set n=[%n%]
@if %p%==0 set n=(%n%)
@set s=%s% %n%

Код проваливается в подпрограмму, но к этому моменту строка уже напечатана, поэтому код выполняется безобидно.

Нил
источник
1

сфк , 225 байт

for n from 1 to 99 +calc -var #(n)/3+1/3 -dig=0 +calc -var #text*3-#(n) +setvar t +calc -var #(n)/4 -dig=0 +calc -var #text*4-#(n) +xed -var _0_#(t)\[#(n)\]_ _*_#(t)#(n)_ +xed _0*_([part2])_ _?*_[part2]_ +xed "_\n_ _" +endfor

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

Οurous
источник
1

Баш, 61 байт

-14 байт, спасибо Денису

seq 99|awk '{ORS=" ";x=$1%4?$1:"["$1"]";print$1%3?x:"("x")"}'

объяснение

Довольно просто:

  • seq производит 1..99
  • мы передаем это awkс разделителем выходной записи ( ORS), установленным в пробел, чтобы вывод был одной строкой.
  • основное тело awk просто добавляет «[]», когда число делится на 4, а затем добавляет «()», когда оно делится на 3.

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

Ион
источник
1

JavaScript (Node.js) , 57 байт

f=(n=99)=>n&&f(n-1)+(s=n%4?n:`[${n}]`,n%3?s:`(${s})`)+' '

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

Изменено на сообщество, потому что оптимизация слишком полагается на него

оборота l4m2
источник
Вы можете значительно сократить, делая${n%4?n:`[${n}]`}
ETHproductions
66 байт (с предложением ETH)
Alion
59 байтов
Арно
57 байтов
Нейл
1

PHP, 65 байт

while($i++<99)echo$i%4?$i%3?$i:"($i)":($i%3?"[$i]":"([$i])")," ";

или

while($i++<99)echo"("[$i%3],"["[$i%4],$i,"]"[$i%4],")"[$i%3]," ";

(требуется PHP 5.5 или более поздняя версия)

Запустите -nrили попробуйте их онлайн .

Titus
источник
1

Python 2 , 78 байт

i=0
exec"i+=1;u=i%3/-2*(i%4/-3-1);print'([%0d])'[u:7-u:1+(i%3<1<=i%4)]%i,;"*99

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

Я представлял себе этот крутой подход нарезки, '([%0d])'но я не могу получить выражения короче.

Линн
источник
1

Java 8, 92 91 байт

-1 байт благодаря @Dana

i->{for(;i++<99;)out.printf((i>1?" ":"")+(i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i),i);}

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

Альтернативное решение, 82 байта (с завершающим пробелом в выходных данных - не уверен, разрешено ли это):

i->{for(;i++<99;)out.printf((i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)+" ",i);}

Объяснение:

for(;i++<99;)- цикл for, который переходит от значения i(повторно используемого в качестве входного значения, в данном случае принимается равным 0) до 99

out.printf(<part1>+<part2>,i); - форматирует строку перед немедленной ее печатью в стандартный вывод со значением i

где <part1>это (i>1?" ":"")- печатает пространство перед печатью номера , если это число не является 1, в этом случае он опускает пространство

и <part2>это (i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)- если iделится как 3 и 4, iимеет как квадратные и круглые скобки вокруг него; иначе, если iделится на 3, iимеет круглые скобки; иначе, если iделится на 4, iимеет квадратные скобки; остальное iне имеет скобок.

NotBaal
источник
Сохраните байт, перемещая пробел в начало каждой итерации цикла(i>1:" ":"")
Дана
Это сработало бы, только если я напечатал результат в обратном порядке (см. Это ), но на самом деле сэкономило бы 2 байта вместо 1.
NotBaal
К сожалению, это не то же самое, что ожидаемый результат по вопросу, но, тем не менее, спасибо за предложение!
NotBaal
1
Ссылки "попробуйте онлайн", похоже, не работают. Я думал i->{for(;i++<99;)out.printf((i>1?" ":"")+(i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i),i);}?
Дана
1
Оооо, ты прав, это работает! Спасибо за это!
NotBaal