Prueba de multiplicidad

21

Utilice cualquier lenguaje de programación para mostrar números entre 1 y 99 (incluidos ambos) de tal manera que:

  • los números están separados por un solo espacio,
  • si un número es divisible por 3, debe estar entre paréntesis,
  • si un número es divisible por 4, debe estar entre corchetes,
  • Si un número es divisible entre 3 y 4, debe estar entre paréntesis y corchetes (con corchetes más cerca del número).

Su programa debe mostrar exactamente:

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
fuente
66
Relacionado
ETHproductions
3
¿Podemos generar cada entrada en una nueva línea, o la salida debe estar toda en una línea?
ETHproductions
44
¿Puede la salida terminar con un espacio? Algunas respuestas parecen suponer que sí.
Dennis

Respuestas:

7

05AB1E , 23 bytes

-1 byte gracias a Kevin Cruijssen

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

Pruébalo en línea!

Okx
fuente
1
-1 byte cambiando }?ð?a ]ðý(cierra el bucle if y el bucle, y une la pila completa por espacios)
Kevin Cruijssen
@KevinCruijssen Gracias, ¡eso era exactamente lo que estaba buscando!
Okx
5

R , 61 bytes

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

Pruébalo en línea!

J.Doe
fuente
2
brillante alias!
Giuseppe
¿Cómo funciona esto? ¡Eso es increíble! +1 para ti mi amigo
Sumner18
4

Jalea , 21 20 bytes

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

Pruébalo en línea!

Cómo 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
fuente
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?" ":"");}

Pruébalo en línea!

Portado de la respuesta C ++ de @ HatsuPointerKun.

Zacharý
fuente
3

Carbón , 30 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

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

J , 54 53 bytes

1 byte menos gracias a @Jonah

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

Pruébalo en línea!

FrownyFrog
fuente
Gracias por hacer esto. Además, ¿por qué tienes que hacer stdoutaquí ... Nunca había visto eso antes. @FrownyFrog
Jonás
@Jonah No puedo mostrarlo como una cadena completa, se corta (...) Stdout no hace eso, y tampoco imprime una nueva línea, por lo que también puedo imprimir cada número por separado. Por alguna razón, hace que aparezcan espacios finales (hay 4, y solo 1 está intencionalmente allí)
FrownyFrog
Este enfoque es realmente inteligente, tanto la rotación como la elección de uso #. Yo había introducido un verbo auxiliar de sonido envolvente con ()y []: g=. {.@[ , ":@] , {:@[. ugh la verbosidad!
Jonás
Una pregunta más: cualquier razón que haya utilizado en LFlugar de _. este último parece funcionar también.
Jonás
3

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

-5 bytes gracias a Zacharý e inspirado por la función write () en lenguaje D (ver respuesta de Zacharý)

-2 bytes gracias a mriklojn

-12 bytes para la versión C gracias a mriklojn

-4 bytes gracias a 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?" ":"");}

C Optimización específica: 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
fuente
¿MSVC te permite hacer la inf f()cosa? Perdón por eliminar mis comentarios, pensé que tenía algo más corto (no lo hice)
Zacharý
@ Zacharý No, creo que la función es demasiado simple y genera un "f debe devolver un int". Por cierto, su solución fue 3 bytes más corta (incluye compresión emparejada con mover el incremento de i)
HatsuPointerKun
1
Dang, olvidé por completo que printfera una cosa. ¿No podrías usar el C stdio entonces?
Zacharý
2
Otra cosa que podría usar / explotar es el hecho de que, al menos con gcc 5.3.1, no necesita el #include, y también puede eliminar el tipo de retorno de la función. Además, si declara el int iexterior de la función (en alcance global), su valor predeterminado es 0 y el tipo de datos predeterminado int. Esto daría como resultado que su ciclo comience en 0, y para solucionarlo, podría mover el incremento a la expresión de condición en su ciclo for, haciendo que parezcai;f(){for(;++i<=99;)
mriklojn
1
Sugerir en ")\0"+i%3lugar de i%3?"":")". Además, creo que debe agregar i=0al comienzo del ciclo.
ceilingcat
3

Powershell, 60 bytes

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

Explicación:

  • la matriz con 4 elementos: $_, "($_)", "[$_]", "([$_])"
  • y el índice: [!($_%3)+2*!($_%4)]
  • repetir para cada número
  • convertir el resultado a una cadena

Guión de prueba menos golfizado:

$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

Salida:

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
fuente
3

MathGolf , 41 40 34 29 bytes

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

NOTA: tiene un espacio final

Solo mi segunda respuesta de MathGolf ...
-5 bytes gracias a @JoKing .

Pruébalo en línea.

Explicación:

♀(             # 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
fuente
@JoKing ¡Gracias! No sabía que se qpodía omitir y se hace implícitamente en bucles. Además, no sabía que había una cuerda incorporada de 2/3/4 cuerdas. Lástima que el truco de rotación no funcione con la matriz envuelta.
Kevin Cruijssen
Bueno, es más que he cambiado la salida explícita de cada iteración por salida implícita al final del programa
Jo King
@JoKing Sí, pero no sabía que generaría toda la pila unida, en lugar de solo la parte superior. :)
Kevin Cruijssen
Mi solución se acercaba a los 40 bytes, aunque leí mal y pensé que deberían usarse llaves en lugar de corchetes. Buen trabajo en la solución!
maxb
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]

Pruébalo en línea!

Me pregunto si show[n]se puede usar para acortar las cosas, hasta ahora en vano .

Laikoni
fuente
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)

Pruébalo en línea!

Sin 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
fuente
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);}

Hay un byte nulo al comienzo de cada "cadena de paréntesis".

Pruébalo en línea!

Dennis
fuente
Y en "(" + i% 3, ¿cómo sabe que la dirección para i = 2 apunta a un valor de carácter cero? Lo mismo para "[" + i% 4 para i en {2,3}?
RosLuP
Funciona con gcc, que es lo suficientemente bueno, ya que PPCG define los idiomas por sus implementaciones.
Dennis
Creo que no puede decir que el código está bien compilado en cada implementación del compilador gcc, tal vez solo el que se ejecuta en su PC (pero es posible que no también)
RosLuP
Sin embargo, @RosLuP gcc funciona de la misma manera en la mayoría de las computadoras, al menos en cualquier cosa con la misma arquitectura
solo ASCII el
@ Solo ASCII posible si está compilado optimizado para espacio o para velocidad, el resultado es diferente ... No sé si está fuera del estándar ...
RosLuP
2

PowerShell , 67 62 bytes

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

Pruébalo en línea!

Básicamente, un FizzBuzz que usa multiplicación de cadenas por variables booleanas (implícitamente convertido a 1 o 0). Esas cadenas se dejan en la tubería y se reúnen dentro de un bloque de script entre comillas. Como el valor predeterminado $OutputFieldSeparatorpara una matriz es espacios, esto nos da implícitamente elementos de matriz delimitados por espacios.

AdmBorkBork
fuente
2

C #, 124 117 123 bytes

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

Prueba con:

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
fuente
En la incursión de C #, ya veo. ¿C # permite enteros como argumento izquierdo para un operador ternario, o tiene que ser un booleano?
Zacharý
No sé mucho sobre C #, pero ¿podría usarlo en xlugar de i, para no tener que preocuparse por el int ? (Aún tendría que configurarlo, por supuesto).
Zacharý
@ Zacharý No, genera un error CS0029 "No se puede convertir implícitamente int a booleano". Y sí, podría usari y el hecho de que puedo inicializarlo en 0 cuando lo haga Invoke. ¿Pero eso no significa que tendría que incluir la declaración de t ( Action<int>) y la llamada ( t.Invoke(0)) en el bytecount?
HatsuPointerKun
Estoy preguntando si algo así x=>{for(x=0;x++<99;)Console.Write((x%3==0?"(":"")+(x%4==0?"[":"")+x+(x%4==0?"]":"")+(x%3==0?")":"")+(x%99==0?"":" "));};funcionaría.
Zacharý
1
Los cinco ==0pueden ser <1.
Kevin Cruijssen
2

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

Pruébalo en línea!

Galen Ivanov
fuente
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}*' '

Gracias a @ jonathan-frech y @ conor-obrien por el recorte adicional.

Cruza
fuente
Hola y bienvenidos a PPCG! 70 bytes .
Jonathan Frech
Bienvenido a PPCG! Aquí hay otros 4 bytes de la sugerencia de @JonathanFrench, para 66 bytes , ya que a.join bpara una matriz ay una cadena bes equivalente aa*b
Conor O'Brien
2

PowerShell, 98 82 74 67 63 62 bytes

La friolera de -31 bytes gracias a @Veskah -5 bytes gracias a @ ASCII-only

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

Pruébalo en línea!

Todavía no estoy muy seguro de lo que he hecho aquí.

Gabriel Mills
fuente
Solo un poco de golf rápido para 70 bytes . No tiene que emitir $ a como una cadena y "$a"aún sustituirá el valor. (Nota: las comillas simples no reemplazan $foo, solo las comillas dobles). Otro truco es si solo le importa 0 o 1, por lo que puede usar la lógica booleana para guardar un byte
Veskah
67 bytes si también usa la indexación de listas.
Veskah
también 67
solo ASCII
63?
Solo ASCII
62?
Solo ASCII
1

perl -E, 60 bytes

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

Algunos bytes se pueden guardar si podemos usar nuevas líneas entre los números: en ese caso, podemos eliminar el $,=$";, cambiarlo mapa un forbucle, mientras lo movemos sayal bucle.


fuente
1
¿Eres el Abigail? Inventor de /^1$|^(11+?)\1+$/?
msh210
1
Guau. ¡Qué honor tenerte aquí!
msh210
1

Perl 6 , 51 48 bytes

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

Pruébalo en línea!

nwellnhof
fuente
Iba a abusar de la diferencia entre listas y representaciones de matrices, como esta , pero no estoy seguro de cómo deshacerme de los corchetes alrededor de toda la lista ...
Jo King
@JoKing También pensé en eso, pero solo se me ocurrió este 51-byter .
nwellnhof
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%

El código cae en la subrutina, pero la cadena ya se ha impreso en este punto, por lo que el código se ejecuta de manera inofensiva.

Neil
fuente
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

Pruébalo en línea!

Οurous
fuente
1

Bash, 61 bytes

-14 bytes, gracias a Dennis

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

explicación

Muy claro:

  • seq produce 1..99
  • lo conectamos awkcon el separador de registro de salida (ORS ) establecido en espacio para que la salida sea una sola línea.
  • el cuerpo principal de awk simplemente agrega "[]" cuando el número es divisible por 4, y luego agrega, además de eso, "()" cuando es divisible por 3.

Pruébalo en línea!

Jonás
fuente
1

JavaScript (Node.js) , 57 bytes

f=(n=99)=>n&&f(n-1)+(s=n%4?n:`[${n}]`,n%3?s:`(${s})`)+' '

Pruébalo en línea!

Cambió a la comunidad porque la optimización depende demasiado de ella

revs l4m2
fuente
Podría acortar significativamente haciendo${n%4?n:`[${n}]`}
ETHproductions
66 bytes (con la sugerencia de ETH)
Alion
59 bytes
Arnauld
57 bytes
Neil
1

PHP, 65 bytes

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

o

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

(requiere PHP 5.5 o posterior)

Corre con ellos-nr o pruébalos en línea .

Tito
fuente
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

Pruébalo en línea!

Imaginé este enfoque genial, '([%0d])'pero no puedo acortar las expresiones.

Lynn
fuente
1

Java 8, 92 91 bytes

-1 byte gracias a @Dana

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

Pruébalo en línea!

Solución alternativa, 82 bytes (con espacio final en la salida, no estoy seguro si eso está permitido):

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

Explicación:

for(;i++<99;) - un bucle for que va desde el valor de i (reutilizado como entrada, que se considera 0 en este caso) a 99

out.printf(<part1>+<part2>,i); - formatea la cadena antes de imprimirla inmediatamente en stdout con el valor de i

donde <part1>está (i>1?" ":""): imprime el espacio antes de imprimir el número a menos que que ese número sea 1, en cuyo caso omite el espacio

y <part2>es (i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)- si ies divisible entre 3 y 4, itiene corchetes cuadrados y redondos a su alrededor; si no ies divisible por 3, itiene corchetes redondos; si no ies divisible por 4, itiene corchetes; de lo contrario, ino tiene corchetes.

NotBaal
fuente
Ahorre un byte moviendo el espacio al comienzo de cada iteración del bucle(i>1:" ":"")
dana
Eso solo funcionaría si imprimiera el resultado al revés (vea esto ) pero en realidad ahorraría 2 bytes en lugar de 1.
NotBaal
Desafortunadamente, eso no es lo mismo que el resultado esperado según la pregunta, ¡pero gracias por la sugerencia de todos modos!
NotBaal
1
Los enlaces "Pruébelo en línea" parecen estar rotos. Estaba 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 tienes razón, eso funciona! ¡Gracias por eso!
NotBaal