Test di molteplicità


21

Utilizzare qualsiasi linguaggio di programmazione per visualizzare numeri compresi tra 1 e 99 (inclusi entrambi) in modo tale che:

  • i numeri sono separati da un singolo spazio,
  • se un numero è divisibile per 3, dovrebbe essere tra parentesi,
  • se un numero è divisibile per 4, dovrebbe essere tra parentesi quadre,
  • se un numero è divisibile per 3 e 4, dovrebbe essere tra parentesi e parentesi quadre (con parentesi quadre più vicine al numero).

Il programma dovrebbe visualizzare esattamente:

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
È possibile emettere ciascuna voce su una nuova riga o l'output deve essere tutto su una riga?
— ETHproductions

4
L'output può terminare con uno spazio. Alcune risposte sembrano ipotizzarlo.
— Dennis,

Risposte:





4

Gelatina , 21 20 byte

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

Provalo online!

Come funziona

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

D , 110 byte

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

Provalo online!

Portato dalla risposta C ++ di @ HatsuPointerKun.


3

Carbone , 30 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

    ⁹⁹                          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 byte

1 byte in meno grazie a @Jonah

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

Provalo online!


Grazie per averlo fatto. Inoltre, perché devi fare stdoutqui ... Non l'ho mai visto prima. @FrownyFrog
— Jonah

@Jonah Non riesco ad emetterlo come una stringa completa, viene tagliato (...) Stdout non lo fa e non stampa nemmeno una nuova riga, quindi posso anche stampare ogni numero separatamente. Per qualche ragione, sebbene appaiano spazi finali (ce ne sono 4 e solo 1 è intenzionalmente lì)
— FrownyFrog

Questo approccio è davvero intelligente, sia la rotazione che la scelta da usare #. Avevo presentato un ausiliario verbo surround ()e []: g=. {.@[ , ":@] , {:@[. grazie alla verbosità!
— Giona

un'altra domanda: qualsiasi motivo tu abbia usato al LFposto di _. anche quest'ultimo sembra funzionare.
— Giona,

3

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

-5 byte grazie a Zacharý e ispirato alla funzione write () in linguaggio D (vedi risposta Zacharý)

-2 byte grazie a mriklojn

-12 byte per la versione C grazie a mriklojn

-4 byte grazie 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 Ottimizzazione specifica: 115 byte

#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 ti consente di fare la inf f()cosa? Mi dispiace per aver cancellato i miei commenti, pensavo di avere qualcosa di più corto (non l'ho fatto)
— Zacharý

@ Zacharý No, penso che la funzione sia troppo semplice e generi un "f deve restituire un int". A proposito, la tua soluzione è stata più corta di 3 byte (include la compressione associata allo spostamento dell'incremento di i)
— HatsuPointerKun

1
Dang, mi ero completamente dimenticato di una printfcosa. Non potresti usare la C stdio allora?
— Zacharý,

2
Un'altra cosa che potresti usare / sfruttare è il fatto che, almeno con gcc 5.3.1, non hai bisogno di #include, e puoi anche rimuovere il tipo restituito dalla funzione. Inoltre, se si dichiara l' int iesterno della funzione (nell'ambito globale), il valore predefinito è 0 e il tipo di dati predefinito int. Ciò comporterebbe il tuo ciclo a partire da 0, e per risolvere questo problema potresti spostare l'incremento nell'espressione condizione nel tuo ciclo for, facendolo apparire comei;f(){for(;++i<=99;)
— mriklojn

1
Suggerisci ")\0"+i%3invece di i%3?"":")". Inoltre, penso che devi aggiungere i=0all'inizio del ciclo.
— plafoniera

3

Powershell, 60 byte

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

Spiegazione:

  • l'array con 4 elementi: $_, "($_)", "[$_]", "([$_])"
  • e l'indice: [!($_%3)+2*!($_%4)]
  • ripetere per ogni numero
  • converti il ​​risultato in una stringa

Script di test meno golfato:

$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

Produzione:

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 byte

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

NOTA: ha uno spazio finale

Solo il mio secondo MathGolf risponde ..
-5 byte grazie a @JoKing .

Provalo online.

Spiegazione:

♀(             # 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 Grazie! Non sapevo che si qpotesse omettere ed è implicitamente fatto in loop. Inoltre, non sapevo che esistesse un built-in a 2/3/4-string. Peccato che il trucco di rotazione non funzioni con l'array spostato.
— Kevin Cruijssen,

Bene, è più che ho scambiato l'output esplicito ogni iterazione con output implicito alla fine del programma
— Jo King

@JoKing Sì, ma non sapevo che avrebbe prodotto l'intero stack unito, anziché solo all'inizio. :)
— Kevin Cruijssen,

La mia soluzione si stava avvicinando a 40 byte, anche se ho letto male e ho pensato che le parentesi graffe dovrebbero essere usate al posto delle parentesi quadre. Ottimo lavoro sulla soluzione!
— massimo


2

Lua, 161 123 byte

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)

Provalo 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)


2

C (gcc) , 84 byte

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

C'è un byte null all'inizio di ogni "stringa di parentesi".

Provalo online!


E in "(" + i% 3 come fai a sapere che l'indirizzo per i = 2 indica un valore di carattere zero? Lo stesso per "[" + i% 4 per i in {2,3}?
— RosLuP

Funziona con gcc, il che è abbastanza buono, poiché PPCG definisce i linguaggi in base alle loro implementazioni.
— Dennis,

Penso che non si possa dire che il codice sia ok compilato in ogni implementazione del compilatore gcc, forse solo quello eseguito sul PC (ma forse non troppo)
— RosLuP

@RosLuP gcc fa funzionano allo stesso modo maggior parte dei computer, però, almeno su qualsiasi cosa con la stessa architettura
— ASCII-only

@ ASCII possibile solo se è compilato ottimizzato per lo spazio o per la velocità il risultato è diverso ... Non so se è fuori standard ...
— RosLuP

2

PowerShell , 67 62 byte

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

Provalo online!

Fondamentalmente un FizzBuzz che usa moltiplicazioni di stringa per variabili booleane (implicitamente cast su 1 o 0). Tali stringhe vengono lasciate sulla pipeline e raccolte all'interno di un blocco di script tra virgolette. Poiché il valore predefinito $OutputFieldSeparatorper una matrice sono gli spazi, ciò ci dà implicitamente elementi della matrice delimitati da spazi.


2

C #, 124 117 123 byte

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

Prova 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();

Vedo nell'incursione di C #. C # consente numeri interi come argomento di sinistra a un operatore ternario o deve essere un valore booleano?
— Zacharý,

Non so molto su C #, ma potresti usare xinvece di i, quindi non dovresti preoccuparti di int ? (Dovresti comunque impostarlo, ovviamente).
— Zacharý,

@ Zacharý No, genera un errore CS0029 "Impossibile convertire implicitamente int in booleano". E sì, potrei usare ie il fatto che posso inizializzarlo a 0 quando io Invoke. Ma ciò non significherebbe che dovrei includere la dichiarazione di t ( Action<int>) e la chiamata ( t.Invoke(0)) nel bytecount?
— HatsuPointerKun

Sto chiedendo se qualcosa del genere x=>{for(x=0;x++<99;)Console.Write((x%3==0?"(":"")+(x%4==0?"[":"")+x+(x%4==0?"]":"")+(x%3==0?")":"")+(x%99==0?"":" "));};funzionerebbe.
— Zacharý,

1
Tutti e cinque ==0possono essere <1.
— Kevin Cruijssen,


2

Rubino , 72 66 byte

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

Grazie a @ jonathan-frech e @ conor-obrien per un ulteriore taglio.


Ciao e benvenuto in PPCG! 70 byte .
— Jonathan Frech,

Benvenuti in PPCG! Ecco altri 4 byte fuori dal suggerimento di @JonathanFrench, per 66 byte , poiché a.join bper un array ae una stringa bequivalgono aa*b
— Conor O'Brien,

2

PowerShell, 98 82 74 67 63 62 byte

Un enorme -31 byte grazie a @Veskah -5 byte grazie solo a @ ASCII

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

Provalo online!

Non sono ancora del tutto sicuro di quello che ho fatto qui.


Solo un po 'di golf veloce per 70 byte . Non devi lanciare $ a come stringa e "$a"sostituirai comunque il valore. (Nota: le virgolette singole non sostituiscono $foo, solo le virgolette doppie). Un altro trucco è se si preoccupa solo di 0 o 1, quindi è possibile utilizzare la logica booleana per salvare un byte
— Veskah,

67 byte se si utilizza anche l'indicizzazione dell'elenco.
— Veskah,




1

perl -E, 60 byte

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

Alcuni byte possono essere salvati se possiamo usare le nuove righe tra i numeri: in tal caso, possiamo rimuovere il $,=$";, cambiare il mapin un forciclo, mentre spostiamo il saynel ciclo.


1
Sei l' Abigail? Inventore di /^1$|^(11+?)\1+$/?
— msh210

1
Wow. Che onore averti qui!
— msh210,


1

Lotto, 145 byte

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

Il codice rientra nella subroutine ma la stringa è già stata stampata da questo punto, quindi il codice viene eseguito in modo innocuo.




1

sfk , 225 byte

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

Provalo online!


1

Bash, 61 byte

-14 byte, grazie a Dennis

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

spiegazione

Abbastanza diretto:

  • seq produce 1..99
  • lo colleghiamo awkcon il separatore del record di output ( ORS) impostato su spazio in modo che l'output sia una singola riga.
  • il corpo principale di Awk aggiunge "[]" quando il numero è divisibile per 4, quindi aggiunge "()" quando è divisibile per 3.

Provalo online!



1

PHP, 65 byte

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

(richiede PHP 5.5 o successivo)

Corri con -nro provali online .


1

Python 2 , 78 byte

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

Provalo online!

Ho immaginato questo approccio interessante, '([%0d])'ma non riesco ad ottenere espressioni più brevi.


1

Java 8, 92 91 byte

-1 byte grazie a @Dana

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

Provalo online!

Soluzione alternativa, 82 byte (con spazio finale nell'output - non sono sicuro che sia consentito):

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

Spiegazione:

for(;i++<99;)- un ciclo for che va dal valore di i(riutilizzato come input, considerato 0 in questo caso) a 99

out.printf(<part1>+<part2>,i); - formatta la stringa prima di stamparla immediatamente su stdout con il valore di i

dove <part1>è (i>1?" ":"")- stampa lo spazio prima di stampare il numero a meno che che quel numero sia 1, nel qual caso omette lo spazio

ed <part2>è (i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)- se iè divisibile per 3 e 4, iha parentesi quadre e rotonde attorno; altrimenti se iè divisibile per 3, iha parentesi tonde; altrimenti se iè divisibile per 4, iha parentesi quadre; altrimenti, inon ha parentesi.


Salvare un byte spostando lo spazio all'inizio di ogni iterazione del ciclo(i>1:" ":"")
— dana,

Funzionerebbe solo se avessi stampato il risultato al contrario (vedi questo ) ma in realtà risparmierei 2 byte invece di 1.
— NotBaal

Sfortunatamente non è lo stesso dell'output atteso secondo la domanda, ma grazie comunque per il suggerimento!
— NotBaal,

1
I link "provalo online" sembrano non funzionare. Stavo 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 hai ragione che funziona! Grazie per quello!
— NotBaal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.