Crea un array con numeri ripetuti


19

Sfida

Il tuo compito in questa domanda è di scrivere un programma o una funzione con nome che accetta un numero intero positivo n(maggiore di 0) come input tramite STDIN, ARGV o argomenti di funzione e genera un array tramite STDOUT o valore restituito dalla funzione.

Sembra abbastanza semplice? Ora ecco le regole

  • L'array conterrà solo numeri interi da 1an
  • Ogni numero intero da 1a ndeve essere ripetuto xvolte in cui xè il valore di ciascun numero intero.

Per esempio:

Ingresso:

5

Produzione:

[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]

L'array può essere ordinato o meno.

Questo è quindi il vincitore è il codice più breve in byte.

indennità

Moltiplica il tuo punteggio 0.5se non ci sono due numeri interi adiacenti nell'array di output uguali.

Ad esempio n = 5, una di queste configurazioni sarebbe

[5, 4, 5, 4, 3, 4, 5, 2, 5, 3, 1, 2, 3, 4, 5]

Risposte:


6

APL, 4 caratteri

/⍨⍳⎕

Come funziona:

legge l'input dell'utente. Per quanto riguarda l'output, APL per impostazione predefinita stampa il risultato da ogni riga.

⍳nè il numero intero compreso tra 1 e n. Esempio:⍳3←→ 1 2 3

/significa replicare . Ogni elemento dall'argomento destro viene ripetuto tutte le volte specificato dal suo elemento corrispondente dall'argomento sinistro. Esempio:2 0 3/'ABC'←→ 'AACCC'

è l' operatore pendolare . Quando si verifica a destra di una funzione, modifica il suo comportamento, quindi scambia gli argomenti ( A f⍨ B ←→ B f A, quindi "permuta") o fornisce lo stesso argomento su entrambi i lati ( f⍨ A ←→ A f A, un "selfie"). Quest'ultima forma viene utilizzata in questa soluzione.


Bonus:

6-∊⌽⍳¨⍳⎕(8 caratteri, grazie @ phil-h )

⍳5(Iota Five) è 1 2 3 4 5.

⍳¨ ⍳5(iota ogni iota cinque) è (,1)(1 2)(1 2 3)(1 2 3 4)(1 2 3 4 5)un vettore di vettori. Ogni ( ¨) è un operatore, prende una funzione a sinistra e la applica a ciascun elemento dell'array a destra.

inverte l'array, quindi otteniamo (1 2 3 4 5)(1 2 3 4)(1 2 3)(1 2)(,1).

è arruolato (aka appiattito ). Attraversa ricorsivamente l'argomento e restituisce gli scalari semplici come vettore.


Che ne dici di un'espressione di 4 caratteri ? /⍨⍳n
ngn,

Come desidera, signore, ho aggiornato il testo. Ma sicuramente la tua obiezione deve applicarsi ad altre soluzioni che non sono racchiuse in funzioni?
ngn,

3
Dyalog APL è disponibile in due versioni: "Classic" e "Unicode". La versione classica esiste da decenni, da prima che apparisse lo standard Unicode, e utilizza una codifica byte per carattere personalizzata per il set di caratteri APL. È ancora supportato, sebbene il suo utilizzo sia scoraggiato. Quindi, vorrei usarlo come una scusa. Più in generale, penso che nel golf dovremmo contare i personaggi, non i byte. Il fatto che i punti di codice più bassi in Unicode siano occupati dall'ASCII incentrato sull'inglese è un incidente storico che non dovrebbe importare oggi. È interessante notare che APL è stato concepito prima che uscisse ASCII.
ngn,

3
@ngn conteggio dei caratteri non è una buona idea , poiché le risposte diventeranno generalmente decodificazioni di zuppe alfabetiche. I caratteri APL sono conteggiati come byte perché esiste quella codifica; questo è ben consolidato su questo sito. Funziona con qualsiasi codifica di byte esistente prima della domanda.
FryAmTheEggman,

1
@ngn: puoi spiegare la tua risposta bonus? Perché può essere fatto tramite: 5 4 3 2 1 5 4 3 2 5 4 3 5 4 5 o 6 meno ciascuno di 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1, che sembra non essere lontano dalla tua risposta iniziale.
Phil H,

11

Rubino (ricorsivo), 41 byte * 0,5 = 20,5

def n(n,i=1);i>n ?[]:n(n,i+1)+[*i..n];end

O usando un lambda (come raccomandato da histocrat e Ventero): 34 byte * 0,5 = 17

r=->n,i=n{i>0?[*i..n]+r[n,i-1]:[]}

(chiama usando r[argument])


2
Questa è una soluzione davvero interessante. È possibile salvare alcuni byte rendendolo un lambda anziché un metodo ( n=->x,i=1{...n[x,i+1]...) e alcuni altri con [*i..n].
istocratico,

1
Invertendo la logica, puoi rilasciare lo spazio bianco nel ternario:r=->n,i=n{i>0?[*i..n]+r[n,i-1]:[]}
Ventero

11

Pyth , 9 byte * 0,5 = 4,5

smrhQhdUQ

Con l'aiuto di @FryAmTheEggman

Provalo online.


Spiegazione

s             reduce + on list
 m            map
  rhQhd       lambda d: reversed(range(d+1, Q+1)), over
       UQ     range(Q)

dov'è Ql'input.


5
Non avrei dovuto aiutarti: D
FryAmTheEggman,

8

Haskell, 31 caratteri = 15,5 punti

f n=[y|x<-[n,n-1..1],y<-[x..n]]

27 personaggi senza il bonus

f n=[x|x<-[1..n],_<-[1..x]]

Battuto da Proud Haskeller


la tua prima soluzione non è corretta. Una possibile soluzione èg n = [y|x<-[n,n-1..1],y<-[x..n]]
Karakfa,

@karakfa oops: - / e grazie per la correzione
John Dvorak il

La mia risposta di Haskell è solo un po 'più bassa della tua
orgoglioso haskeller il

Devo collegarmi ad esso dalla mia soluzione, per promuoverlo?
John Dvorak,

@JanDvorak In realtà vorrei ...
orgoglioso haskeller il

7

C, 22 = 44 byte * 0,5

La funzione haccetta due parametri. La prima è una intspecifica n . Il secondo è un int*buffer di output.

h(n,o)int*o;{for(n&&h(~-n,o+=n);*--o=n--;);}

Programma di test

main(){
int wow[999],*i;
memset(wow,0,sizeof(wow));
h(6, wow);
for(i=wow;*i;i++)printf("%d ", *i);
}

Non capisco Spiega per favore?
bacchusbeale,

@bacchusbeale Ok .. Scrive in modo ricorsivo sequenze discendenti da n a 0. Le sequenze più brevi vengono scritte prima, a un livello più profondo di ricorsione. Se l'argomento n è 0, allora n è falso, quindi non vi è alcuna ricorsione e viene scritto solo uno 0, che serve a segnare la fine dell'array.
feersum

7

Pyth - 15 10 * .5 = 5

smr-QdhQUQ

Provalo online.

Prevede input su stdin. Algoritmo scoperto in modo indipendente. Grazie @ Sp3000 per avermi aiutato a inserire l'ultima Q lì dentro: P Inoltre, ironia? XD

Spiegazione:

Q=eval(input())       : implicit
s                     : The sum of...
 m      UQ            : map(...,range(Q))
  r-QdhQ              : range(Q-d,Q+1)

2
Bella soluzione. Esiste mai una situazione in cui Pyth non vincerebbe il codice golf? :)
Alex A.

2
@Alex A seconda della natura del problema, le lingue di golf basate su stack (Golfscript, CJam) possono cremarlo, può anche perdere roba da biblioteca ( tosse bash tosse );)
FryAmTheEggman

6

CJam, 12 15 byte * 0,5 = 7,5

li_,f{),f-W%~}`

Questo è il programma completo da STDIN a STDOUT. Concatena i suffissi crescenti 1 ... ndell'intervallo, garantendo che non vi siano due numeri adiacenti identici.

Provalo qui.


6

Python 2, 53 byte * 0,5 = 26,5

i=n=input()
x=[]
while i:x+=range(i,n+1);i-=1
print x

Preso spudoratamente in prestito l'idea di VisualMelon


6

Haskell, 34 byte * 0,5 = 17

0%n=[]
i%n=[i..n]++(i-1)%n
g n=n%n

È la prima volta che uso Haskell per giocare a golf. Chiama con g <number>.



5

GolfScript (14 byte * 0,5 = punteggio 7)

 ~:x,{~x),>~}%`

Demo online

Penso che questo sia probabilmente simile ad alcune risposte esistenti in quanto crea l'array concat( [n], [n-1, n], [n-2, n-1, n], ..., [1, 2, ..., n] )

Purtroppo non sono stato in grado di giocare a golf ulteriormente discutibilmente più elegante:

~:x]{{,{x\-}/}%}2*`

che inserisce l'input xin un array e quindi si applica due volte {,{x\-}/}%, che mappa ogni elemento di un array su un conto alla rovescia di tanti elementi da x.


5

C # - 81 (161bytes * 0,5)

Semplice lavoro in C #, si spera che ottenga il bonus senza numeri. Legge un int da stdin, scrive un array come nell'esempio su stdout.

class P{static void Main(){int n=int.Parse(System.Console.ReadLine()),m=n-1,i;var R="["+n;for(;m-->0;)for(i=m;i++<n;)R+=", "+i;System.Console.WriteLine(R+"]");}}

Più leggibile:

class P
{
    static void Main()
    {
        int n=int.Parse(System.Console.ReadLine()),m=n-1,i;
        var R="["+n;
        for(;m-->0;)
            for(i=m;i++<n;)
                R+=", "+i;
        System.Console.WriteLine(R+"]");
    }
}

Esempi di output:

n = 5
[5, 4, 5, 3, 4, 5, 2, 3, 4, 5, 1, 2, 3, 4, 5]

Sto davvero cercando di trovare una soluzione C # più breve ma non riesco proprio a farlo ... ben fatto
Brandon,

1
@MarkKnol System.Consoleè statico, non puoi assegnarlo a una variabile, ma in C # 6 o in qualsiasi altra cosa sarai in grado di fare using System.Console;( using System;non paga in questo caso), non sei sicuro di come mi sento su questa funzionalità, influenzano molte vecchie domande sul golf proprio per questo motivo;)
VisualMelon,

1
@IchabodClay peggiora, using C=System.Consolesalva 3 byte ed è probabilmente ciò che @MarkKnol significava (scusate!), Vergognosa negligenza da parte mia.
VisualMelon

1
Inoltre, secondo le regole, potresti semplicemente avere il metodo stesso invece di creare un programma completo. Qualcosa del genere ... questo . (114 byte con spazi bianchi e simili rimossi. 57 byte con bonus.)
Ichabod Clay

1
@IchabodClay davvero; Preferisco inviare programmi completi alle funzioni, nessuna buona ragione, IO sembra solo una parte del divertimento (non tendo nemmeno ad usare argv). Sentiti libero di pubblicare una risposta con punteggio migliore senza questi vincoli stupidi!
VisualMelon,

4

JavaScript, ES6, 41 byte

f=i=>[...Array(i).fill(i),...i?f(--i):[]]

Questo crea una funzione fche può essere chiamata come f(6)e restituisce l'array richiesto.

Questo utilizza un approccio ricorsivo, in cui ogni iterazione crea una matrice di ielementi tutti valutati ie concatena una matrice restituita f(i-1)con condizione di arresto di i==0.

Funziona con l'ultimo Firefox.


4

Haskell, 14 = 28 byte / 2

f n=n:[1..n-1]>>= \r->[r..n]

esempio di output:

>f 5
[5,1,2,3,4,5,2,3,4,5,3,4,5,4,5]

24 byte senza il bonus:

f n=[1..n]>>= \r->[r..n]

potrebbe =<<aiutare a evitare gli spazi bianchi? Sento che potrebbe, ma sarei sorpreso se non lo avessi già considerato.
John Dvorak,

@JanDvorak Se avessi usato =<<avrei bisogno di parentesi per la lambda
orgoglioso haskeller il

Sono confuso quando esattamente i lambda hanno bisogno di parentesi. L'intestazione lambda ha la stessa fissità di >>=?
John Dvorak,

@JanDvorak Non hanno fissità; Non sono sicuro di come precisa questa regola è, ma lambda può apparire solo in cui gli operatori non possono (trascurando sezioni): dopo (, [, =, ,, dopo tutti gli operatori, e simili
fiera haskeller

Immagino che né lambda né operatori possano apparire come schemi? let \x->y = (2+) in (x,y)sembra un po 'impossibile.
John Dvorak,


3

vba, 76 * 0,5 = 38

Sub i(q)
For Z=1 To q:For x=q To Z Step -1:Debug.?x;",";:Next:Next
End Sub

puoi perdere 1 (0,5, tecnicamente) byte (s) condensando For Z=1 ToinFor Z=1To
Taylor Scott

puoi anche condensare Next:NextaNext x,Z
Taylor Scott,

2

R, 44 * .5 = 22

f=function(n){r=0;for(i in 1:n)r=c(r,n:i);r}

Un test veloce

> f(1)
[1] 1
> f(2)
[1] 2 1 2
> f(3)
[1] 3 2 1 3 2 3
> f(4)
 [1] 4 3 2 1 4 3 2 4 3 4

Che cosa ? Nessun TSQL?
Ottimizzatore

@Optimizer forse più tardi :)
MickyT

2

JavaScript, ES6, 66 byte * 0,5 = 33

f=i=>(g=n=>[...Array(n).fill().map((v,x)=>i-x),...n?g(n-1):[]])(i)

Sulla approccio ricorsivo di Optimizer , possiamo costruire piste discendenti di lunghezza decrescente, come [4,3,2,1, 4,3,2, 4,3, 4].

Invece di Array(i).fill(i)creare undefinedsubarrays dello stesso valore con , eseguiamo subarrays riempiti della lunghezza appropriata con Array(n).fill()e poi cambiamo i valori in una corsa discendente usando .map((v,x)=>i-x). Inoltre, definiamo e ricorriamo a una funzione interiore g; la funzione esterna fesiste solo per memorizzare il valore di iwhile grecruit.


2

T-SQL, 176 * 0,5 = 88

Dal momento che sembravi mancare il T-SQL @Optimizer, qui è in tutto il suo splendore verboso :).

Un paio di opzioni di funzione, una funzione scalare e una tabella in linea valutata. La funzione scalare utilizza i cicli while per ricorrere e restituisce una stringa di numeri, in cui la funzione Inline Table Valued utilizza un CTE ricorsivo per una sequenza e restituisce una tabella. Naturalmente questi non saranno mai competitivi, quindi non ho trascorso molto tempo a giocare a golf.

Inline Table Valued Function, 176 * .5

CREATE FUNCTION F(@ INT)RETURNS TABLE RETURN WITH R AS(SELECT @ N UNION ALL SELECT N-1FROM R WHERE N>0)SELECT B.N FROM R CROSS APPLY(SELECT TOP(R.N)N FROM R A ORDER BY N DESC)B

Chiamato come segue

SELECT * FROM dbo.F(5)

Esempio SQLFiddle

Funzione scalare, 220 * .5

CREATE FUNCTION G(@ INT)RETURNS VARCHAR(MAX)AS BEGIN DECLARE @S VARCHAR(MAX),@N INT=1,@I INT,@C INT WHILE @N<=@ BEGIN SELECT @I=@N,@C=@ WHILE @C>=@I BEGIN SELECT @S=CONCAT(@S+',',@C),@C-=1 END SET @N+=1 END RETURN @S END

Chiamato come segue

SELECT dbo.G(5)

Esempio SQLFiddle


2

Mathematica, 34 * 0,5 = 17

f=Join@@Table[x,{y,#},{x,#,y,-1}]&

2

perl, 26 byte

for(1..$n){print"$_ "x$_;}

1
Si prega di pubblicare il tuo punteggio. Inoltre, poiché si tratta di code golf, è possibile salvare byte rimuovendo gli spazi extra e la definizione di $n.
Alex A.

Questo non funziona per me in Perl 6.
Alex A.

@Alex, qual è l'errore, funziona sotto 5.10
michael501

Unable to parse postcircumfix:sym<{ }>, couldn't find final '}' at line 3. Ho provato su ideone.com.
Alex A.

@Alex, prova questo: C: \ Windows \ system32> perl -e "$ n = 5; per (1 .. $ n) {print qq ($ _) x $ _;};" 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
michael501

2

JavaScript (leggibile), 131 byte

Sono nuovo di Code Golf, quindi questo non è il migliore

function f(n) {
    var arr = [];
    for(var i = 1; i <= n; i++) {
        for(var j = 0; j < i; j++) {
            arr.push(i);
        }
    }
    return arr;
}

JavaScript (meno leggibile), 87 byte

Minimizzato usando jscompress.com

function f(e){var t=[];for(var n=1;n<=e;n++){for(var r=0;r<n;r++){t.push(n)}}return t}

2

TECO, 25 byte * 0,5 = 12,5

a\+1%a%b<qauc-1%b<-1%c=>>

Quanto sopra batte a malapena la versione non bonus a 13 byte:

a\%a<%b<qb=>>

2

C #, 114 99 * 0,5 = 49,5 byte

(Con un piccolo aiuto dalla risposta di VisualMelon) Modifica: e il commento di James Webster

int[]A(int n){int m=n,i,c=0;var a=new int[n*(n+1)/2];while(m-->0)for(i=m;i++<n;)a[c++]=i;return a;}

Ungolfed:

int[] FooBar(int n)
{
    int altCounter = n, i, arrayCounter = 0;
    var returnArray = new int[n * (n + 1) / 2];
    while(m-->0)
        for(i = altCounter; i++ < n; )
            returnArray[arrayCounter++]=i;
    return returnArray;
}

Esiste una versione non sicura che ho preso spudoratamente dalla risposta C di feersum, ma non sono sicuro al 100% che rientri nelle regole poiché devi allocare la memoria prima di chiamare il metodo.

C # (non sicuro), 82 * 0,5 = 41 byte

unsafe void A(int n,int*p){int*z=p;int m=n,i;while(m-->0)for(i=m;i++<n;)z++[0]=i;}

Chiamato come segue:

int n = 5, length = (int)((n / 2f) * (n + 1));
int* stuff = stackalloc int[length];
int[] stuffArray = new int[length];
A(n, stuff);
System.Runtime.InteropServices.Marshal.Copy(new IntPtr(stuffArray), stuffArray, 0, stuffArray.Length);
//stuffArray == { 5, 4, 5, 3, 4, 5, 2, 3, 4, 5, 1, 2, 3, 4, 5 }

Come suggerito da VisualMelon (grazie!), Il codice non sicuro può essere rifatto con un codice sicuro che ne riduce ulteriormente le dimensioni! Pone ancora la domanda se la creazione dell'array dei risultati finali può essere eseguita al di fuori del metodo.

C #, 72 * 0,5 = 36 byte

void A(int n,int[]p){int z=0,m=n,i;while(m-->0)for(i=m;i++<n;)p[z++]=i;}

Bel lavoro! Per la versione per allocata, è molto più economico andare al sicuro e passarlo int[]subito void A(int n,int[]p){int z=0,m=n,i;while(m-->0)for(i=m;i++<n;)p[z++]=i;}- Sono d'accordo che probabilmente è un po 'incerto, per quanto riguarda le regole;)
VisualMelon

Non è necessario creare un puntatore locale per la versione non sicura, che elimina ben 8 byte. Inoltre, potrei mancare il punto, ma dovrebbe essere l'ultima riga del codice chiamante non sicuro System.Runtime.InteropServices.Marshal.Copy(new IntPtr(stuff), stuffArray, 0, length);?
VisualMelon,

@VisualMelon Questo è quello che ottengo per non ricontrollare i nomi delle variabili dopo averli rinominati. Grazie per il testa a testa: D. Modificata la risposta per tenere conto della versione più breve nel tuo commento.
Ichabod Clay,

Puoi tagliare un po 'la versione sicura integrando la lunghezza var a=new int[(int)((n/2f)*(n+1))];che penso lo porti a 109
James Webster,

Ancora una volta riscrivendo il calc come:(n*(n+1)/2)
James Webster il


1

C #, 116 115 + 33 = 148 byte

Non è il codice più breve, ma ... funziona comunque: P

int[]l(int m){List<int>i=new List<int>();for(int j=1;j<=m;j++){for(int x=0;x<j;x++){i.Add(j);}}return i.ToArray();}

Richiede questo nella parte superiore del file (33 byte):

using System.Collections.Generic;

Versione senza golf:

int[] RepatedNumberList(int m)
{
    List<int> intList = new List<int>();
    for (int j = 1; j <= m; j++)
    {
        for (int x = 0; x < j; x++)
        {
            intList.Add(j);
        }
    }
    return initList.ToArray();
}

1

J, 23 * 0,5 = 11,5

   f=.-;@(<@|.@i."0@>:@i.)
   f 5
5 4 5 3 4 5 2 3 4 5 1 2 3 4 5

J, 11

   f=.#~@i.@>:
   f 5
1 2 2 3 3 3 4 4 4 4 5 5 5 5 5

1
23 * 0.5è 11.5, non è 10.5.
Programma FOX il

@ProgramFOX buona cattura. Hai intenzione di modificare o dovrei? Non è un ottimo motivo per sottovalutare l'IMO.
John Dvorak,

@JanDvorak L'ho appena modificato. E non ho votato a fondo, l'ho votato ancora prima di vedere l'errore.
Programma FOX il

Ora che l'errore è stato corretto, la soluzione bonus dovrebbe essere spostata verso il basso?
John Dvorak,

-1Byte: f=.-[:;<@|.@i."0@>:@i.rendere uguali i punteggi!
Bolce Bussiere,

1

JavaScript (ES6) 29 (58 * 0,5)

Modifica rimuovi; thx @Optimizer

Q=o=>(m=>{for(n=o,r=[];n>m||++m<(n=o);)r.push(n--)})(0)||r

Test nella console FireFox / FireBug

Q(9)

Produzione

[9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 8, 7, 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 9, 8, 7, 6, 5, 4, 9, 8, 7, 6, 5, 9, 8, 7, 6, 9, 8, 7, 9, 8, 9]

Ungolfed

Q=o=>{
  for(m=0,r=[];m<o;++m)
    for(n=o;n>m;)
      r.push(n--);
  return r
}

1

ECMAScript6, 67 * 0,5 = 33,5 byte

f=n=>{a=[],b=0;while(c=n+b,n--){while(c-b)a.push(c--);b++}return a}

Abbastanza felice con questo ... Ha circa un quarto delle dimensioni del mio originale.

f(4) ritorna:

[ 4, 3, 2, 1, 4, 3, 2, 4, 3, 4 ]

Vecchia risposta:

f=i=>{a=b=Array;while(i)a=a.concat(b.apply(null,b(i)).map(e=>i)),i--;return a}

Questo è il mio primo colpo al code golf ... Voglio ancora ottenere quel bonus di 0,5x. Tutti i suggerimenti sono i benvenuti!

Chiamato con f (n).


Devi essere abbastanza nuovo per JavaScript da solo :). (1) Rimuovi le parentesi attorno all'argomento d, (2) a=b=c=[]in per la parte della dichiarazione, (3) c[a].map(e=>a)(4)b.push(...c)
Ottimizzatore

Ho realizzato una versione più breve prima di leggere il tuo commento, che inserirò nel mio post. La mia esperienza con JS è principalmente limitata alla manipolazione DOM / style per semplici app Web ... e fino ad oggi non ho quasi mai utilizzato nessuna delle nuove funzionalità ES6.
binormale,

1

C #, 108 byte * 0,5 = 54

List<int> f(int n){var r=new List<int>();int m=n-1,i;r.Add(n);for(;m-->0;)for(i=m;i++<n;)r.Add(i);return r;}

Grazie a VisualMelon per fare il duro lavoro! Ho pensato di provare a comprimerlo il più possibile.

(114 byte * 0,5 = 57, se si insiste sull'uso di .ToArray () per restituire int [])

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.