Перерахуйте кожну серію однакових чисел на місці


27

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

Приклади

[][]/[]

[42][0]/[1]

[7,7,7][0,1,2]/[1,2,3]

[10,20,30][0,0,0]/[1,1,1]

[5,12,10,12,12,10][0,0,0,1,2,1]/[1,1,1,2,3,2]

[2,7,1,8,2,8,1,8,2,8][0,0,0,0,1,1,1,2,2,3]/[1,1,1,1,2,2,2,3,3,4]

[3,1,4,1,5,9,2,6,5,3,5,9][0,0,0,1,0,0,0,0,1,1,2,1]/[1,1,1,2,1,1,1,1,2,2,3,2]


2
Так в основному кількість разів, коли вона з'явилася послідовністю до цих пір?
Jo King

1
@JoKing Так, це ще один спосіб констатувати це, але "поки що" має на увазі нульовий рівень, а "до включення цього" передбачає одноосновний. Я хотів утримати вибір.
Адам

Відповіді:


23

JavaScript (ES6), 26 байт

1-індексований.

a=>a.map(o=x=>o[x]=-~o[x])

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

Прокоментував

a =>                // a[] = input array
  a.map(o =         // assign the callback function of map() to the variable o, so that
                    // we have an object that can be used to store the counters
    x =>            // for each value x in a[]:
      o[x] = -~o[x] //   increment o[x] and yield the result
                    //   the '-~' syntax allows to go from undefined to 1
  )                 // end of map()

1
Я поняття не маю, як це працює, але це впевнено виглядає елегантно.
Адам

Я раніше не бачив -~- це абсолютний дорогоцінний камінь.
DaveMongoose

Крім того, це можливо використовувати aдля зберігання значень, але це потрібно для -/ ~індексу, так що жоден байт не зберігається.
користувач202729


1
@DaveMongoose -~- це фактично поширена альтернатива +1(оскільки вона має різний пріоритет) у багатьох мовах
лише для ASCII

10

R , 27 байт

function(x)ave(x,x,FUN=seq)

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

Пояснення:

ave(x,x,FUN=seq)розбиває вектор xна підвектори, використовуючи значення xяк групуючі ключі. Потім seqвикликається функція для кожної групи, і кожен результат переставляється назад у вихідне положення групи.

Краще дивіться приклад:

x <- c(5,7,5,5,7,6)
ave(x, x, FUN=seq) # returns 1,1,2,3,2


 ┌───┬───┬───┬───┬───┐
 │ 57557 │
 └───┴───┴───┴───┴───┘            
   |   |   |    |  ||   ▼    ▼  |
 GROUP A : seq(c(5,5,5)) = c(1,2,3)
   |   |   |    |  ||   ▼    ▼  |
 ┌───┐ | ┌───┬───┐ |1|23|
 └───┘ | └───┴───┘ |
       ▼           ▼
 GROUP B : seq(c(7,7)) = c(1,2)
       |           |
       ▼           ▼
     ┌───┐       ┌───┐
     │ 1 │       │ 2 │
     └───┘       └───┘ 

   |   |   |   |   |
   ▼   ▼   ▼   ▼   ▼ 
 ┌───┬───┬───┬───┬───┐
 │ 11232 │
 └───┴───┴───┴───┴───┘  

Примітка :

seq(y)функція повертає послідовність 1:length(y)у випадку, якщо yвона є length(y) > 1, але повертає послідовність з, 1:y[1]якщо yмістить лише один елемент.
Це, на щастя, не є проблемою, оскільки в цьому випадку R - скаржачись з великою кількістю попереджень - вибирає лише перше значення, яке, до речі, те, що ми хочемо :)


2
Блискуче! Я додам за це щедроту. Ніколи aveраніше не бачив .
Джузеппе

Мені честь, велике спасибі! :)
digEmAll

6

MATL , 4 байти

&=Rs

Це рішення на 1 основі

Спробуйте це на сайті MATL Online !

Пояснення

Використовує [1,2,3,2]як приклад

    # Implicitly grab the input array of length N
    #
    #   [1,2,3,2]
    #
&=  # Create an N x N boolean matrix by performing an element-wise comparison
    # between the original array and its transpose:
    #
    #     1 2 3 2
    #     -------
    # 1 | 1 0 0 0
    # 2 | 0 1 0 1
    # 3 | 0 0 1 0
    # 2 | 0 1 0 1
    #
R   # Take the upper-triangular portion of this matrix (sets below-diagonal to 0)
    #
    #   [1 0 0 0
    #    0 1 0 1
    #    0 0 1 0
    #    0 0 0 1]
    #
s   # Compute the sum down the columns
    #
    #   [1,1,1,2]
    #
    # Implicitly display the result

2
ах, я знав, що існує стара проблема, яка змусила мене подумати про щось подібне, це унікальне є дешевим, а рішення MATL є на одного персонажа різним!
Джузеппе

5

APL (Dyalog Unicode) , 7 байт

Багато, велике спасибі H.PWiz, Adám та dzaima за всю їх допомогу в налагодженні та виправлення цього.

+/¨⊢=,\

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

Пояснення

10-байтну негласну версію буде простіше пояснити спочатку

{+/¨⍵=,\⍵}

{         } A user-defined function, a dfn
      ,\⍵  The list of prefixes of our input list 
           (⍵ more generally means the right argument of a dfn)
           \ is 'scan' which both gives us our prefixes 
           and applies ,/ over each prefix, which keeps each prefix as-is
    ⍵=     Checks each element of  against its corresponding prefix
           This checks each prefix for occurrences of the last element of that prefix
           This gives us several lists of 0s and 1s
 +/¨       This sums over each list of 0s and 1s to give us the enumeration we are looking for

Мовчазна версія робить три речі

  • По-перше, це видаляє екземпляр використовуваного в, ,\⍵оскільки ,\праворуч сам по собі може неявно з'ясувати, що він повинен працювати на правильному аргументі.
  • По- друге, для ⍵=, замінимо з , яка виступає за правий аргумент
  • По-третє, тепер, коли у нас немає явних аргументів (в даному випадку, ), ми можемо видалити дужки, {}оскільки мовчазні функції не використовують їх

5

AWK , 14

  • 1 байт збережено завдяки @NahuelFouilleul
{print++a[$1]}

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

Сказане робить одноосновне індексування. Якщо ви віддаєте перевагу нульовій індексації, її додатковий байт:

{print a[$1]++}

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


1
зауважте, що другий може зберегти один байт {print++a[$1]}без місця, здається, працює
Nahuel Fouilleul

@NahuelFouilleul Дякую!
Цифрова травма

5

J , 7 байт

1#.]=]\

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

1-індексований.

Пояснення:

]\ all the prefixes (filled with zeros, but there won't be any 0s in the input):
   ]\ 5 12 10 12 12 10
5  0  0  0  0  0
5 12  0  0  0  0
5 12 10  0  0  0
5 12 10 12  0  0
5 12 10 12 12  0
5 12 10 12 12 10

]= is each number from the input equal to the prefix:
   (]=]\) 5 12 10 12 12 10
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
0 1 0 1 0 0
0 1 0 1 1 0
0 0 1 0 0 1

1#. sum each row:
   (1#.]=]\) 5 12 10 12 12 10
1 1 1 2 3 2

K (oK) , 11 10 байт

-1 байт завдяки ngn!

{+/'x=,\x}

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


1
Хе, ти щасливий, що я зробив дані суворо позитивними…
Адам

@ Adám Так, інакше мені потрібно встановити коробки :)
Гален Іванов,

1
в k: ='->=
ngn



3

C # (Visual C # Interactive Compiler) , 44 байти

x=>x.Select((y,i)=>x.Take(i).Count(z=>z==y))

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



Ви перевернули виклик прямо зараз. [7,7,7]Потрібно виводити [0,1,2], а не [0,0,0].
Кевін Круїссен

1
@KevinCruijssen - Спасибі :) Схоже, я неправильно прочитав речі, це слід виправити зараз.
дата



2

R , 41 байт

function(x)diag(diffinv(outer(x,x,"==")))

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

Як не дивно, повернення нульового індексу в Р коротше.


Ще раз, Джузеппе, ваше найвище знання R побив мене. У мене був пристойно геніальний метод у 60 байт, але, на жаль, цього було недостатньо!
Sumner18

@ Sumner18 опублікуйте це все одно! Я завжди багато чого вчуся на підходах інших людей, а отримання зворотного зв’язку - це найшвидший шлях до навчання!
Джузеппе

дякую за заохочення! Я вже розмістив шахту і завжди відкритий для пропозицій щодо вдосконалення!
Sumner18

2

Рубін, 35 байт

->a{f=Hash.new 0;a.map{|v|f[v]+=1}}

Це, на жаль, досить повсякденно - створити хеш, який зберігає загальну кількість для кожного запису, що зустрічався до цього часу.

Деякі інші цікаві варіанти, які, на жаль, були недостатньо короткими:

->a{a.dup.map{a.count a.pop}.reverse}   # 37
->a{i=-1;a.map{|v|a[0..i+=1].count v}}  # 38

2

R , 62 43 байт

x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);z

-19 байт завдяки Джузеппе, видаливши який і таблицю, і лише незначні зміни в реалізації

Оригінал

x=z=scan();for(i in names(r<-table(x)))z[which(x==i)]=1:r[i];z

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

r<-table(x) підраховує кількість разів, коли кожне число з'являється, і зберігає його в r, для подальшого використання

names() отримує значення кожного унікального запису в таблиці, і ми повторюємо ці імена за допомогою циклу for.

Інша частина перевіряє, які записи рівні ітераціям, і зберігає послідовність значень (від 1 до кількості записів ітерації)

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


ви можете видалити, which()щоб зберегти 7 байт.
Джузеппе

Ваше використання 1:r[i]дало мені ідею просто видалити table()повністю: x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);zце 43 байти! Це приємний підхід!
Джузеппе

Схоже, що ніхто з нас не може конкурувати з знаннями digEmAll про R !
Джузеппе

Я це бачив і був абсолютно змарнілий!
Sumner18

2

Haskell , 44 байти

([]#)
x#(y:z)=sum[1|a<-x,a==y]:(y:x)#z
_#e=e

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

Пояснення

Переміщає список зліва направо, зберігаючи список xвідвіданих елементів, спочатку []:

Для кожної зустрічі yрахуйте всі рівні елементи в списку x.


1
Трохи довше, але, можливо, все-таки цікаво: (#(0*));(x:r)#g=g x:r# \y->0^abs(y-x)+g y;e#g=e спробуйте в Інтернеті!
Лайконі

@Laikoni: Як ви навіть придумали це, ви повинні повністю розмістити це!
ბიმო



2

Haskell , 47 46 байт

(#(*0))
(x:r)#g=g x:r# \y->0^(y-x)^2+g y
e#g=e

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

Інший підхід, ніж відповідь BMO, який виявився трохи довше. (І люб'язно позичає їхній гарний тестовий костюм.)

Ідея полягає в перегляді списку вхідних даних та відстеженні кількості разів, коли кожен елемент відбувся шляхом оновлення функції g. Безголовки:

f (const 0)
f g (x:r) = g x : f (\ y -> if x==y then 1 + g y else g y) r
f g []    = []

Виникли дві цікаві можливості для гольфу. Спочатку для початкового значення gконстантної функції, яка нехтує її аргументом і повертає 0:

const 0  -- the idiomatic way
(\_->0)  -- can be shorter if parenthesis are not needed
min 0    -- only works as inputs are guaranteed to be non-negative
(0*)     -- obvious in hindsight but took me a while to think of

А по- друге вираз над змінними xі yяка дає 1якщо xрівним yі 0іншим чином :

if x==y then 1else 0  -- yes you don't need a space after the 1
fromEnum$x==y         -- works because Bool is an instance of Enum
sum[1|x==y]           -- uses that the sum of an empty list is zero
0^abs(x-y)            -- uses that 0^0=1 and 0^x=0 for any positive x
0^(x-y)^2             -- Thanks to  Christian Sievers!

Існують ще короткі шляхи. Хтось отримав ідею?


1
Можна використовувати 0^(x-y)^2.
Крістіан Сіверс



1

bash, 37 24 байт

f()(for x;{ r+=$[a[x]++]\ ;};echo $r)

ТІО

якщо це дійсно, існує також така варіація, як запропонував DigitalTrauma

for x;{ echo $[a[x]++];}

ТІО


1
Передайте список як аргументи командного рядка - tio.run/##S0oszvj/Py2/SKHCuporNTkjX0ElOjG6IlZbO5ar9v///8b/… - всього 24 байти.
Цифрова травма

@DigitalTrauma, дякую, проте я не знаю, чи порушив він правила. також як було запропоновано замінити список, і, можливо, це має бути щось на зразок tio.run/…
Nahuel Fouilleul

2
@NahuelFouilleul Добре, дозволені також повні програми, і це дійсний метод введення / виведення списку (IMO)
лише ASCII

1

Perl 5, 11 байт

$_=$h{$_}++

ТІО

пояснення після коментаря

  • $_спеціальна змінна perl, що містить поточну лінію під час переходу на вхід ( -pабо-n комутатори)
  • $h{$_}++автоматично збільшує мапу %hта створює запис із ключем$_ та кроком та надає значення перед збільшенням
  • спеціальна змінна друкується через -pперемикач, -lперемикач видаляє кінець рядка на вході та додає кінець рядка на вихід

Це виглядає дивовижно. Хочете пояснити?
Адам

@ Adám, дякую за відгук, звичайно, зроблено
Nahuel Fouilleul



1

Attache , 23 байти

{`~&>Zip[_,_[0:#_::0]]}

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

Пояснення

{`~&>Zip[_,_[0:#_::0]]}
{                     }    _: input (e.g., [5, 12, 10, 12, 12, 10])
             0:#_          range from 0 to length of input (inclusive)
                           e.g., [0, 1, 2, 3, 4, 5, 6]
                 ::0       descending range down to 0 for each element
                           e.g., [[0], [1, 0], [2, 1, 0], [3, 2, 1, 0], [4, 3, 2, 1, 0], [5, 4, 3, 2, 1, 0], [6, 5, 4, 3, 2, 1, 0]]
           _[       ]      get input elements at those indices
                           e.g., [[5], [12, 5], [10, 12, 5], [12, 10, 12, 5], [12, 12, 10, 12, 5], [10, 12, 12, 10, 12, 5], [nil, 10, 12, 12, 10, 12, 5]]
     Zip[_,          ]     concatenate each value with this array
                           e.g., [[5, [5]], [12, [12, 5]], [10, [10, 12, 5]], [12, [12, 10, 12, 5]], [12, [12, 12, 10, 12, 5]], [10, [10, 12, 12, 10, 12, 5]]]
   &>                      using each sub-array spread as arguments...
 `~                            count frequency
                               e.g. [12, [12, 10, 12, 5]] = 12 ~ [12, 10, 12, 5] = 2

1

C (gcc) , 65 62 байт

c,d;f(a,b)int*a;{for(;c=d=b--;a[b]=d)for(;c--;d-=a[c]!=a[b]);}

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

-2 байти завдяки ASCII


Це здавалося занадто відвертим, але я не міг здатися коротшим за іншого підходу.



@ ASCII - це лише правдива відповідь? Немає заголовка, немає декларацій, це фрагмент плюс багато попереджень, хоча він виводить.
AZTECCO

Попередження @AZTECCO чудово (stderr ігнорується), якщо це робиться так, як слід. зверніть увагу , що це є оголошенням функції, а також деякі оголошення змінних - ви можете помістити його в будь-якому місці , як вираз верхнього рівня , і він буде компілювати штраф. багато з з відповідями (і ті , в мовах з менш суворим синтаксисом) робити , як правило, досить багато попереджень з - за bytesaves, нехороша код стиль
ASCII-тільки

Гаразд, я можу зрозуміти, але все ще є щось недобре для мене. Якщо ми хочемо протестувати з іншим набором (за розміром), ми повинні змінити код навіть у циклі друку, плюс введенням має бути лише набір, а не його розмір. "З огляду на список суворо позитивних цілих чисел ... "тож я думаю, що вхід повинен бути лише списком.
AZTECCO

@AZTECCO не впевнений, чи повинна ця дискусія належати до коментарів цієї відповіді, але ви можете поглянути на мета - конкретно на формати вводу / виводу та відповіді .
attinat

1

К (нг / к) , 18 байт

(,/.!'#'=x)@<,/.=x

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


СТАРИЙ ПІДХІД

К (нг / к) , 27 23 22 байт

{x[,/.=x]:,/.!'#'=x;x}

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


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

пояснення:

  • =xповертає дікт, де ключі є елементами x, а значення - їх індексами ( 3 1 4 5 9 2 6!(0 9;1 3;,2;4 8 10;5 11;,6;,7))
  • i: призначити дікт i
  • #:'підраховувати значення для кожного ключа ( 3 1 4 5 9 2 6!2 2 1 3 2 1 1)
  • !:'перерахувати кожне значення ( 3 1 4 5 9 2 6!(0 1;0 1;,0;0 1 2;0 1;,0;,0))
  • ,/.:витягувати значення та згладжувати список ( 0 1 0 1 0 0 1 2 0 1 0 0)
  • x[,/.:i]: витягнути індекси з i, вирівняти і призначити кожне значення зі списку правої сторони за цими індексами

прикро, список оновлюється, але нульове значення повертається завданням, тому мені потрібно повернути список після крапки з комою ( ;x)

редагувати: видалено сторонні колонки

edit2: видалено непотрібне завдання


0

Сітківка 0,8,2 , 30 байт

\b(\d+)\b(?<=(\b\1\b.*?)+)
$#2

Спробуйте в Інтернеті! Посилання включає тестові випадки. 1-індексований. Пояснення: Перша частина регулярного вираження по черзі відповідає кожному цілому числу у списку. Група Lookbehind відповідає кожному виникненню цього цілого числа на цьому рядку аж до поточного цілого числа. Потім ціле число замінюється кількістю збігів.


0

Пакет, 61 байт

@setlocal
@for %%n in (%*)do @set/ac=c%%n+=1&call echo %%c%%

1-індексований. Оскільки заміна змінної відбувається перед розбором, set/aкоманда закінчує збільшення ім'я змінної, заданої шляхом об'єднання літери cз цілим числом зі списку (числові змінні за замовчуванням до нуля в Пакеті). Потім результат копіюється в інше ціле число для зручності виводу (точніше, це економить байт).



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