Створіть масив з повторними числами


19

Виклик

Ваше завдання в цьому запитанні - написати програму або іменовану функцію, яка приймає додаткове ціле число n(більше 0) як вхід через STDIN, ARGV або аргументи функції та виводить масив через STDOUT або повернене значення функції.

Звучить досить просто? Тепер ось правила

  • Масив буде містити лише цілі числа від 1доn
  • Кожне ціле число від 1до nмає бути повторене xразів, де xє значення кожного цілого числа.

Наприклад:

Вхід:

5

Вихід:

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

Масив може бути, а може і не бути відсортованим.

Це тому переможець - найкоротший код у байтах.

Бонус

Помножте свій результат на те, 0.5якщо два вихідних цілих числа у вихідному масиві не збігаються.

Наприклад n = 5, одна така конфігурація була б

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

Відповіді:


6

APL, 4 символи

/⍨⍳⎕

Як це працює:

читає введення користувача. Що стосується виводу, APL за замовчуванням друкує результат з кожного рядка.

⍳n- цілі числа від 1 до n. Приклад:⍳3←→ 1 2 3

/означає копію . Кожен елемент з правого аргументу повторюється стільки разів, скільки визначено його відповідним елементом з лівого аргументу. Приклад:2 0 3/'ABC'←→ 'AACCC'

є оператором маршруту . Коли вона трапляється праворуч від функції, вона змінює її поведінку, тому вона або підміняє аргументи ( A f⍨ B ←→ B f Aотже, "комутується"), або надає однаковий аргумент з обох сторін ( f⍨ A ←→ A f A, "selfie"). Остання форма використовується в цьому розчині.


Бонус:

6-∊⌽⍳¨⍳⎕(8 символів, спасибі @ phil-h )

⍳5(йота п’ять) є 1 2 3 4 5.

⍳¨ ⍳5(йота кожна йота п'ять) - (,1)(1 2)(1 2 3)(1 2 3 4)(1 2 3 4 5)це вектор векторів. Кожен ( ¨) є оператором, він приймає функцію зліва і застосовує її до кожного елемента з масиву праворуч.

обертає масив, тому ми отримуємо (1 2 3 4 5)(1 2 3 4)(1 2 3)(1 2)(,1).

є Enlist (ака вирівнюватися ). Рекурсивно перетинає аргумент і повертає з нього прості скаляри як вектор.


Як щодо виразу з 4 символами ? /⍨⍳n
ngn

Як ви хочете, пане, я оновив текст. Але, безумовно, ваше заперечення має стосуватися інших рішень, які не є функціями?
ngn

3
Dyalog APL випускається у двох смаках: "Класичний" та "Юнікод". Класична версія існує десятиліттями, оскільки до того, як з'явився стандарт Unicode, використовується спеціальне кодування байтів на персонаж для набору символів APL. Він все ще підтримується, хоча його використання не рекомендується. Отже, я хотів би використати це як виправдання. В цілому, я думаю, що в гольфі ми повинні рахувати символи, а не байти. Те, що найнижчі кодові точки в Unicode займають англоцентричний ASCII - це історична аварія, яка сьогодні не повинна мати значення. Цікаво, що APL був задуманий до виходу ASCII.
ngn

3
@ngn підрахунок символів не є хорошою ідеєю , оскільки відповіді, як правило, стають розшифровкою супу за алфавітом. Символи APL вважаються байтами, оскільки таке кодування існує; це добре встановлено на цьому сайті. Це працює з будь-яким байтовим кодуванням, яке існувало до запитання.
FryAmTheEggman

1
@ngn: Чи можете ви пояснити свою бонусну відповідь? Тому що це можна зробити за допомогою: 5 4 3 2 1 5 4 3 2 5 4 3 5 4 5 або 6 мінус 1 1 3 3 4 5 1 2 3 4 1 2 3 1 2 1, що здається, що воно недалеко з вашої початкової відповіді.
Філ Н

11

Ruby (рекурсивна), 41 байт * 0,5 = 20,5

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

Або з використанням лямбда (як рекомендують гістократ і Вентеро): 34 байт * 0,5 = 17

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

(дзвінок за допомогою r[argument])


2
Це дійсно круте рішення. Ви можете зберегти кілька байтів, зробивши його лямбда замість методу ( n=->x,i=1{...n[x,i+1]...) та ще декількома [*i..n].
гістократ

1
Інвертуючи логіку, ви можете опустити пробіл у r=->n,i=n{i>0?[*i..n]+r[n,i-1]:[]}
трійку


8

Хаскелл, 31 символ = 15,5 балів

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

27 символів без бонусу

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

Побитий гордий Хаскеллер


ваше перше рішення невірне. Можливе виправленняg n = [y|x<-[n,n-1..1],y<-[x..n]]
карафафа

@karakfa на жаль: - / і дякую за виправлення
Джон Дворак

Моя відповідь Haskell - це лише трохи більше ніж ваша
гордий haskeller

Чи повинен я посилатися на це зі свого рішення, щоб просувати його?
Джон Дворак

@JanDvorak Я хотів би, власне ...
гордий haskeller

7

C, 22 = 44 байт * 0,5

Функція hприймає два параметри. Перший - intвказуючий п . Другий - це int*вихідний буфер.

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

Тестова програма

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

Я не розумію. Будь ласка, поясніть?
bacchusbeale

@bacchusbeale Добре. Рекурсивно записує низхідні послідовності від n до 0. Коротші послідовності записуються швидше, на більш глибокому рівні рекурсії. Якщо аргумент n дорівнює 0, то n - фальси, тому рекурсії немає, і записується лише 0, який служить для позначення кінця масиву.
feersum

7

Піт - 15 10 * .5 = 5

smr-QdhQUQ

Спробуйте в Інтернеті.

Очікує введення на stdin. Самостійно виявлений алгоритм. Спасибі @ Sp3000 за те, що ти допомагаєш мені вкласти останній Q: P Також іронія? XD

Пояснення:

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

2
Приємне рішення. Чи буває колись ситуація, коли Pyth не вигравав би гольф з кодом? :)
Олексій А.

2
@Alex В залежності від характеру проблеми, складають мови грати в гольф на основі (Golfscript, CJam) може крем, він також може втратити в бібліотеці матеріалу ( кашель Баш кашель );)
FryAmTheEggman

6

CJam, 12 15 байт * 0,5 = 7,5

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

Це повна програма STDIN-STDOUT. Він поєднує зростаючі суфікси 1 ... nдіапазону, що забезпечує відсутність двох суміжних чисел однакових.

Перевірте це тут.


6

Python 2, 53 байти * 0,5 = 26,5

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

Безсоромно запозичив ідею @ VisualMelon


6

Haskell, 34 байт * 0,5 = 17

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

Це перший раз, коли я коли-небудь використовував Haskell для гольфу. Подзвоніть з g <number>.



5

GolfScript (14 байт * 0,5 = оцінка 7)

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

Демонстрація в Інтернеті

Я думаю, що це, мабуть, схоже на деякі існуючі відповіді тим, що він створює масив concat( [n], [n-1, n], [n-2, n-1, n], ..., [1, 2, ..., n] )

На жаль, я не зміг більше покататися на гольфі, мабуть, більш елегантний:

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

який вводить вхід xу масив, а потім двічі застосовує {,{x\-}/}%, який відображає кожен елемент у масиві для відліку цього числа елементів x.


5

C # - 81 (161 байт * 0,5)

Проста робота в C #, сподіваємось, отримує бонус за неприлеглі числа. Читає int від stdin, записує масив, як приклад до 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+"]");}}

Більш зрозумілі:

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

Приклади виведення:

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

Я справді намагаюся розглянути коротше рішення C #, але я просто не можу його отримати ... молодець
Брендон

1
@MarkKnol System.Consoleє статичним, ви не можете призначити його змінній, але в C # 6 або що далі буде, ви зможете це зробити using System.Console;( using System;не платити в цьому випадку), не знаю, як я ставлюся до цієї функції саме з цієї причини впливають на багато старих питань щодо гольфу;)
VisualMelon

1
@IchabodClay це стає гірше, using C=System.Consoleекономить 3 байти, і це, мабуть, те, що означав @MarkKnol (вибачте!), Ганебна недбалість з мого боку.
VisualMelon

1
Також, згідно з правилами, ви можете просто мати сам метод замість створення повноцінної програми. Щось на кшталт ... цього . (114 байт з пробілами та такими видаленими. 57 байт з бонусом.)
Ichabod Clay

1
@IchabodClay дійсно; Я вважаю за краще подавати повноцінні програми на функції, без поважних причин, IO просто здається частиною задоволення (я також не схильний використовувати argv). Не соромтеся розміщувати кращу відповідь за рахунком без цих спритних обмежень!
VisualMelon

4

JavaScript, ES6, 41 байт

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

Це створює функцію, fяку можна назвати подібноюf(6) і вона повертає необхідний масив.

Для цього використовується рекурсивний підхід, коли кожна ітерація створює масив iелементів, що оцінюються, iі об'єднує масив, повернутий f(i-1)з умовою зупинкиi==0 .

Працює над останніми Firefox.


4

Haskell, 14 = 28 байт / 2

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

Приклад виведення:

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

24 байти без бонусу:

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

може =<<допомогти уникнути пробілів? Я відчуваю, що це могло, але я був би здивований, якби ви цього ще не думали.
Джон Дворак

@JanDvorak Якби я використовував, =<<мені потрібні дужки для лямбда
гордий haskeller

Мене бентежить, коли саме лямбдам потрібні дужки. Чи заголовок лямбда має таку ж фіксованість, як і >>=?
Джон Дворак

@JanDvorak Вони не мають фіксованості; Я не впевнений , наскільки точні це правило, але лямбда може з'явитися тільки тоді, коли оператори не можуть (без урахування ділянок): після того, як (, [, =, ,, після будь-яких операторів, і тому подібної
горда haskeller

Я думаю, що ні лямбда, ні оператори не можуть відображатися як зразки? let \x->y = (2+) in (x,y)видається щось неможливим.
Джон Дворак


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

ви можете втратити 1 (0,5 технічно) байтів, конденсуючись For Z=1 ToдоFor Z=1To
Тейлор Скотт,

Ви також можете конденсуватися Next:NextвNext x,Z
Тейлор Скотт

2

R, 44 * .5 = 22

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

Швидкий тест

> 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

Що ? Ні TSQL?
Оптимізатор

@Optimizer, можливо, пізніше :)
MickyT

2

JavaScript, ES6, 66 байт * 0,5 = 33

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

Спираючись на рекурсивний підхід оптимізатора , ми можемо будувати низхідні пробіги зменшення довжини, наприклад[4,3,2,1, 4,3,2, 4,3, 4] .

Замість того, щоб створювати однакові значення підматривок з Array(i).fill(i), ми робимо undefinedзаповнені підматриці відповідної довжини з, Array(n).fill()а потім змінюємо значення на низхідний пробіг за допомогою .map((v,x)=>i-x). Також ми визначаємо і повторюємо внутрішню функцію g; зовнішня функція fіснує лише для зберігання значення, iпоки gрекурсує.


2

T-SQL, 176 * 0,5 = 88

Оскільки ви, здавалося, пропустили T-SQL @Optimizer, ось він у всьому є багатослівним славою :).

Пара функцій, скалярна та вбудована таблиця. Функція Scalar використовує while цикли для рекурсу та повернення рядка чисел, де функція Inline Table Valued використовує для послідовності рекурсивний CTE і повертає таблицю. Звичайно, це ніколи не буде конкурентоспроможним, тому я не витрачав багато часу на гольф.

Функція вбудованої таблиці з оцінкою, 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

Називається так

SELECT * FROM dbo.F(5)

SQLFiddle приклад

Скалярна функція, 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

Називається так

SELECT dbo.G(5)

SQLFiddle приклад



2

perl, 26 байт

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

1
Будь ласка, опублікуйте свій рахунок. Крім того, оскільки це код гольфу, ви можете зберегти байти, видаливши зайві пробіли та означення $n.
Олексій А.

Це не працює для мене під Perl 6.
Алекс А.

@ Алекс, яка помилка, працює під 5.10
michael501

Unable to parse postcircumfix:sym<{ }>, couldn't find final '}' at line 3. Спробував це на ideone.com.
Олексій А.

@Alex, спробуйте це: C: \ Windows \ system32> perl -e "$ n = 5; для (1 .. $ n) {print qq ($ _) x $ _;};" 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
michael501

2

JavaScript (для читання), 131 байт

Я новачок у Code Golf, тому це не найкраще

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 (менш читабельний), 87 байт

Мінімізовано за допомогою 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 байт * 0,5 = 12,5

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

Вищезгадане ледве обіграє не бонусну версію в 13 байт:

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

2

C #, 114 99 * 0,5 = 49,5 байт

(За невеликої допомоги у відповіді VisualMelon) Редагувати: коментар Джеймса Вебстера

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

Безголівки:

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

Існує небезпечна версія, яку я безсоромно взяв з відповіді C "feersum", але я не на 100% впевнений, що вона відповідає правилам, оскільки вам потрібно виділити пам'ять перед тим, як викликати метод.

C # (небезпечно), 82 * 0,5 = 41 байт

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

Називається так:

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 }

За пропозицією VisualMelon (спасибі!), Небезпечний код можна переробити за допомогою безпечного коду, що ще більше зменшує розмір! Все-таки виникає питання, чи дозволено створення масиву кінцевих результатів поза методом.

C #, 72 * 0,5 = 36 байт

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

Хороша робота! Для дозволеної версії набагато дешевше безпечно передати її та передати її int[]негайно void A(int n,int[]p){int z=0,m=n,i;while(m-->0)for(i=m;i++<n;)p[z++]=i;}- я б погодився, це, мабуть, трохи нечітко, щодо правил;)
VisualMelon

Вам не потрібно створювати локальний покажчик для небезпечної версії, який вирізає непогані 8 байт. Крім того, я можу пропустити пункт, але чи повинен бути останній рядок небезпечного коду виклику System.Runtime.InteropServices.Marshal.Copy(new IntPtr(stuff), stuffArray, 0, length);?
VisualMelon

@VisualMelon Це те, що я отримую за повторну перевірку імен змінних після перейменування їх. Дякую за голови вгору: D. Відредагував відповідь, щоб повідомити про коротшу версію у своєму коментарі.
Ichabod Clay

Ви можете трохи відрізати безпечну версію, вказавши довжину, на яку var a=new int[(int)((n/2f)*(n+1))];я думаю, що вона зменшує її до 109
Джеймс Вебстер

Ще одне, переписавши кальку як:(n*(n+1)/2)
Джеймс Вебстер,


1

C #, 116 115 + 33 = 148 байт

Не найкоротший код, але ... він все одно працює: 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();}

Потрібно це у верхній частині файлу (33 байти):

using System.Collections.Generic;

Версія без гольфу:

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, ні 10.5.
ProgramFOX

@ProgramFOX хороший улов. Ви збираєтесь редагувати, чи я повинен? Не вагомий привід спростувати ІМО.
Джон Дворак

@JanDvorak Тільки відредагував. І я не порушив заяву, я спротив її ще до того, як побачив помилку.
ProgramFOX

Тепер, коли помилка була виправлена, чи слід переміщувати бонусне рішення донизу?
Джон Дворак

-1Байт: f=.-[:;<@|.@i."0@>:@i.зробивши рахунки рівними!
Bolce Bussiere

1

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

Редагувати видалити; thx @Optimizer

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

Тест в консолі FireFox / FireBug

Q(9)

Вихідні дані

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

Безумовно

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 байт

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

Я досить задоволений цим ... Це приблизно на чверть розміру мого оригіналу.

f(4) повертає:

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

Стара відповідь:

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

Це мій перший вистріл у коді гольфу ... Я все одно хочу отримати цей 0,5-кратний бонус. Будь-які пропозиції вітаються!

Називається за допомогою f (n).


Ви повинні бути досить новими в JavaScript це самостійно :). (1) Видаліть дужки навколо аргументу d, (2) a=b=c=[]у частині декларації, (3) c[a].map(e=>a)(4)b.push(...c)
Оптимізатор

Я зробив більш коротку версію, перш ніж прочитати ваш коментар, який я викладу у своєму дописі. Мій досвід роботи з JS здебільшого обмежений DOM / маніпулювання стилем для простих веб-додатків ... і я майже не використовував жодної з нових функцій ES6 до сьогодні.
бінормальний

1

C #, 108 байт * 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;}

Дякуємо VisualMelon за важку роботу! Я думав, що спробую максимально стиснути його.

(114 байт * 0,5 = 57, якщо ви наполягаєте на використанні .ToArray () для повернення int [])

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.