Тест на кратність


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

@Jonah Я не можу вивести його як повний рядок, він відрізається (...) stdout цього не робить, і він також не друкує новий рядок, тому я також можу друкувати кожне число окремо. Чомусь, хоча це робить пробіли, які з’являються задніми місцями (їх є 4, і лише 1 навмисно є)
FrownyFrog

Цей підхід дійсно розумний, як обертання, так і вибір, який потрібно використовувати #. Я представив допоміжне дієслово для об'ємного звучання з ()і []: g=. {.@[ , ":@] , {:@[. тьфу багатослівність!
Йона

ще одне питання: будь-яка причина, яку ви використовували LFзамість цього _. останній, здається, теж працює.
Йона

3

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

-5 байт завдяки Zacharý та надихнуто функцією write () мовою D (див. Відповідь Zacharý)

-2 байти завдяки mriklojn

-12 байт для версії C завдяки mriklojn

-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?" ":"");}

C Специфічна оптимізація: 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ý

@ Zacharý Ні, я думаю, що функція занадто проста і вона генерує "f повинен повернути цілий". До речі, ваше рішення було на 3 байти коротше (
включте

1
Данг, смертельно забутий printfбув річ. Не могли б ви потім використовувати C stdio?
Zacharý

2
Інша річ, яку ви можете використовувати / експлуатувати, - це той факт, що, принаймні, з gcc 5.3.1, вам не потрібен #include, і ви також можете видалити тип повернення функції. Крім того, якщо ви оголошуєте функцію int iза межами (у глобальному масштабі), то її значення за замовчуванням до 0, а тип даних за замовчуванням - int. Це призведе до того, що ваш цикл починається з 0, і щоб виправити це, ви можете перенести приріст у вираз стану у своєму циклі для циклу, зробивши його таким чином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-string. Шкода, що трюк обертання не працює із загорнутим масивом.
Kevin Cruijssen

Ну, тим більше, що я торгував явним висновком кожної ітерації для неявного виводу в кінці програми замість цього
Jo King

@JoKing Так, але я не знав, що це виведе весь стек, з'єднаний разом, а не лише верх. :)
Кевін Кройсейсен

Моє рішення наближалося до 40 байт, хоча я неправильно читав і вважав, що фігурні дужки слід використовувати замість квадратних дужок. Гарна робота над рішенням!
maxb


2

Луа, 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)

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

Безголівки:

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 вказує на нульове значення char? Те саме для "[" + i% 4 для i в {2,3}?
RosLuP

Він працює з 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 байт завдяки Kevin Cruijssen

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 # цілі числа в якості лівого аргументу потрійному оператору, або він повинен бути булевим?
Zacharý

Я не знаю багато про C #, але ви могли б використовувати xзамість цього i, не турбуючись про це int ? (Ви, звичайно, все одно повинні були встановити це).
Zacharý

@ Zacharý Ні, це генерує помилку CS0029 "Неможливо неявно перетворитись в булева". І так, я міг би використати 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?"":" "));};спрацювало б щось подібне .
Zacharý

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
Conor O'Brien,

2

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

Широкі -31 байт завдяки @Veskah -5 байт завдяки @ ASCII

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

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

Я все ще не зовсім впевнений, що я тут зробив.


Лише швидкий гольф на 70 байт . Не потрібно викидати $ a як рядок і "$a"все одно буде замінювати значення. (Примітка: Одиночні лапки не замінюють $foo, а лише подвійні лапки). Ще одна хитрість - це якщо байдуже лише 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

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


Я збирався зловживати різницею між списками та представленнями масивів, як це , але я не впевнений, як позбутися вкладених дужок у всьому списку ...
Jo King

@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)
Аліон





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;)- a для циклу, який переходить від значення i(повторно використаного як вхідного даних, прийнятого як 0 в цьому випадку) до 99

out.printf(<part1>+<part2>,i); - форматує рядок перед тим, як негайно надрукувати його в stdout зі значенням 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);}?
Dana

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