Teste de multiplicidade

21

Use qualquer linguagem de programação para exibir números entre 1 e 99 (incluindo os dois) de tal maneira que:

  • os números são separados por espaço único,
  • se um número é divisível por 3, deve estar entre parênteses,
  • se um número é divisível por 4, deve estar entre colchetes,
  • se um número é divisível por 3 e 4, deve estar entre parênteses e colchetes (com colchetes mais próximos do número).

Seu programa deve exibir exatamente:

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
fonte
6
Relacionado
ETHproductions
3
Podemos imprimir cada entrada em uma nova linha ou a saída deve estar toda em uma linha?
ETHproductions
4
A saída pode terminar com um espaço. Algumas respostas parecem assumir isso.
Dennis

Respostas:

7

05AB1E , 23 bytes

-1 byte graças a Kevin Cruijssen

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

Experimente online!

Okx
fonte
1
-1 byte mudando }?ð?para ]ðý(perto tanto o se e laço, e juntar-se toda a pilha por espaços)
Kevin Cruijssen
@KevinCruijssen Obrigado, era exatamente isso que eu estava procurando!
Okx
-1 usandoŀ
Grimmy 20/11
6

Python 2 , 68 65 60 bytes

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

Experimente online!

ovs
fonte
1
Eu estava certo :) +1
ElPedro 10/11
5

R , 61 bytes

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

Experimente online!

J.Doe
fonte
2
apelido brilhante!
Giuseppe
Como isso funciona? Isso é incrível! 1 para você meu amigo #
Sumner18
4

Geléia , 21 20 bytes

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

Experimente online!

Como funciona

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

D , 110 bytes

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

Experimente online!

Portado da resposta C ++ do @ HatsuPointerKun.

Zacharý
fonte
3

Carvão , 30 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

    ⁹⁹                          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
fonte
3

J , 54 53 bytes

1 byte a menos, graças a @Jonah

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

Experimente online!

FrownyFrog
fonte
Obrigado por fazer este. Além disso, por que você tem que fazer stdoutaqui ... Eu nunca vi isso antes. @FrownyFrog
Jonah
@ Jonah Eu não posso produzi-lo como uma sequência completa, ele é cortado (...) Stdout não faz isso e também não imprime uma nova linha, então também posso imprimir cada número separadamente. Por alguma razão que ele faz espaços à direita aparecer (existem 4, e apenas 1 é intencionalmente lá)
FrownyFrog
Essa abordagem é realmente inteligente, tanto na rotação quanto na escolha de usar #. Eu tinha introduzido um auxiliar verbo surround com ()e []: g=. {.@[ , ":@] , {:@[. ugh a verbosidade!
Jonah
mais uma pergunta: qualquer motivo que você usou em LFvez de _. o último parece funcionar também.
Jonah
3

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

-5 bytes graças ao Zacharý e inspirado pela função write () na linguagem D (consulte a resposta do Zacharý)

-2 bytes graças a mriklojn

-12 bytes para a versão C, graças a mriklojn

-4 bytes graças ao ceilingcat

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

Otimização específica C: 115 bytes

#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
fonte
O MSVC permite que você faça a inf f()coisa? Desculpe 'bout apagar meus comentários, pensei que tinha algo mais curto (eu não)
Zachary
@ Zacharý Não, acho que a função é muito simples e gera um "f deve retornar um int". Aliás, a solução foi de 3 bytes mais curto (incluem compressão emparelhado que se deslocam com o incremento de i)
HatsuPointerKun
1
Dang, esqueci completamente que printfera uma coisa. Você não poderia usar o C stdio então?
Zachary
2
Outra coisa que você pode usar / explorar é o fato de que, pelo menos com o gcc 5.3.1, você não precisa do #include e também pode remover o tipo de retorno da função. Além disso, se você declarar int ifora da função (no escopo global), seu valor será padronizado como 0 e o tipo de dados será padronizado como int. Isso resultaria em seu loop a partir de 0, e para corrigir isso, você pode mover o incremento na expressão condição em seu loop, fazendo com que pareçai;f(){for(;++i<=99;)
mriklojn
1
Sugira em ")\0"+i%3vez de i%3?"":")". Além disso, acho que você precisa adicionar i=0no início do loop.
ceilingcat
3

PowerShell, 60 bytes

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

Explicação:

  • a matriz com 4 elementos: $_, "($_)", "[$_]", "([$_])"
  • e o índice: [!($_%3)+2*!($_%4)]
  • repita para cada número
  • converter o resultado em uma string

Script de teste com menos golfe:

$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

Saída:

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)
confuso
fonte
3

MathGolf , 41 40 34 29 bytes

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

NOTA: Possui um espaço à direita

Apenas minha segunda resposta MathGolf ..
-5 bytes graças a @JoKing .

Experimente online.

Explicação:

♀(             # 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
fonte
@JoKing Thanks! Não sabia o que qpoderia ser omitido e é feito implicitamente em loops. Além disso, não sabia que havia um built-in de 2/3/4 cordas. Pena que o truque de rotação não funciona com a matriz agrupada.
Kevin Cruijssen
Bem, é mais que eu troquei a saída explícita a cada iteração por saída implícita no final do programa
Jo King
@JoKing Sim, mas eu não sabia que isso produziria a pilha inteira unida, em vez de apenas a parte superior. :)
Kevin Cruijssen
Minha solução foi se aproximar de 40 bytes, embora eu tenha interpretado mal e pensado que colchetes devem ser usados ​​em vez de colchetes. Bom trabalho na solução!
Max
2

Haskell , 77 bytes

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]

Experimente online!

Gostaria de saber se show[n]pode ser usado para encurtar as coisas, até agora sem sucesso .

Laikoni
fonte
2

Lua, 161 123 bytes

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)

Experimente online!

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)
David Wheatley
fonte
2

C (gcc) , 84 bytes

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

Há um byte nulo no início de cada "string de colchete".

Experimente online!

Dennis
fonte
E em "(" + i% 3, como você sabe que o endereço para i = 2 aponta para um valor de zero caractere? O mesmo para "[" + i% 4 para i em {2,3}?)
RosLuP
Ele funciona com o gcc, o que é bom o suficiente, pois o PPCG define as linguagens por suas implementações.
Dennis
Eu acho que você não pode dizer que o código está ok compilados em todas as implementações do compilador gcc, talvez apenas a uma corrida em seu PC (mas possível não muito)
RosLuP
@RosLuP gcc faz o trabalho da mesma forma na maioria dos computadores, porém, pelo menos em nada com a mesma arquitetura
ASCII-only
@ ASCII-só é possível se for compilado otimizado para o espaço ou para a velocidade, o resultado é diferente ... Eu não sei se ele está fora do padrão ...
RosLuP
2

PowerShell , 67 62 bytes

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

Experimente online!

Basicamente, um FizzBuzz usando multiplicação de string vezes variáveis ​​booleanas (convertidas implicitamente em 1 ou 0). Essas seqüências são deixadas no pipeline e reunidas em um bloco de script entre aspas. Como o padrão $OutputFieldSeparatorpara uma matriz é espaços, isso implicitamente nos fornece elementos de matriz delimitados por espaço.

AdmBorkBork
fonte
2

C #, 124 117 123 bytes

-5 bytes graças a 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?"":" "));}

Teste com:

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
fonte
Na incursão de C #, eu vejo. O C # permite números inteiros como argumento à esquerda para um operador ternário ou precisa ser um booleano?
Zachary
Eu não sei muito sobre c #, mas você poderia usar em xvez de i, portanto, não precisa se preocupar com o int ? (Você ainda teria que configurá-lo, é claro).
Zachary
@ Zacharý Não, ele gera um erro CS0029 "Não é possível converter implicitamente int em booleano". E sim, eu poderia usar ie o fato de que eu posso inicializá-lo em 0 quando eu Invoke. Mas isso não significa que eu teria que incluir a declaração de t ( Action<int>) e a chamada ( t.Invoke(0)) no bytecount?
HatsuPointerKun
Estou perguntando se algo assim x=>{for(x=0;x++<99;)Console.Write((x%3==0?"(":"")+(x%4==0?"[":"")+x+(x%4==0?"]":"")+(x%3==0?")":"")+(x%99==0?"":" "));};funcionaria.
Zachary
1
Todos os cinco ==0podem ser <1.
Kevin Cruijssen 11/11
2

Vermelho , 99 97 bytes

repeat n 99[a: b: c: d:""if n% 3 = 0[a:"("c:")"]if n% 4 = 0[b:"["d:"]"]prin rejoin[a b n d c" "]]

Experimente online!

Galen Ivanov
fonte
2

Ruby , 72 66 bytes

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

Agradecemos a @ jonathan-frech e @ conor-obrien por cortes adicionais.

Cruzará
fonte
Olá e bem-vindo ao PPCG! 70 bytes .
Jonathan Frech
Bem-vindo ao PPCG! Aqui estão outros 4 bytes da sugestão de JonathanFrench, para 66 bytes , já que a.join bpara uma matriz ae string bé equivalente aa*b
Conor O'Brien
2

PowerShell, 98 82 74 67 63 62 bytes

Um enorme -31 bytes graças a @Veskah -5 bytes graças a @ ASCII-only

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

Experimente online!

Ainda não tenho muita certeza do que fiz aqui.

Gabriel Mills
fonte
Apenas um golfe rápido para 70 bytes . Você não precisa converter $ a como uma string e "$a"ainda substituirá o valor. (Nota: aspas simples não substituem $foo, apenas aspas duplas). Outro truque é ifs só se preocupam com 0 ou 1 para que você possa usar a lógica booleana para salvar um byte
Veskah
67 bytes se você usar a indexação de lista também.
Veskah
também 67
somente ASCII
63?
somente ASCII
62?
somente ASCII
1

perl -E, 60 bytes

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

Alguns bytes podem ser salvos se pudermos usar novas linhas entre os números: nesse caso, podemos remover o $,=$";, alterar o loop mapem um forloop, enquanto o movemos saypara o loop.


fonte
1
Você é a Abigail? Inventor de /^1$|^(11+?)\1+$/?
Msh210 11/1118
1
Uau. Que honra tê-lo aqui!
Msh210 12/1118
1

Perl 6 , 51 48 bytes

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

Experimente online!

Nwellnhof
fonte
Eu estava indo para abusar a diferença entre listas e representações de matriz, como este , mas eu não tenho certeza de como se livrar dos suportes encerram ao redor toda a lista ...
Jo rei
@JoKing Eu pensei sobre isso também, mas eu só criei esse 51-byter .
Nwellnhof 11/1118
1

Lote, 145 bytes

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

O código entra na sub-rotina, mas a string já foi impressa por este ponto, para que o código seja executado sem causar danos.

Neil
fonte
1

Limpo , 100 bytes

import StdEnv,Text

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

Experimente online!

Furioso
fonte
1

sfk , 225 bytes

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

Experimente online!

Furioso
fonte
1

Bash, 61 bytes

-14 bytes, graças a Dennis

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

explicação

Bem direto:

  • seq produz 1..99
  • canalizamos isso awkcom o separador de registro de saída ( ORS) definido como espaço, de forma que a saída seja uma única linha.
  • o corpo principal do awk apenas adiciona "[]" quando o número é divisível por 4 e, em seguida, adiciona, além disso, "()" quando divisível por 3.

Experimente online!

Jonah
fonte
1

PHP, 65 bytes

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]," ";

(requer PHP 5.5 ou posterior)

Corra com -nrou experimente-os online .

Titus
fonte
1

Python 2 , 78 bytes

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

Experimente online!

Eu imaginei essa abordagem legal de fatiar, '([%0d])'mas não consigo obter as expressões mais curtas.

Lynn
fonte
1

Java 8, 92 91 bytes

-1 byte graças a @Dana

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

Experimente online!

Solução alternativa, 82 bytes (com espaço à direita na saída - não tenho certeza se isso é permitido):

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

Explicação:

for(;i++<99;)- um loop for que passa do valor de i(reutilizado como entrada, considerado 0 neste caso) a 99

out.printf(<part1>+<part2>,i); - formata a string antes de imprimi-la imediatamente no stdout com o valor de i

where <part1>is (i>1?" ":"")- imprime o espaço antes de imprimir o número, a menos que esse número seja 1; nesse caso, omite o espaço

e <part2>é (i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)- se ié divisível por 3 e 4, item colchetes quadrados e redondos ao seu redor; caso contrário, se idivisível por 3, ipossui colchetes; caso contrário, se idivisível por 4, ipossui colchetes; caso contrário, inão tem colchetes.

NotBaal
fonte
Salve um byte movendo o espaço para o início de cada iteração de loop(i>1:" ":"")
dana
Isso só funcionará se eu imprimi o resultado em sentido inverso (ver este ), mas seria realmente salvar 2 bytes em vez de 1.
NotBaal
Infelizmente, isso não é o mesmo que o resultado esperado de acordo com a pergunta, mas obrigado pela sugestão!
NotBaal
1
Os links "experimente online" parecem estar quebrados. Eu estava pensando 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 você está certo que funciona! Obrigado por isso!
NotBaal