Test wielokrotności

21

Użyj dowolnego języka programowania, aby wyświetlić liczby od 1 do 99 (w tym oba) w taki sposób, aby:

  • liczby są oddzielone pojedynczym odstępem,
  • jeśli liczba jest podzielna przez 3, powinna być w nawiasach,
  • jeśli liczba jest podzielna przez 4, powinna być w nawiasach kwadratowych,
  • jeśli liczba jest podzielna przez 3 i 4, powinna znajdować się zarówno w nawiasach, jak i nawiasach kwadratowych (z nawiasami kwadratowymi bliższymi liczbie).

Twój program powinien wyświetlać dokładnie:

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
źródło
6
Powiązane
ETHproductions
3
Czy możemy wypisywać każdy wpis w nowym wierszu, czy też dane wyjściowe muszą znajdować się w jednym wierszu?
ETHprodukcje
4
Czy wyjście może kończyć się spacją. Wydaje się, że tak brzmi kilka odpowiedzi.
Dennis

Odpowiedzi:

7

05AB1E , 23 bajty

-1 bajt dzięki Kevin Cruijssen

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

Wypróbuj online!

Okx
źródło
1
-1 bajt, zmieniając }?ð?na ]ðý(zamknij pętlę if i pętlę i połącz cały stos spacjami)
Kevin Cruijssen
@KevinCruijssen Dzięki, właśnie tego szukałem!
Okx,
6

Python 2 , 68 65 60 bajtów

i=0
exec"i+=1;print'('[i%3:]+`[i][i%4:]or i`+')'[i%3:],;"*99

Wypróbuj online!

ovs
źródło
1
Miałem rację :) +1
ElPedro
5

R , 61 bajtów

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

Wypróbuj online!

J.Doe
źródło
2
genialne aliasing!
Giuseppe,
Jak to w ogóle działa? To wspaniale! +1 do ciebie, mój przyjacielu
Sumner18,
4

Galaretka , 21 20 bajtów

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

Wypróbuj online!

Jak to działa

³Ṗµ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.
Dennis
źródło
3

D , 110 bajtów

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

Wypróbuj online!

Przeniesiony z odpowiedzi C ++ @ HatsuPointerKun.

Zacharý
źródło
3

Węgiel drzewny , 30 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

    ⁹⁹                          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
Neil
źródło
3

J , 54 53 bajtów

1 bajt mniej dzięki @Jonah

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

Wypróbuj online!

FrownyFrog
źródło
Dzięki za zrobienie tego. Poza tym, dlaczego musicie stdouttu robić ... Nigdy wcześniej tego nie widziałem. @FrownyFrog
Jonah
@Jonah Nie mogę wyprowadzić go jako kompletnego ciągu, zostaje odcięty (...). Stdout tego nie robi i nie drukuje też nowego wiersza, więc mogę również wydrukować każdą liczbę osobno. Z jakiegoś powodu jednak powoduje pojawienie się spacji końcowych (są 4, a tylko 1 jest tam celowo)
FrownyFrog
To podejście jest naprawdę sprytne, zarówno rotacja, jak i wybór zastosowania #. I wprowadził pomocniczy czasownik przestrzennego z ()i []: g=. {.@[ , ":@] , {:@[. uogólnienie!
Jonasz
jeszcze jedno pytanie: z jakiegokolwiek powodu, którego użyłeś LFzamiast _. ten drugi też wydaje się działać.
Jonasz
3

C, C ++, 136 133 131 129 128 124 bajtów

-5 bajtów dzięki Zacharýowi i zainspirowanemu funkcją write () w języku D (patrz Zacharý odpowiedź)

-2 bajty dzięki mriklojn

-12 bajtów dla wersji C dzięki mriklojn

-4 bajty dzięki pułapkowi cat

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

Optymalizacja specyficzna dla C: 115 bajtów

#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
źródło
Czy MSVC pozwala ci to zrobić inf f()? Przepraszam za usunięcie moich komentarzy, myślałem, że mam coś krótszego (nie miałem)
Zacharý
@ Zacharý Nie, myślę, że funkcja jest zbyt prosta i generuje „f musi zwrócić int”. BTW, twoje rozwiązanie było o 3 bajty krótsze (w tym kompresja połączona z przesunięciem przyrostu i)
HatsuPointerKun
1
Cholera, zapomniałem printf. Nie mógłbyś wtedy użyć C stdio?
Zacharý
2
Inną rzeczą, której możesz użyć / wykorzystać, jest fakt, że przynajmniej w gcc 5.3.1 nie potrzebujesz #include, a także możesz usunąć typ zwracanej funkcji. Dodatkowo, jeśli zadeklarujesz int izewnętrzną funkcję (w zakresie globalnym), wówczas jej wartość domyślnie wynosi 0, a typ danych domyślnie int. Powoduje to, że twoja pętla zaczyna się od 0, a aby to naprawić, możesz przenieść przyrost do wyrażenia warunkowego w swojej pętli for, dzięki czemu będzie wyglądać taki;f(){for(;++i<=99;)
mriklojn
1
Zaproponuj ")\0"+i%3zamiast i%3?"":")". Myślę też, że musisz dodać i=0na początku pętli.
ceilingcat
3

PowerShell, 60 bajtów

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

Wyjaśnienie:

  • tablica z 4 elementami: $_, "($_)", "[$_]", "([$_])"
  • i indeks: [!($_%3)+2*!($_%4)]
  • powtórz dla każdej liczby
  • przekonwertować wynik na ciąg

Skrypt testowy mniej golfowy:

$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

Wydajność:

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
źródło
3

MathGolf , 41 40 34 29 bajtów

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

UWAGA: Ma spację końcową

Tylko moja druga odpowiedź MathGolf ..
-5 bajtów dzięki @JoKing .

Wypróbuj online.

Wyjaśnienie:

♀(             # 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)
Kevin Cruijssen
źródło
@JoKing Thanks! Nie wiedziałem, że qmożna to pominąć i odbywa się to pośrednio w pętlach. Nie wiedziałem też, że jest wbudowany ciąg 2/3/4. Szkoda, że ​​sztuczka obracania nie działa z opakowaną tablicą.
Kevin Cruijssen
Cóż, bardziej chodzi o to, że wymieniłem jawne dane wyjściowe przy każdej iteracji na dane niejawne na końcu programu
Jo King
@JoKing Tak, ale nie wiedziałem, że to spowoduje, że cały stos zostanie połączony, a nie tylko górny. :)
Kevin Cruijssen
Moje rozwiązanie zbliżało się do 40 bajtów, chociaż źle odczytałem i pomyślałem, że zamiast nawiasów kwadratowych należy użyć nawiasów klamrowych. Dobra robota w rozwiązaniu!
maxb
2

Lua, 161 123 bajtów

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)

Wypróbuj online!

Nie golfowany:

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)
David Wheatley
źródło
2

C (gcc) , 84 bajtów

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

Na początku każdego „łańcucha nawiasu” znajduje się bajt zerowy.

Wypróbuj online!

Dennis
źródło
A w „(” + i% 3, skąd wiesz, że ten adres dla i = 2 wskazuje na zerową wartość char? To samo dla „[” + i% 4 dla i w {2,3}?
RosLuP
Działa z gcc, co jest wystarczająco dobre, ponieważ PPCG definiuje języki przez ich implementacje.
Dennis,
Myślę, że nie można powiedzieć, że kod jest poprawnie kompilowany w każdej implementacji kompilatora gcc, być może tylko ten jeden działa na komputerze (ale nie jest to również możliwe)
RosLuP,
@RosLuP gcc nie działają w ten sam sposób, choć na większości komputerów, przynajmniej na coś z tej samej architekturze
ASCII tylko
@ ASCII - możliwe tylko, jeśli jest skompilowane zoptymalizowane pod kątem miejsca lub prędkości, wynik jest inny ... Nie wiem, czy nie jest to standard ...
RosLuP,
2

PowerShell , 67 62 bajtów

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

Wypróbuj online!

Zasadniczo FizzBuzz wykorzystujący mnożenie ciągów zmiennych boolowskich (domyślnie rzut na 1 lub 0). Te ciągi są pozostawione w potoku i zebrane w bloku skryptu w cudzysłowie. Ponieważ domyślną $OutputFieldSeparatortablicą są spacje, domyślnie daje nam to elementy tablicy rozdzielone spacjami.

AdmBorkBork
źródło
2

C #, 124 117 123 bajtów

-5 bajtów dzięki 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?"":" "));}

Testuj z:

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
źródło
Widzę, że w drodze do C #. Czy C # zezwala na liczby całkowite jako lewy argument dla operatora trójskładnikowego, czy też musi to być wartość logiczna?
Zacharý
Nie wiem dużo o C #, ale czy mógłbyś użyć xzamiast tego i, więc nie musisz się martwić int ? (Oczywiście nadal musiałbyś to ustawić).
Zacharý
@ Zacharý Nie, generuje błąd CS0029 „Nie można niejawnie przekonwertować int na wartość logiczną”. I tak, mógłbym użyć ii fakt, że mogę zainicjować go na 0, kiedy ja Invoke. Ale czy to nie znaczy, że musiałbym dołączyć deklarację t ( Action<int>) i call ( t.Invoke(0)) do bajtu?
HatsuPointerKun
Pytam, czy coś takiego x=>{for(x=0;x++<99;)Console.Write((x%3==0?"(":"")+(x%4==0?"[":"")+x+(x%4==0?"]":"")+(x%3==0?")":"")+(x%99==0?"":" "));};by działało.
Zacharý
1
Wszystkie pięć ==0może być <1.
Kevin Cruijssen
2

Rubin , 72 66 bajtów

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

Dzięki @ jonathan-frech i @ conor-obrien za dodatkowe przycinanie.

Przejdzie
źródło
Witaj w PPCG! 70 bajtów .
Jonathan Frech
Witamy w PPCG! Oto kolejne 4 bajty poza sugestią @JonathanFrench, dla 66 bajtów , ponieważ a.join btablica ai ciąg znaków bsą równoważnea*b
Conor O'Brien
2

PowerShell, 98 82 74 67 63 62 bajtów

Ogromne -31 bajtów dzięki @Veskah -5 bajtów dzięki @ ASCII-only

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

Wypróbuj online!

Nadal nie jestem pewien, co tu zrobiłem.

Gabriel Mills
źródło
Kilka szybkich golfów za 70 bajtów . Nie musisz rzucać $ a jako łańcucha i "$a"nadal będziesz podstawiał wartość. (Uwaga: Pojedyncze cudzysłowy nie zastępują $foo, tylko podwójne cudzysłowy). Inną sztuczką jest, jeśli zależy tylko na 0 lub 1, więc możesz użyć logiki boolowskiej, aby zapisać bajt
Veskah
67 bajtów, jeśli używasz również indeksowania list.
Veskah
również 67
tylko ASCII
63?
Tylko ASCII
62?
Tylko ASCII
1

perl -E, 60 bajtów

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

Niektóre bajtów mogą być zapisywane, jeśli możemy użyć nowej linii pomiędzy numerami: w tym przypadku, możemy usunąć $,=$";, zmienić mapsię w forpętli, natomiast przesunięcie sayw pętli.


źródło
1
Czy jesteś Abigail? Twórca ? /^1$|^(11+?)\1+$/
msh210,
1
Łał. Co za zaszczyt mieć cię tutaj!
msh210,
1

Perl 6 , 51 48 bajtów

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

Wypróbuj online!

nwellnhof
źródło
Zamierzałem nadużyć różnicy między listami a reprezentacjami tablicowymi w ten sposób , ale nie jestem pewien, jak pozbyć się nawiasów otaczających całą listę ...
Jo King
@JoKing Też o tym myślałem, ale wymyśliłem tylko ten 51-bajter .
nwellnhof,
1

Partia, 145 bajtów

@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%

Kod wpada do podprogramu, ale w tym momencie łańcuch został już wydrukowany, więc kod działa nieszkodliwie.

Neil
źródło
1

Czysty , 100 bajtów

import StdEnv,Text

join" "[if(n/3*3<n)m("("+m+")")\\n<-[1..99],m<-[if(n/4*4<n)(""<+n)("["<+n<+"]")]]

Wypróbuj online!

Obrzydliwe
źródło
1

sfk , 225 bajtów

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

Wypróbuj online!

Obrzydliwe
źródło
1

Bash, 61 bajtów

-14 bajtów, dzięki Dennisowi

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

wyjaśnienie

Całkiem proste:

  • seq produkuje 1..99
  • podłączamy do niego awkz separatorem rekordów wyjściowych ( ORS) ustawionym na spację, aby wynik był pojedynczą linią.
  • główny awk dodaje tylko „[]”, gdy liczba jest podzielna przez 4, a następnie dodaje „()”, gdy dzieli się przez 3.

Wypróbuj online!

Jonasz
źródło
1

PHP, 65 bajtów

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

lub

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

(wymaga PHP 5.5 lub nowszego)

Uruchom je -nrlub wypróbuj online .

Tytus
źródło
1

Python 2 , 78 bajtów

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

Wypróbuj online!

Wyobraziłem sobie takie fajne podejście do krojenia, '([%0d])'ale nie mogę skrócić wyrażeń.

Lynn
źródło
1

Java 8, 92 91 bajtów

-1 bajt dzięki @Dana

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

Wypróbuj online!

Alternatywne rozwiązanie, 82 bajty (ze spacją na wyjściu - nie jestem pewien, czy jest to dozwolone):

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

Wyjaśnienie:

for(;i++<99;)- pętla for, która przechodzi od wartości i(ponownie użytej jako dane wejściowe, przyjmowanej w tym przypadku jako 0) do 99

out.printf(<part1>+<part2>,i); - formatuje ciąg przed natychmiastowym wydrukowaniem go na standardowe wyjście z wartością i

gdzie <part1>jest (i>1?" ":"")- drukuje spację przed wydrukowaniem liczby, chyba że liczba ta wynosi 1, w którym to przypadku pomija spację

i <part2>jest (i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)- jeśli ijest podzielne zarówno przez 3, jak i 4, ima wokół siebie nawiasy kwadratowe i okrągłe; w przeciwnym razie jeśli imożna podzielić przez 3, ima nawiasy okrągłe; w przeciwnym razie jeśli imożna podzielić przez 4, ima nawiasy kwadratowe; jeszcze,i nie ma nawiasów.

NotBaal
źródło
Oszczędź bajt, przenosząc spację na początek każdej iteracji pętli(i>1:" ":"")
dana
Działałoby to tylko wtedy, gdy wydrukowałem wynik w odwrotnej kolejności (zobacz to ), ale w rzeczywistości zaoszczędziłbym 2 bajty zamiast 1.
NotBaal 11.11.2018
Niestety nie jest to to samo, co oczekiwany wynik z pytania, ale mimo to dziękuję za sugestię!
NotBaal,
1
Linki „spróbuj online” wydają się być zepsute. Myślałam i->{for(;i++<99;)out.printf((i>1?" ":"")+(i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i),i);}?
dana
1
Och, masz rację, że to działa! Dziękuję za to!
NotBaal,