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


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)


3
Можем ли мы вывести каждую запись в новой строке или все выходные должны быть в одной строке?
ETHproductions

4
Может ли вывод заканчиваться пробелом? Несколько ответов, похоже, предполагают это.
Денис

Ответы:





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

Древесный уголь , 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

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


Спасибо за это. Кроме того, почему ты должен делать 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?" ":"");}

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)

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для массива используются пробелы, это неявно дает нам разделенные пробелами элементы массива.


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

В поисках 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 байт, если вы используете индексацию списка.
Веска




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

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


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

@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

Баш, 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})`)+' '

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

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


Вы можете значительно сократить, делая${n%4?n:`[${n}]`}
ETHproductions

66 байт (с предложением ETH)
Alion



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или попробуйте их онлайн .



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не имеет скобок.


Сохраните байт, перемещая пробел в начало каждой итерации цикла(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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.