Test de multiplicité

21

Utilisez n'importe quel langage de programmation pour afficher les nombres entre 1 et 99 (y compris les deux) de manière à ce que:

  • les nombres sont séparés par un seul espace,
  • si un nombre est divisible par 3, il doit être entre parenthèses,
  • si un nombre est divisible par 4, il doit être entre crochets,
  • si un nombre est divisible par 3 et 4, il doit être à la fois entre parenthèses et entre crochets (avec des crochets plus proches du nombre).

Votre programme doit afficher exactement:

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
la source
6
Connexes
ETHproductions
3
Pouvons-nous sortir chaque entrée sur une nouvelle ligne, ou la sortie doit-elle être sur une seule ligne?
ETHproductions
4
La sortie peut-elle se terminer par un espace. Quelques réponses semblent le supposer.
Dennis

Réponses:

7

05AB1E , 23 octets

-1 octet grâce à Kevin Cruijssen

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

Essayez-le en ligne!

Okx
la source
1
-1 octet en changeant }?ð?en ]ðý(fermez à la fois l'if et la boucle, et joignez la pile entière par des espaces)
Kevin Cruijssen
@KevinCruijssen Merci, c'est exactement ce que je cherchais!
Okx
6

Python 2 , 68 65 60 octets

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

Essayez-le en ligne!

ovs
la source
1
J'avais raison :) +1
ElPedro
5

R , 61 octets

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

Essayez-le en ligne!

J.Doe
la source
2
aliasing brillant!
Giuseppe
Comment ça marche même? C'est incroyable! +1 à vous mon ami
Sumner18
4

Gelée , 21 20 octets

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

Essayez-le en ligne!

Comment ça marche

³Ṗµ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
la source
3

D , 110 octets

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

Essayez-le en ligne!

Porté depuis la réponse C ++ de @ HatsuPointerKun.

Zacharý
la source
3

Fusain , 30 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

    ⁹⁹                          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
la source
3

J , 54 53 octets

1 octet de moins grâce à @Jonah

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

Essayez-le en ligne!

FrownyFrog
la source
Merci d'avoir fait celui-ci. Aussi, pourquoi devez-vous faire stdoutici ... Je n'ai jamais vu ça auparavant. @FrownyFrog
Jonah
@Jonah Je ne peux pas le produire sous forme de chaîne complète, il est coupé (...) Stdout ne fait pas cela, et il n'imprime pas non plus une nouvelle ligne, donc je peux également imprimer chaque numéro séparément. Pour une raison quelconque, il fait apparaître des espaces de fin (il y en a 4 et seulement 1 est intentionnellement là)
FrownyFrog
Cette approche est vraiment intelligente, à la fois la rotation et le choix à utiliser #. J'avais introduit un verbe auxiliaire pour entourer avec ()et []: g=. {.@[ , ":@] , {:@[. ugh la verbosité!
Jonah
encore une question: toute raison que vous avez utilisée LFau lieu de _. ce dernier semble fonctionner aussi.
Jonah
3

C, C ++, 136 133 131 129 128 124 octets

-5 octets grâce à Zacharý et inspiré par la fonction write () en langage D (voir la réponse de Zacharý)

-2 octets grâce à mriklojn

-12 octets pour la version C grâce à mriklojn

-4 octets grâce au plafond

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

Optimisation spécifique C: 115 octets

#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
la source
MSVC vous permet-il de faire la inf f()chose? Désolé de supprimer mes commentaires, je pensais que j'avais quelque chose de plus court (je ne l'ai pas fait)
Zacharý
@ Zacharý Non, je pense que la fonction est trop simple et qu'elle génère un "f doit retourner un int". BTW, votre solution était plus courte de 3 octets (inclure la compression associée au déplacement de l'incrémentation de i)
HatsuPointerKun
1
Dang, j'avais oublié printfquelque chose. Ne pourriez-vous pas utiliser le C stdio alors?
Zacharý
2
Une autre chose que vous pourriez utiliser / exploiter est le fait que, au moins avec gcc 5.3.1, vous n'avez pas besoin du #include, et vous pouvez également supprimer le type de retour de fonction. De plus, si vous déclarez l' int iextérieur de la fonction (dans la portée globale), sa valeur par défaut est 0 et le type de données par défaut int. Cela entraînerait votre boucle à partir de 0, et pour résoudre ce problème, vous pourriez déplacer l'incrément dans l'expression de condition dans votre boucle for, ce qui ressemblerait ài;f(){for(;++i<=99;)
mriklojn
1
Suggérer à la ")\0"+i%3place de i%3?"":")". De plus, je pense que vous devez ajouter i=0au début de la boucle.
plafondcat
3

Powershell, 60 octets

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

Explication:

  • le tableau à 4 éléments: $_, "($_)", "[$_]", "([$_])"
  • et l'indice: [!($_%3)+2*!($_%4)]
  • répéter pour chaque numéro
  • convertir le résultat en une chaîne

Script de test moins golfé:

$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

Sortie:

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
la source
3

MathGolf , 41 40 34 29 octets

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

REMARQUE: il a un espace de fin

Seule ma deuxième réponse MathGolf ..
-5 octets grâce à @JoKing .

Essayez-le en ligne.

Explication:

♀(             # 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
la source
@JoKing Merci! Je ne savais pas que le qpouvait être omis et cela se faisait implicitement en boucles. De plus, je ne savais pas qu'il y avait une fonction intégrée 2/3/4 cordes. Dommage que cette rotation ne fonctionne pas avec le tableau encapsulé.
Kevin Cruijssen
Eh bien, c'est plus que j'ai plutôt échangé la sortie explicite à chaque itération pour une sortie implicite à la fin du programme
Jo King
@JoKing Oui, mais je ne savais pas que cela produirait la pile entière réunie, au lieu du haut. :)
Kevin Cruijssen
Ma solution approchait des 40 octets, bien que j'aie mal lu et pensé que les crochets devraient être utilisés à la place des crochets. Bon travail sur la solution!
maxb
2

Haskell , 77 octets

unwords[f"()"3$f"[]"4$show n|n<-[1..99],let f(x:r)m s|mod n m<1=x:s++r|1<3=s]

Essayez-le en ligne!

Je me demande si cela show[n]peut être utilisé pour raccourcir les choses, jusqu'à présent en vain .

Laikoni
la source
2

Lua, 161 123 octets

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)

Essayez-le en ligne!

Non golfé:

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
la source
2

C (gcc) , 84 octets

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

Il y a un octet nul au début de chaque "chaîne de parenthèses".

Essayez-le en ligne!

Dennis
la source
Et dans "(" + i% 3 comment savez-vous que l'adresse pour i = 2 pointe vers une valeur de zéro? La même chose pour "[" + i% 4 pour i dans {2,3}?
RosLuP
Cela fonctionne avec gcc, ce qui est assez bon, car PPCG définit les langues par leurs implémentations.
Dennis
Je pense que vous ne pouvez pas dire que le code est bien compilé dans chaque implémentation du compilateur gcc, peut-être seulement celui exécuté sur votre PC (mais pas trop)
RosLuP
@RosLuP gcc ne fonctionnent de la même façon sur la plupart des ordinateurs mais, au moins sur quoi que ce soit avec la même architecture
ASCII seulement
@ ASCII uniquement possible si est compilé optimisé pour l'espace ou pour la vitesse, le résultat est différent ... Je ne sais pas s'il est hors norme ...
RosLuP
2

PowerShell , 67 62 octets

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

Essayez-le en ligne!

Fondamentalement, un FizzBuzz utilisant des multiplications de chaînes multipliées par des variables booléennes (implicitement converties en 1 ou 0). Ces chaînes sont laissées sur le pipeline et rassemblées dans un bloc de script entre guillemets. Étant donné que la valeur $OutputFieldSeparatorpar défaut pour un tableau est des espaces, cela nous donne implicitement des éléments de tableau délimités par des espaces.

AdmBorkBork
la source
2

C #, 124 117 123 octets

-5 octets grâce à 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?"":" "));}

Testez avec:

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
la source
Dans l'incursion de C #, je vois. C # autorise-t-il les entiers comme argument de gauche pour un opérateur ternaire, ou doit-il être un booléen?
Zacharý
Je ne sais pas grand-chose sur C #, mais pourriez-vous utiliser à la xplace de i, donc ne pas avoir à vous soucier du int ? (Vous devrez toujours le régler, bien sûr).
Zacharý
@ Zacharý Non, il génère une erreur CS0029 "Impossible de convertir implicitement int en booléen". Et oui, je pourrais utiliser iet le fait que je peux l'initialiser à 0 quand je Invoke. Mais cela ne signifierait-il pas que je devrais inclure la déclaration de t ( Action<int>) et de l'appel ( t.Invoke(0)) dans le bytecount?
HatsuPointerKun
Je demande si quelque chose comme ça x=>{for(x=0;x++<99;)Console.Write((x%3==0?"(":"")+(x%4==0?"[":"")+x+(x%4==0?"]":"")+(x%3==0?")":"")+(x%99==0?"":" "));};fonctionnerait.
Zacharý
1
Les cinq ==0peuvent l'être <1.
Kevin Cruijssen,
2

Rubis , 72 66 octets

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

Merci à @ jonathan-frech et @ conor-obrien pour une coupe supplémentaire.

Will Cross
la source
Bonjour et bienvenue chez PPCG! 70 octets .
Jonathan Frech
Bienvenue chez PPCG! Voici encore 4 octets de la suggestion de @JonathanFrench, pour 66 octets , car a.join bpour un tableau aet une chaîne béquivaut àa*b
Conor O'Brien
2

PowerShell, 98 82 74 67 63 62 octets

Un énorme -31 octets grâce à @Veskah -5 octets grâce à @ ASCII uniquement

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

Essayez-le en ligne!

Je ne suis toujours pas sûr de ce que j'ai fait ici.

Gabriel Mills
la source
Juste un peu de golf rapide pour 70 octets . Vous n'avez pas besoin de transtyper $ a en chaîne et vous "$a"continuerez de la remplacer dans la valeur. (Remarque: les guillemets simples ne remplacent pas $foo, seuls les guillemets doubles). Une autre astuce consiste à ne se soucier que de 0 ou 1, vous pouvez donc utiliser la logique booléenne pour enregistrer un octet
Veskah
67 octets si vous utilisez également l'indexation de liste.
Veskah
également 67
ASCII uniquement
63?
ASCII uniquement le
62?
ASCII uniquement le
1

perl -E, 60 octets

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

Certains octets peuvent être enregistrés si nous pouvons utiliser des sauts de ligne entre les nombres: dans ce cas, nous pouvons supprimer le $,=$";, le transformer mapen forboucle, tout en déplaçant le saydans la boucle.


la source
1
Êtes - vous le Abigail? Inventeur de /^1$|^(11+?)\1+$/?
msh210
1
Sensationnel. Quel honneur de vous avoir ici!
msh210
1

Perl 6 , 51 48 octets

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

Essayez-le en ligne!

nwellnhof
la source
J'allais abuser de la différence entre les listes et les représentations de tableaux, comme ça , mais je ne sais pas comment me débarrasser des crochets entourant toute la liste ...
Jo King
@JoKing J'y ai pensé aussi, mais je n'ai trouvé que ce 51 octets .
nwellnhof
1

Lot, 145 octets

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

Le code tombe dans le sous-programme, mais la chaîne a déjà été imprimée à ce stade, de sorte que le code s'exécute sans danger.

Neil
la source
1

sfk , 225 octets

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

Essayez-le en ligne!

Οurous
la source
1

Bash, 61 octets

-14 octets, merci à Dennis

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

explication

Assez simple:

  • seq produit 1..99
  • nous le redirigeons awkavec le séparateur d'enregistrement de sortie ( ORS) défini sur espace de sorte que la sortie soit une seule ligne.
  • le corps awk principal ajoute simplement "[]" lorsque le nombre est divisible par 4, puis ajoute, en plus de cela, "()" lorsqu'il est divisible par 3.

Essayez-le en ligne!

Jonas
la source
1

PHP, 65 octets

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

ou

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

(nécessite PHP 5.5 ou version ultérieure)

Courez avec -nrou essayez-les en ligne .

Titus
la source
1

Python 2 , 78 octets

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

Essayez-le en ligne!

J'ai imaginé cette approche cool, '([%0d])'mais je ne peux pas raccourcir les expressions.

Lynn
la source
1

Java 8, 92 91 octets

-1 octet grâce à @Dana

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

Essayez-le en ligne!

Solution alternative, 82 octets (avec espace de fin dans la sortie - je ne sais pas si cela est autorisé):

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

Explication:

for(;i++<99;)- une boucle for qui va de la valeur de i(réutilisée en entrée, prise à 0 dans ce cas) à 99

out.printf(<part1>+<part2>,i); - formate la chaîne avant de l'imprimer immédiatement sur stdout avec la valeur de i

where <part1>is (i>1?" ":"")- imprime l'espace avant d' imprimer le nombre sauf si ce nombre est 1, auquel cas il omet l'espace

et <part2>est (i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)- s'il iest divisible par 3 et 4, ia des crochets carrés et ronds autour; sinon si iest divisible par 3, ia des parenthèses rondes; sinon si iest divisible par 4, ia des crochets; sinon, in'a pas de crochets.

NotBaal
la source
Enregistrez un octet en déplaçant l'espace au début de chaque itération de boucle(i>1:" ":"")
dana
Cela ne fonctionnerait que si j'imprimais le résultat à l'envers (voir ceci ), mais cela économiserait en fait 2 octets au lieu de 1.
NotBaal
Malheureusement, ce n'est pas la même chose que la sortie attendue selon la question, mais merci pour la suggestion quand même!
NotBaal
1
Les liens "essayez-le en ligne" semblent être rompus. Je pensais i->{for(;i++<99;)out.printf((i>1?" ":"")+(i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i),i);}?
dana
1
Ohhhh tu as raison ça marche! Merci pour ça!
NotBaal