Numero intero più piccolo dopo N divisibile per 2, 3 e 4


22

Dare credito a chi è dovuto .

Obiettivo Dato un numero intero N > 0, i più piccoli interi A, Be Cin modo che:

  1. Tutti A, Be Csono strettamente maggiore di N;
  2. 2divide A;
  3. 3divide B;
  4. e 4divide C.

Questo è un codice-golf, quindi vince la risposta più breve in byte. È possibile utilizzare una lingua creata / aggiornata dopo questa sfida, ma è rigorosamente non competitiva.

Casi test

N => A, B, C
1 => 2, 3, 4
4 => 6, 6, 8
43 => 44, 45, 44
123 => 124, 126, 124
420 => 422, 423, 424
31415 => 31416, 31416, 31416
1081177 => 1081178, 1081179, 1081180

Possiamo (coerentemente) produrre i risultati in un ordine diverso (ad es. C B A) Se è chiaramente specificato nella risposta?
Martin Ender,

@ MartinBüttner che è accettabile
Conor O'Brien,

Risposte:


17

Gelatina , 8 byte

~%2r4¤+‘

Provalo online! o verifica tutti i casi di test .

Come funziona

~%2r4¤+‘  Main link. Argument: n (integer)

~         Bitwise NOT; yield ~n = -(n + 1).
     ¤    Combine the three links to the left into a niladic chain:
  2         Yield 2.
   r4       Yield the range from 2 to 4, i.e., [2, 3, 4].
 %        Yield the remainder of the division of ~n by 2, 3 and 4.
          In Python/Jelly, -(n + 1) % k = k - (n + 1) % k if n, k > 0.
       ‘  Yield n + 1.
      +   Add each modulus to n + 1.

26

Python 2, 32 byte

lambda n:[n+2&-2,n/3*3+3,n+4&-4]

Bit aritmetica per 2 e 4, aritmetica modulare per 3.

Ho trovato quattro espressioni a 7 byte per il prossimo multiplo di ksopra, nma nessuna più breve:

n-n%k+k
~n%k-~n
n/k*k+k
~n/k*-k

Qualsiasi fornisce 34 byte quando vengono copiate k=2,3,4e 33 byte se combinati:

[n/2*2+2,n/3*3+3,n/4*4+4]
[n/k*k+k for k in 2,3,4]

Ma 2 e 4 sono potenze di 2 che consentono ai trucchi dei bit di azzerare gli ultimi 1 o 2 byte.

n+2&-2
n+4&-4

Questo dà 6 byte (anziché 7) per ottenere il multiplo successivo, per 32 byte complessivi, battendo il for k in 2,3,4.

Sfortunatamente, l'aspetto promettente n|1+1e n|3+1l'aggiunta sono stati eseguiti per primi, quindi l'incremento dell'output richiede parentesi.


1
Delle possibili varianti per cui preferisco n+k-n%k.
Neil,

Anche n&3+1l'aggiunta prima?
Tim,

@Tim Yup, lo stesso con tutte le operazioni booleane.
xnor


12

MATL, 15 10 9 byte

2:4+t5M\-

Provalo online!

Spiegazione:

2:4          #The array [2, 3, 4]
   +         #Add the input to each element, giving us [12, 13, 14]
    t        #Duplicate this array
     5M      #[2, 3, 4] again
       \     #Modulus on each element, giving us [0, 1, 2]
        -    #Subtract each element, giving us [12, 12, 12]

3
Bella risposta! È possibile salvare un byte utilizzando 5M(Appunti automatici degli ingressi funzione) invece del secondo 2:4.
David,

@David Grazie per la punta!
DJMcMayhem

12

MATL, 8 byte

Qt_2:4\+

Utilizza l'algoritmo Jelly di Denis, sono sorpreso che abbia la stessa lunghezza!

Provalo online o verifica tutti i casi di test .

Q    % takes implicit input and increments by one
t_   % duplicate, and negate top of stack (so it's -(n+1))
2:4  % push vector [2 3 4]
\    % mod(-(n+1),[2 3 4])
+    % add result to input+1
     % implicit display

Bene dannazione. Ero davvero orgoglioso della mia soluzione da 10 byte, ma non posso battere questo. Inoltre, curiosità divertenti: questo è esattamente il mio 300 ° voto. = D
DJMcMayhem

Ahh, ma questo stava solo prendendo l'algoritmo di Agawa / Dennis, non è una mia idea.
David,

1
a volte continuo a fissare quei caratteri elementari mandarinoidi unicode mentre mi gratto la testa, poi dico "per amor di tutto ciò che è leggibile è un codice eseguibile biforcazione"? Lol bella cosa, ho il mio voto + Mi unirò al treno Matl presto.
Abr001,

@ Agawa001 Dovresti! Dato che conosci Matlab abbastanza bene, dovresti trovarlo abbastanza semplice, la grande differenza è che MATL è basato sullo stack. C'è anche una chat room MATL se hai bisogno di aiuto!
David,

@David che la natura a base di pancake di matl rende ancora più spaventoso il fatto che il matlab grezzo stesso sia un linguaggio adatto al golf per quanto riguarda la sua interattività di alto livello, quindi immagina ....
Abr001am

6

Matlab, 33 byte

Un altro approccio leggermente diverso

@(a)feval(@(x)a+1+mod(-a-1,x),2:4)

6

05AB1E , 8 byte

Codice:

>D(3L>%+

Provalo online! .


Ah, non ho notato che c'era già una risposta 05AB1E che è piuttosto simile a quella che avevo. L'ho eliminato e lo suggerirò invece come un golf -1 qui: ±D2xŸ%α( 2xŸè solo un'alternativa per il tuo 3L>; e altre due alternative di uguale byte potrebbero essere Ƶ…So 4L¦).
Kevin Cruijssen,

5

Rubino, 27 byte

Mappe 2, 3 e 4 al successivo multiplo sopra n.

->n{(2..4).map{|e|n+e-n%e}}


4

Pyke, 11 9 8 byte

3FODQRc+

Provalo qui!

3FODQRc+
         - Q = input()
3F       - for i in range(3): # for i in [0,1,2]
  O      -  i += 2
    Q c  -   Q-(Q%i)
       + -  i+^

4

Mathematica, 21 byte

Ceiling[#+1,{2,3,4}]&

Questa è una funzione senza nome che accetta un singolo intero come input e restituisce un elenco di multipli.

La Ceilingfunzione accetta un secondo parametro opzionale che gli dice di arrotondare al multiplo successivo del numero dato. Per fortuna, passa anche automaticamente al secondo argomento in modo tale da potergli dare un elenco di valori e a sua volta otterremo multipli arrotondati per tutti questi.


4

Ottava, 20 byte

@(n)n-mod(n,d=2:4)+d

Esempi:

octave:60> f(123)
ans =

   124   126   124

octave:61> f(1081177)
ans =

   1081178   1081179   1081180

octave:62> f(420)
ans =

   422   423   424

Vale la pena notare che possiamo farlo fino a 9 senza aggiungere byte extra:

@(n)n-mod(n,d=2:9)+d

Output (2520 è il numero intero positivo più piccolo uniformemente divisibile per tutti i numeri a una cifra):

octave:83> f(2520)
ans =

   2522   2523   2524   2525   2526   2527   2528   2529


4

Labirinto , 19 byte

:?
:
#/)
\ #
!"*@
"

Provalo online!

Questo genera i risultati nell'ordine C, B, A separato da avanzamenti di riga.

Spiegazione

Come al solito, un breve primer Labyrinth:

  • Labyrinth ha due pile di numeri interi di precisione arbitraria, main e aux (iliary), che inizialmente sono riempiti con una quantità (implicita) infinita di zeri. Useremo solo main per questa risposta.
  • Il codice sorgente assomiglia a un labirinto, in cui il puntatore dell'istruzione (IP) segue i corridoi quando può (anche dietro gli angoli). Il codice inizia dal primo carattere valido nell'ordine di lettura, ovvero nell'angolo in alto a sinistra in questo caso. Quando l'IP arriva a qualsiasi forma di giunzione (cioè diverse celle adiacenti oltre a quella da cui proviene), sceglierà una direzione basata sulla parte superiore dello stack principale. Le regole di base sono: girare a sinistra quando è negativo, andare avanti quando è zero, girare a destra quando è positivo. E quando uno di questi non è possibile perché c'è un muro, l'IP prenderà la direzione opposta. L'IP si gira anche quando colpisce i vicoli ciechi.

Nonostante i due no-op ( ") che rendono il layout un po 'dispendioso, sono abbastanza contento di questa soluzione, perché il suo flusso di controllo è in realtà abbastanza sottile.

L'IP inizia nell'angolo in alto a sinistra sulla :destra. Colpirà immediatamente un vicolo cieco sul ?e si girerà, in modo che il programma inizi effettivamente con questo pezzo lineare di codice:

:   Duplicate top of main stack. This will duplicate one of the implicit zeros
    at the bottom. While this may seem like a no-op it actually increases
    the stack depth to 1, because the duplicated zero is *explicit*.
?   Read n and push it onto main.
:   Duplicate.
:   Duplicate.

Ciò significa che ora abbiamo tre copie dello nstack principale, ma la sua profondità è 4. Questo è conveniente perché significa che possiamo profondità dello stack per recuperare il moltiplicatore corrente mentre lavoriamo attraverso le copie dell'input.

L'IP ora entra in un ciclo 3x3 (in senso orario). Si noti che #, che spinge la profondità dello stack, spingerà sempre un valore positivo in modo tale che sappiamo che a questo punto l'IP girerà sempre verso est.

Il corpo del loop è questo:

#   Push the stack depth, i.e. the current multiplier k.
/   Compute n / k (rounding down).
)   Increment.
#   Push the stack depth again (this is still k).
*   Multiply. So we've now computed (n/k+1)*k, which is the number
    we're looking for. Note that this number is always positive so
    we're guaranteed that the IP turns west to continue the loop.
"   No-op.
!   Print result. If we've still got copies of n left, the top of the 
    stack is positive, so the IP turns north and does another round.
    Otherwise, see below...
\   Print a linefeed.
    Then we enter the next loop iteration.

Dopo che il ciclo è stato attraversato (fino a !) tre volte, tutte le copie di nvengono esaurite e viene rivelato lo zero sottostante. Dovuto al" del fondo (che altrimenti sembra piuttosto inutile) questa posizione è un incrocio. Ciò significa che con uno zero in cima allo stack, l'IP cerca di andare dritto (ovest), ma poiché c'è un muro in realtà fa una virata di 180 gradi e si sposta indietro verso est come se avesse raggiunto un vicolo cieco.

Di conseguenza, il seguente bit viene ora eseguito:

"   No-op.
*   Multiply two zeros on top of the stack, i.e. also a no-op.
    The top of the stack is now still zero, so the IP keeps moving east.
@   Terminate the program.

3

Matlab, 50 byte

@(a)arrayfun(@(k)find(~rem(a+1:a+k,k))+a,[2 3 4])

Per lo meno, puoi usare 2:4invece di [2 3 4].
Suever,


3

JavaScript (ES6), 26 byte

È interessante il porting della risposta Ruby di @ KevinLau o della risposta Python di @ xnor nella stessa lunghezza:

n=>[2,3,4].map(d=>n+d-n%d)
n=>[n+2&-2,n+3-n%3,n+4&-4]

Ho una leggera preferenza per la porta della risposta di Ruby in quanto funziona fino a 2 53 -3 mentre la porta della risposta di Python funziona solo fino a 2 31 -5.


)-> ]come penso
Qwertiy,

@Qwertiy Whoops, scusa per l'errore di battitura.
Neil,

3

C, 50 46 byte

i;f(int*a,int n){for(i=1;++i<5;*a++=n+i-n%i);}

Grazie a Neil e nwellnhof per aver salvato 4 byte!

Deludentemente lungo. Ho la sensazione che ci sia un po 'di hacking che non conosco, ma non riesco ancora a trovarlo. Restituisce un puntatore a un array che contiene i tre elementi. Programma completo:

i;f(int*a,int n){for(i=1;++i<5;*a++=n+i-n%i);}

int main()
{
    int array[3];
    int n=10;
    f(array, n);
    printf("A:%d\tB:%d\tC:%d\n",array[0],array[1],array[2]);
    return 0;
}

Ho esaminato il bit-twiddling di @xnor ma devi srotolare il loop per quello che finisce per costarti un byte in generale.
Neil,

Non n + i - n % i++provoca un comportamento indefinito?
nwellnhof,

Anche s/a[i-2]/*a++/per salvare due byte.
nwellnhof,

@nwellnhof Bah, ci ho pensato quando ho svolto il suo ciclo ma non mi è venuto in mente che potesse usarlo comunque.
Neil,

2
@Neil Ma il comportamento indefinito può essere aggirato senza allargare il codice. Ecco una versione ancora più breve che utilizza le dichiarazioni della funzione K&R:f(a,n,i)int*a;{for(i=1;++i<5;)*a++=n+i-n%i;}
nwellnhof,

3

Reng, 40 byte

i1+#i2341ø>(1+)31j
i(2[¤,  q!^$]æl0eq!~

1: init

i1+#i2341ø

i1+#iimposta l'ingresso su 1 + input; questo perché dobbiamo lavorare su numeri strettamente maggiori dell'input. 234inizializza il nastro con i nostri valori di iterazione e passa all'inizio della riga successiva.

2a: loop

i(2[¤,  q!^$]æl0eq!~

i(inserisce l'input nello STOS e 2[crea un nuovo stack con i primi 2 elementi. ¤duplica la pila e ,fa modulo. Se è presente un resto, q!^esce dal ciclo per passare a (b). Altrimenti, possiamo stampare. $rimuove le cose in più, ]chiude la risma e la æstampa bene.l0wq!~termina se lo stack contiene zero membri.

2b: quell'altro loop

          >(1+)31j
        q!^

(1+)aggiunge 1 allo STOS e 31jsalta alla parte del loop che non prende roba dallo stack. E profitto.


Questo spazio extra mi sta davvero infastidendo. Fai una GIF.

REENNNNNGGG


3

Retina, 62 43 26 byte

17 byte grazie a @Martin Büttner .

^
1111:
! M & `(11 +): (\ * 1)
:

(Nota la nuova riga finale.)

Provalo online!

Input in unary in 1, output in unary in 1separato da newline.

Precedente versione a 43 byte:

.+
11:$&;111:$&;1111:$&
\b(1+):(\1*)1*
$1$2

Provalo online!

Input in unario, output in unario separato da punto e virgola ( ;).

Versione precedente a 62 byte:

.+
$&11;$&111;$&1111
((11)+)1*;((111)+)1*;((1111)+)1*
$1;$3;$5

Provalo online!

Input in unario, output in unario separato da punto e virgola ( ;).


26 se è consentito un output nell'ordine opposto: retina.tryitonline.net/… ... Altrimenti 33, anche se penso che ci debba essere un modo più breve per evitare l'ordinamento inverso: retina.tryitonline.net/…
Martin Ender

È abbastanza per qualificarsi come risposta separata?
Leaky Nun,

Non lo so, è sempre la stessa idea, ho appena sostituito la generazione manuale dell'elenco con l'utilizzo di corrispondenze sovrapposte.
Martin Ender,

Conor ha confermato che la soluzione a 26 byte è valida.
Martin Ender,

3

Ottava, 27 22 20 byte

MATLAB e Ottava:

f=2:4;@(x)f.*ceil((x+1)./f)

Meglio (le soluzioni sono equivalenti, ma una può superare l'altra se ulteriormente giocata a golf), MATLAB e Octave:

@(x)x-rem(x,2:4)+(2:4)
f=2:4;@(x)x+f-rem(x,f)

Solo in Octave:

@(x)x-rem(x,h=2:4)+h

Prova qui .


La mia risposta finale è sostanzialmente che uno qui :( codegolf.stackexchange.com/a/80028/52795
Bers

3

Minkolang 0,15 , 17 byte

n$z3[zi2+$d%-+N].

Provalo qui!

Spiegazione

n$z                  Take number from input and store in register
   3[                Open for loop that repeats 3 times
     z               Push value in register on stack
      i2+            Loop counter plus 2
         $d          Duplicate stack
           %-+       Mod, subtract, add
              N      Output as number
               ].    Close for loop and stop.

+ è divisione ??
Downgoat,

@Downgoat: Whoops. > _>
El'endia Starman,


2

Mathematica 28 byte

f@n_:=n-n~Mod~#+#&/@{2,3,4}

f[1]
f[4]
f[43]
f[123]
f[420]
f[31415]
f[1081177]

{2, 3, 4}

{6, 6, 8}

{44, 45, 44}

{124, 126, 124}

{422, 423, 424}

{31416, 31416, 31416}

{1081178, 1081179, 1081180}


Il caso generale produce una risposta generale:

f[r]

{2 + r - Mod [r, 2], 3 + r - Mod [r, 3], 4 + r - Mod [r, 4]}


2

R, 30 26 byte

(Ridotto di 4 byte grazie a @Neil)

N=scan();cat(N+2:4-N%%2:4)

Questo (analogamente al resto delle risposte, suppongo) aggiunge 2: 4 all'input e riduce il resto dopo aver eseguito il modulo sugli stessi numeri.


1
Dato che non conosco la lingua, c'è un motivo che non usi N+2:4-N%%2:4?
Neil,

@Neil Causa Non ci ho pensato immagino. Grazie comunque.
David Arenburg,


2

Java 70 57

a->System.out.print(a/2*2+2+" "+(a/3*3+3)+" "+(a/4*4+4))

Non so di Java, ma forse è possibile rimuovere lo spazio bianco attorno =aint a = new Integer(z[0]);
Conor O'Brien


1

In realtà, 22 byte

╗52x"╝1`;╛@%Y@╜<*`╓"£M

Provalo online!

Curiosità: 3 bug nell'interprete di Actually sono stati trovati e corretti durante la scrittura di questo programma.

Fatto non così divertente: quei 3 bug hanno impedito a questa soluzione di essere molto più breve.

Spiegazione:

╗52x"╝1`;╛@%Y@╜<*`╓"£M
╗                       push input to reg0
 52x                    push range(2,5) ([2,3,4])
    "╝1`;╛@%Y@╜<*`╓"£M  map (for n in [2,3,4]):
     ╝                    push n to reg1
      1`;╛@%Y@╜<*`╓       find the smallest integer k where:
        ;╛@%Y               k is divisible by n and...
             @╜<*           is greater than the input

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.