Créer un tableau avec des nombres répétés


19

Défi

Votre tâche dans cette question consiste à écrire un programme ou une fonction nommée qui prend un entier positif n(supérieur à 0) en entrée via STDIN, ARGV ou des arguments de fonction et génère un tableau via STDOUT ou une valeur renvoyée par la fonction.

Cela semble assez simple? Voici maintenant les règles

  • Le tableau ne contiendra que des entiers de 1àn
  • Chaque entier de 1à ndoit être répété xfois où xest la valeur de chaque entier.

Par exemple:

Contribution:

5

Production:

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

Le tableau peut être trié ou non.

Il s'agit de donc le gagnant est le code le plus court en octets.

Prime

Multipliez votre score par 0.5s'il n'y a pas deux entiers adjacents dans votre tableau de sortie identiques.

Par exemple pour n = 5, une telle configuration serait

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

Réponses:


6

APL, 4 caractères

/⍨⍳⎕

Comment ça fonctionne:

lit l'entrée utilisateur. Quant à la sortie, APL imprime par défaut le résultat de chaque ligne.

⍳nest les entiers de 1 à n. Exemple:⍳3←→ 1 2 3

/signifie répliquer . Chaque élément de l'argument de droite est répété autant de fois que spécifié par son élément correspondant de l'argument de gauche. Exemple:2 0 3/'ABC'←→ 'AACCC'

est l' opérateur de navette . Quand il se produit à droite d'une fonction, il modifie son comportement, il échange donc les arguments ( A f⍨ B ←→ B f A, donc "commute") ou fournit le même argument des deux côtés ( f⍨ A ←→ A f A, un "selfie"). Cette dernière forme est utilisée dans cette solution.


Prime:

6-∊⌽⍳¨⍳⎕(8 caractères, merci @ phil-h )

⍳5(iota cinq) est 1 2 3 4 5.

⍳¨ ⍳5(iota chaque iota cinq) est (,1)(1 2)(1 2 3)(1 2 3 4)(1 2 3 4 5), un vecteur de vecteurs. Each ( ¨) est un opérateur, il prend une fonction à gauche et l'applique à chaque élément du tableau à droite.

inverse le tableau, donc nous obtenons (1 2 3 4 5)(1 2 3 4)(1 2 3)(1 2)(,1).

est enrôler (alias aplatir ). Traverse récursivement l'argument et en retourne les scalaires simples comme vecteur.


Que diriez-vous d'une expression à 4 caractères ? /⍨⍳n
ngn

Comme vous le souhaitez, monsieur, j'ai mis à jour le texte. Mais votre objection doit sûrement s'appliquer à d'autres solutions qui ne sont pas enveloppées dans des fonctions?
ngn

3
Dyalog APL est disponible en deux versions: "Classic" et "Unicode". La version Classic existe depuis des décennies, bien avant l'apparition de la norme Unicode, et utilise un codage personnalisé octet par caractère pour le jeu de caractères APL. Il est toujours pris en charge, bien que son utilisation soit déconseillée. Donc, je voudrais utiliser cela comme excuse. Plus largement, je pense qu'en jouant au golf, nous devrions compter les caractères et non les octets. Le fait que les points de code les plus bas en Unicode soient occupés par l'ASCII centré sur l'anglais est un accident historique qui ne devrait plus avoir d'importance aujourd'hui. Fait intéressant, APL a été conçu avant la sortie de l'ASCII.
ngn

3
@ngn compter les caractères n'est pas une bonne idée , car les réponses deviendront généralement des décodages de soupe alphabétique. Les caractères APL sont comptés comme des octets car ce codage existe; c'est bien établi sur ce site. Cela fonctionne avec n'importe quel codage d'octets qui existait avant la question.
FryAmTheEggman

1
@ngn: Pouvez-vous expliquer votre réponse bonus? Parce que cela peut être fait via: 5 4 3 2 1 5 4 3 2 5 4 3 5 4 5 ou 6 moins chacun de 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1, ce qui donne l'impression qu'il n'est pas loin de votre réponse initiale.
Phil H

11

Ruby (récursif), 41 octets * 0,5 = 20,5

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

Ou en utilisant un lambda (comme recommandé par histocrat et Ventero): 34 octets * 0,5 = 17

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

(appel en utilisant r[argument])


2
C'est une solution vraiment cool. Vous pouvez enregistrer quelques octets en en faisant un lambda au lieu d'une méthode ( n=->x,i=1{...n[x,i+1]...) et quelques autres avec [*i..n].
histocrate

1
En inversant la logique, vous pouvez supprimer les espaces dans le ternaire:r=->n,i=n{i>0?[*i..n]+r[n,i-1]:[]}
Ventero

11

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

smrhQhdUQ

Avec l'aide de @FryAmTheEggman

Essayez-le en ligne.


Explication

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

Qest l'entrée.


5
N'aurait pas dû vous aider: D
FryAmTheEggman

8

Haskell, 31 caractères = 15,5 points

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

27 personnages sans bonus

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

Battu par Proud Haskeller


votre première solution n'est pas correcte. Une solution possible estg n = [y|x<-[n,n-1..1],y<-[x..n]]
karakfa

@karakfa oops: - / et merci pour le correctif
John Dvorak

Ma réponse Haskell est juste un peu inférieure à la vôtre
fier haskeller

Dois-je le lier à partir de ma solution, pour la promouvoir?
John Dvorak

@JanDvorak J'aimerais, en fait ...
fier haskeller

7

C, 22 = 44 octets * 0,5

La fonction hprend deux paramètres. Le premier est un nint spécifiant . Le second est un qui est le tampon de sortie.int*

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

Programme de test

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

Je ne comprends pas. S'il vous plaît, expliquez?
bacchusbeale

@bacchusbeale Ok. Il écrit récursivement des séquences descendantes de n à 0. Des séquences plus courtes sont écrites plus tôt, à un niveau de récursivité plus profond. Si l'argument n est 0, alors n est falsey donc il n'y a pas de récursivité, et seul un 0 est écrit, qui sert à marquer la fin du tableau.
feersum

7

Pyth - 15 10 * .5 = 5

smr-QdhQUQ

Essayez-le en ligne.

Attend une entrée sur stdin. Algorithme découvert indépendamment. Merci @ Sp3000 de m'avoir aidé à coller le dernier Q: P Aussi, ironie? XD

Explication:

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

2
Belle solution. Y a-t-il jamais une situation dans laquelle Pyth ne gagnerait pas le golf à code? :)
Alex A.

2
@Alex Selon la nature du problème, les langages de golf basés sur la pile (Golfscript, CJam) peuvent le crémer, il peut également perdre à la bibliothèque ( toux bash toux );)
FryAmTheEggman

6

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

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

Il s'agit d'un programme complet de STDIN à STDOUT. Il concatène des suffixes croissants du1 ... n plage, ce qui garantit qu'il n'y a pas deux nombres adjacents identiques.

Testez-le ici.


6

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

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

Emprunté sans vergogne à l'idée de VisualMelon


6

Haskell, 34 octets * 0,5 = 17

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

C'est la première fois que j'utilise Haskell pour jouer au golf. Appelez avec g <number>.



5

GolfScript (14 octets * 0,5 = score 7)

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

Démo en ligne

Je pense que cela est probablement similaire à certaines réponses existantes en ce qu'il construit le tableau concat( [n], [n-1, n], [n-2, n-1, n], ..., [1, 2, ..., n] )

Malheureusement, je n'ai pas pu jouer au golf sans doute plus élégant:

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

qui place l'entrée xdans un tableau puis l'applique deux fois {,{x\-}/}%, qui mappe chaque élément d'un tableau avec un décompte de ce nombre d'éléments x.


5

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

Travail simple en C #, avec un peu de chance, le bonus sans chiffres Lit un int dans stdin, écrit un tableau comme l'exemple dans 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+"]");}}

Plus lisible:

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+"]");
    }
}

Exemples de sortie:

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

J'essaie vraiment de trouver une solution C # plus courte mais je n'arrive pas à l'obtenir ... bien fait
Brandon

1
@MarkKnol System.Consoleest statique, vous ne pouvez pas l'affecter à une variable, mais en C # 6 ou quoi que ce soit à côté, vous pourrez le faire using System.Console;( using System;ne paie pas dans ce cas), je ne sais pas ce que je pense de cette fonctionnalité, affectent beaucoup de vieilles questions de golf pour cette raison précisément;)
VisualMelon

1
@IchabodClay, cela empire, using C=System.Consoleéconomise 3 octets, et c'est probablement ce que @MarkKnol voulait dire (désolé!), Une négligence honteuse de ma part.
VisualMelon

1
En outre, selon les règles, vous pouvez simplement avoir la méthode elle-même au lieu de créer un programme complet. Quelque chose comme ... ça . (114 octets avec espaces blancs et autres supprimés. 57 octets avec bonus.)
Ichabod Clay

1
@IchabodClay en effet; Je préfère soumettre des programmes complets à des fonctions, aucune bonne raison, IO semble juste faire partie du plaisir (je n'ai pas non plus tendance à utiliser argv). N'hésitez pas à poster une meilleure réponse de score sans ces contraintes stupides!
VisualMelon

4

JavaScript, ES6, 41 octets

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

Cela crée une fonction fqui peut être appelée comme f(6)et renvoie le tableau requis.

Cela utilise une approche récursive, où chaque itération crée un tableau d' iéléments tous valorisés iet concatène un tableau renvoyé par f(i-1)avec la condition d'arrêt de i==0.

Fonctionne sur le dernier Firefox.


4

Haskell, 14 = 28 octets / 2

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

exemple de sortie:

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

24 octets sans bonus:

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

pourrait =<<aider à éviter les espaces blancs? J'ai l'impression que c'est possible, mais je serais surpris si vous n'aviez pas déjà envisagé cela.
John Dvorak

@JanDvorak Si j'aurais utilisé, =<<j'aurais besoin de parenthèses pour le lambda
fier haskeller

Je ne sais pas exactement quand les lambdas ont besoin de parenthèses. L'en-tête lambda a-t-il la même fixité que >>=?
John Dvorak

@JanDvorak Ils n'ont aucune fixité; Je ne sais pas comment cette règle est précise, mais lambdas ne peut apparaître où les opérateurs ne peuvent pas (sans tenir compte des sections): après (, [, =, ,, après les opérateurs, etc.
fier haskeller

Je suppose que ni lambdas ni opérateurs ne peuvent apparaître comme des modèles? let \x->y = (2+) in (x,y)semble un peu impossible.
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

vous pouvez perdre 1 (0,5, techniquement) octet (s) en vous condensant For Z=1 TosurFor Z=1To
Taylor Scott

vous pouvez également condenser Next:NextàNext 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 rapide

> 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

Quelle ? Pas de TSQL?
Optimizer

@Optimizer peut-être plus tard :)
MickyT

2

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

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

En s'appuyant sur l'approche récursive d'Optimizer , nous pouvons créer des séries descendantes de longueur décroissante, comme [4,3,2,1, 4,3,2, 4,3, 4].

Au lieu de créer des sous- tableaux de même valeur avec Array(i).fill(i), nous undefinedcréons des sous-tableaux remplis de la longueur appropriée avec Array(n).fill(), puis modifions les valeurs en une exécution décroissante à l'aide de .map((v,x)=>i-x). En outre, nous définissons et récurrons sur une fonction intérieure g; la fonction externe fn'existe que pour stocker la valeur de iwhile grécursive.


2

T-SQL, 176 * 0,5 = 88

Puisque vous avez semblé manquer le T-SQL @Optimizer, le voici dans toute sa splendeur verbeuse :).

Deux options de fonction, une fonction scalaire et une valeur de table en ligne. La fonction Scalar utilise des boucles while pour récurrer et renvoie une chaîne de nombres, où la fonction Valeurs de table en ligne utilise un CTE récursif pour une séquence et renvoie une table. Bien sûr, ceux-ci ne seront jamais compétitifs, donc je n'ai pas passé beaucoup de temps à jouer au golf.

Fonction de valeur de table en ligne, 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

Appelé comme suit

SELECT * FROM dbo.F(5)

Exemple SQLFiddle

Fonction scalaire, 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

Appelé comme suit

SELECT dbo.G(5)

Exemple SQLFiddle



2

perl, 26 octets

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

1
Veuillez poster votre score. De plus, comme il s'agit du code golf, vous pouvez économiser des octets en supprimant les espaces supplémentaires et la définition de $n.
Alex A.

Cela ne fonctionne pas pour moi sous Perl 6.
Alex A.

@Alex, quelle est l'erreur, fonctionne sous 5.10
michael501

Unable to parse postcircumfix:sym<{ }>, couldn't find final '}' at line 3. Je l'ai essayé sur ideone.com.
Alex A.

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

2

JavaScript (lisible), 131 octets

Je suis nouveau sur Code Golf donc ce n'est pas le meilleur

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 (moins lisible), 87 octets

Minifié à l'aide de 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 octets * 0,5 = 12,5

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

Ce qui précède bat à peine la version sans bonus à 13 octets:

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

2

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

(Avec un peu d'aide de la réponse de VisualMelon) Edit: et le commentaire de 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;}

Non golfé:

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;
}

Il y a une version dangereuse que j'ai prise sans vergogne de la réponse C de feersum, mais je ne suis pas sûr à 100% qu'elle correspond aux règles puisque vous devez allouer la mémoire avant d'appeler la méthode.

C # (dangereux), 82 * 0,5 = 41 octets

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;}

Appelé comme suit:

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 }

Selon la suggestion de VisualMelon (merci!), Le code dangereux peut être recréé avec un code sûr qui réduit encore plus la taille! Se pose toujours la question de savoir si la création du tableau de résultats final peut être effectuée en dehors de la méthode.

C #, 72 * 0,5 = 36 octets

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

Bon travail! Pour la version par allocation, il est beaucoup moins cher d'aller en toute sécurité et de le passer int[]directement void A(int n,int[]p){int z=0,m=n,i;while(m-->0)for(i=m;i++<n;)p[z++]=i;}- je conviens que c'est probablement un peu douteux, en ce qui concerne les règles;)
VisualMelon

Vous ne devriez pas avoir besoin de créer un pointeur local pour la version non sécurisée, ce qui coupe un bon 8 octets. En outre, je manque peut-être le point, mais la dernière ligne du code d'appel non sécurisé devrait System.Runtime.InteropServices.Marshal.Copy(new IntPtr(stuff), stuffArray, 0, length);-elle être ?
VisualMelon

@VisualMelon C'est ce que j'obtiens pour ne pas revérifier les noms des variables après les avoir renommés. Merci pour l'avertissement: D. Modifié la réponse pour tenir compte de la version plus courte dans votre commentaire.
Ichabod Clay

Vous pouvez couper un peu la version sûre en soulignant la longueur qui, var a=new int[(int)((n/2f)*(n+1))];je pense, le ramène à 109
James Webster

Un de plus en réécrivant le calcul comme:(n*(n+1)/2)
James Webster


1

C #, 116 115 + 33 = 148 octets

Pas le code le plus court, mais ... ça marche quand même: 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();}

Nécessite cela en haut du fichier (33 octets):

using System.Collections.Generic;

Version sans 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.5est 11.5, non 10.5.
ProgramFOX

@ProgramFOX bonne capture. Allez-vous modifier, ou devrais-je? Pas une bonne raison de voter contre l'OMI.
John Dvorak

@JanDvorak Je viens de le modifier. Et je n'ai pas voté contre, je l'ai voté avant même de voir l'erreur.
ProgramFOX

Maintenant que l'erreur a été corrigée, la solution de bonus doit-elle être déplacée vers le bas?
John Dvorak

-1Octet:, f=.-[:;<@|.@i."0@>:@i.rendant les scores égaux!
Bolce Bussiere

1

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

Modifier supprimer; thx @Optimizer

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

Test dans la console FireFox / FireBug

Q(9)

Production

[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]

Non golfé

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 octets

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

Assez content avec celui-ci ... Il fait environ un quart de la taille de mon original.

f(4) Retour:

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

Ancienne réponse:

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

C'est mon premier tir au golf de code ... Je veux toujours obtenir ce bonus de 0,5x. Toutes les suggestions sont les bienvenues!

Appelé avec f (n).


Vous devez être assez nouveau sur JavaScript lui-même :). (1) Supprimer les crochets autour de l'argument d, (2) a=b=c=[]dans la partie déclaration, (3) c[a].map(e=>a)(4)b.push(...c)
Optimizer

J'ai fait une version plus courte avant de lire votre commentaire, que je mettrai dans mon post. Mon expérience avec JS est principalement limitée à la manipulation DOM / style pour de simples applications Web ... et je n'ai pratiquement pas utilisé les nouvelles fonctionnalités ES6 jusqu'à aujourd'hui.
binormal

1

C #, 108 octets * 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;}

Merci à VisualMelon pour avoir travaillé dur! Je pensais que j'essaierais de le presser autant que possible.

(114 octets * 0,5 = 57, si vous insistez pour utiliser .ToArray () pour retourner int [])

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.