Hitung setiap seri angka identik di tempat

27

Dengan diberikan daftar bilangan bulat yang benar-benar positif, telusuri setiap angka berbeda dan gantilah semua kemunculannya dengan indeks berurutan (nol atau satu berdasarkan) dari seri baru.

Contohnya

[][]/[]

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

Adám
sumber
2
Jadi pada dasarnya berapa kali urutannya muncul sejauh ini?
Jo King
1
@ JoKing Ya, itu cara lain untuk menyatakannya, tetapi "sejauh ini" menyiratkan berbasis nol, dan "sampai dan termasuk ini" menyiratkan berbasis satu. Saya ingin menyimpan pilihan.
Adám

Jawaban:

23

JavaScript (ES6), 26 byte

1-diindeks.

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

Cobalah online!

Berkomentar

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()
Arnauld
sumber
1
Saya tidak tahu bagaimana cara kerjanya, tapi itu pasti terlihat elegan.
Adm
Saya belum pernah melihat -~sebelumnya - itu adalah permata mutlak.
DaveMongoose
Atau, dimungkinkan untuk digunakan auntuk menyimpan nilai-nilai, tetapi diperlukan untuk -/ ~indeks sehingga tidak ada byte yang disimpan.
user202729
@DaveMongoose Kiat untuk bermain golf di JavaScript
user202729
1
@DaveMongoose -~sebenarnya merupakan alternatif yang biasa digunakan untuk +1(karena memiliki prioritas berbeda) dalam banyak bahasa
ASCII-satunya
10

R , 27 byte

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

Cobalah online!

Penjelasan:

ave(x,x,FUN=seq)membagi vektor xmenjadi sub-vektor menggunakan nilai-nilai xsebagai kunci pengelompokan. Kemudian seqfungsi dipanggil untuk masing-masing kelompok dan setiap hasil diatur kembali ke posisi kelompok semula.

Lebih baik lihat contoh:

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
 └───┴───┴───┴───┴───┘  

Catatan :

seq(y)fungsi mengembalikan urutan 1:length(y)jika ymemiliki length(y) > 1, tetapi mengembalikan urutan dari 1:y[1]jika yhanya mengandung satu elemen.
Untungnya ini bukan masalah karena dalam kasus itu R - mengeluh dengan banyak peringatan - hanya memilih nilai pertama yang kebetulan yang kita inginkan :)

menggali semua
sumber
2
Cemerlang! Saya akan menambahkan hadiah untuk ini. Belum pernah terlihat avesebelumnya.
Giuseppe
Saya merasa terhormat, terima kasih banyak! :)
digEmAll
6

MATL , 4 byte

&=Rs

Solusi ini berbasis 1

Cobalah di MATL Online !

Penjelasan

Gunakan [1,2,3,2]sebagai contoh

    # 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
Suever
sumber
2
ah, saya tahu ada masalah lama yang membuat saya berpikir tentang sesuatu yang serupa, itu Unik itu Murah, dan solusi MATL ada satu karakter yang berbeda!
Giuseppe
5

APL (Dyalog Unicode) , 7 byte

Banyak, banyak terima kasih kepada H.PWiz, Adám dan dzaima atas semua bantuan mereka dalam debugging dan memperbaiki ini.

+/¨⊢=,\

Cobalah online!

Penjelasan

Versi 10-byte non-diam-diam akan lebih mudah dijelaskan terlebih dahulu

{+/¨⍵=,\⍵}

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

Versi diam-diam melakukan tiga hal

  • Pertama, ia menghapus instance dari digunakan dalam ,\⍵sebagai ,\di sebelah kanan dengan sendirinya dapat secara implisit mengetahui bahwa itu seharusnya beroperasi pada argumen yang benar.
  • Kedua, untuk ⍵=, kita ganti dengan , yang merupakan argumen yang benar
  • Ketiga, sekarang kami tidak memiliki argumen eksplisit (dalam hal ini, ), kami dapat menghapus kurung kurawal {}karena fungsi tacit tidak menggunakannya
Sherlock9
sumber
5

AWK , 14

  • 1 byte disimpan berkat @NahuelFouilleul
{print++a[$1]}

Cobalah online!

Di atas melakukan pengindeksan satu berbasis. Jika Anda lebih suka pengindeksan berbasis nol, ini merupakan byte tambahan:

{print a[$1]++}

Cobalah online!

Trauma Digital
sumber
1
perhatikan bahwa detik dapat menghemat satu byte {print++a[$1]}tanpa ruang tampaknya berfungsi
Nahuel Fouilleul
@NahuelFouilleul Terima kasih!
Trauma Digital
5

J , 7 byte

1#.]=]\

Cobalah online!

1-diindeks.

Penjelasan:

]\ 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 byte

-1 byte terima kasih kepada ngn!

{+/'x=,\x}

Cobalah online!

Galen Ivanov
sumber
1
Heh, Anda senang saya membuat data benar-benar positif ...
Adm
@ Adám Ya, kalau tidak, saya harus memasukkan awalan :)
Galen Ivanov
1
dalam k: ='->=
ngn
4

05AB1E , 4 byte

ηε¤¢

Cobalah online! atau sebagai Test Suite

Penjelasan

ηε     # apply to each prefix of the input list
  ¤¢   # count occurrences of the last element
Emigna
sumber
3

C # (Visual C # Interactive Compiler) , 44 byte

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

Cobalah online!

dana
sumber
22 byte
LiefdeWen
Anda memiliki invers dari tantangan saat ini .. [7,7,7]harus keluar [0,1,2], dan tidak [0,0,0].
Kevin Cruijssen
1
@KevinCruijssen - Terima kasih :) Sepertinya saya salah membaca hal-hal, itu harus diperbaiki sekarang.
dana
2

Python 2 , 47 43 byte

f=lambda a:a and f(a[:-1])+[a.count(a[-1])]

Cobalah online!

Solusi 'berbasis satu' rekursif.

Chas Brown
sumber
2

Jelly , 4 byte

ċṪ$Ƥ

Cobalah online!

Untuk setiap awalan daftar input, ia menghitung jumlah kemunculan elemen terakhir itu sendiri.

Tuan Xcoder
sumber
Atau sekolah tua ;\ċ"juga 4.
Jonathan Allan
2

R , 41 byte

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

Cobalah online!

Anehnya, mengembalikan indeks berbasis nol lebih pendek di R.

Giuseppe
sumber
Sekali lagi Giuseppe, pengetahuanmu tentang R telah mengalahkanku. Saya memiliki metode yang cerdik pada 60 byte, tetapi sayangnya, itu tidak cukup!
Sumner18
@ Sumner18 tetap mempostingnya! Saya selalu belajar banyak dari pendekatan orang lain, dan mendapatkan umpan balik adalah cara tercepat untuk belajar!
Giuseppe
terima kasih atas dorongannya! Saya telah memposting milik saya sekarang dan selalu terbuka untuk saran untuk perbaikan!
Sumner18
2

Ruby, 35 byte

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

Sayangnya ini cukup biasa - membangun hash yang menyimpan total untuk setiap entri yang ditemukan sejauh ini.

Beberapa opsi lain yang menyenangkan yang sayangnya tidak cukup pendek:

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

R , 62 43 byte

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

-19 byte terima kasih kepada Giuseppe, dengan menghapus yang mana, dan tabel, dan hanya sedikit perubahan pada implementasi

Asli

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

Saya tidak bisa bersaing dengan pengetahuan Giuseppe, jadi pengajuan saya agak lebih lama dari pengetahuannya, tetapi menggunakan pengetahuan dasar saya, saya merasa bahwa solusi ini agak cerdik.

r<-table(x) menghitung berapa kali setiap angka muncul dan menyimpannya dalam r, untuk referensi di masa mendatang

names() mendapatkan nilai dari setiap entri unik dalam tabel, dan kami mengulangi nama-nama ini dengan for for.

Bagian yang tersisa memeriksa entri mana yang sama dengan iterasi dan menyimpan urutan nilai (dari 1 hingga jumlah entri iterasi)

Cobalah online!

Sumner18
sumber
Anda dapat menghapus which()untuk menyimpan 7 byte.
Giuseppe
Penggunaan Anda 1:r[i]memberi saya ide untuk menghapus table()seluruhnya: x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);zadalah 43 byte! Ini pendekatan yang bagus!
Giuseppe
Sepertinya kita berdua tidak bisa bersaing dengan pengetahuan R digem All !
Giuseppe
Saya melihat itu dan benar-benar terperangah!
Sumner18
2

Haskell , 44 byte

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

Cobalah online!

Penjelasan

Melintasi daftar dari kiri ke kanan dengan menjaga daftar xelemen yang dikunjungi, awalnya []:

Untuk setiap pertemuan yhitungan semua elemen sama dalam daftar x.

ბიმო
sumber
1
Sedikit lebih lama tetapi mungkin tetap menarik: (#(0*));(x:r)#g=g x:r# \y->0^abs(y-x)+g y;e#g=e Cobalah online!
Laikoni
@Laikoni: Bagaimana Anda membuat itu, Anda harus mempostingnya!
ბიმო
2

Perl 6 , 15 byte

*>>.&{%.{$_}++}

Cobalah online!

Anda dapat memindahkan ++ke sebelum %untuk indeks berbasis satu.

Penjelasan:

*>>.&{        }  # Map the input to
      %          # An anonymous hash
       .{$_}     # The current element indexed
            ++   # Incremented
Jo King
sumber
2

Haskell , 47 46 byte

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

Cobalah online!

Pendekatan yang berbeda dari jawaban BMO yang ternyata sedikit lebih lama. (Dan silakan meminjam baju tes bagus mereka.)

Idenya adalah untuk beralih pada daftar input dan melacak berapa kali setiap elemen terjadi dengan memperbarui fungsi g. Tidak Disatukan:

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

Dua peluang golf yang menarik muncul. Pertama untuk nilai awal g, fungsi konstan yang mengabaikan argumennya dan mengembalikan 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

Dan yang kedua ekspresi atas variabel xdan yyang menghasilkan 1jika xsama ydan 0sebaliknya:

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!

Mungkin masih ada cara yang lebih pendek. Adakah yang punya ide?

Laikoni
sumber
1
Anda bisa menggunakannya 0^(x-y)^2.
Christian Sievers
1

Java (JDK) , 76 byte

a->{for(int l=a.length,i,c;l-->0;a[l]=c)for(c=i=0;i<l;)c+=a[l]==a[i++]?1:0;}

Cobalah online!

Kredit

Olivier Grégoire
sumber
1
-2 byte dengan mengubah for(c=0,i=l;i-->0;)c+=a[l]==a[i]?1:0;ke for(c=i=0;i<l;)c+=a[l]==a[i++]?1:0;.
Kevin Cruijssen
1

Ruby , 34 byte

->a{r=[];a.map{|x|(r<<x).count x}}

Cobalah online!

GB
sumber
Saya tidak percaya saya mencoba ->a{i=-1;a.map{|v|a[0..i+=1].count v}}dan tidak berpikir untuk hanya membangun array baru, lol. Kerja bagus.
DaveMongoose
1

bash, 37 24 byte

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

TIO

jika valid, ada juga variasi ini, seperti yang disarankan oleh DigitalTrauma

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

TIO

Nahuel Fouilleul
sumber
1
Lulus daftar sebagai baris perintah args - tio.run/##S0oszvj/Py2/SKHCuporNTkjX0ElOjG6IlZbO5ar9v///8b/… - hanya 24 byte.
Digital Trauma
@DigitalTrauma, terima kasih namun saya tidak tahu apakah itu melanggar aturan. juga karena diminta untuk mengganti daftar dan mungkin harus sesuatu seperti tio.run/…
Nahuel Fouilleul
2
@NahuelFouilleul Tidak apa-apa, program penuh juga diperbolehkan, dan itu adalah metode yang valid untuk memasukkan / mengeluarkan daftar (IMO)
ASCII
1

Perl 5, 11 byte

$_=$h{$_}++

TIO

penjelasan komentar berikut

  • $_variabel khusus perl yang berisi garis saat ini saat perulangan input ( -patau -nswitch)
  • $h{$_}++Autovivifies peta %hdan membuat entri dengan kunci $_dan kenaikan dan memberikan nilai sebelum kenaikan
  • variabel khusus dicetak karena -psakelar, -lsakelar menghilangkan ujung saluran pada input dan menambahkan ujung saluran pada keluaran
Nahuel Fouilleul
sumber
Itu terlihat luar biasa. Mau jelaskan?
Adám
@ Adám, terima kasih atas tanggapan Anda, tentu saja, sudah selesai
Nahuel Fouilleul
1

Pari / GP , 32 byte

a->p=0;[polcoeff(p+=x^t,t)|t<-a]

kxaki=1kxai

Cobalah online!

alephalpha
sumber
1

Attache , 23 byte

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

Cobalah online!

Penjelasan

{`~&>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
Conor O'Brien
sumber
1

C (gcc) , 65 62 byte

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

Cobalah online!

-2 byte berkat ASCII saja


Ini terasa terlalu mudah, tetapi sepertinya saya tidak bisa lebih pendek dengan pendekatan yang berbeda.

attinat
sumber
63
ASCII
@ Hanya ASCII apakah ini jawaban yang valid? Tidak ada tajuk yang disertakan, tidak ada deklarasi, ini potongan plus banyak peringatan meskipun hasilnya.
AZTECCO
Peringatan @AZTECCO baik-baik saja (stderr diabaikan), selama ia melakukan apa yang seharusnya diterima. perhatikan bahwa ini adalah deklarasi fungsi, ditambah beberapa deklarasi variabel - Anda bisa meletakkannya di mana saja sebagai ekspresi level atas dan akan dikompilasi dengan baik. banyak c jawaban (dan orang-orang dalam bahasa dengan sintaks kurang ketat) yang umumnya memiliki beberapa peringatan karena bytesaves yang tidak gaya kode yang baik
ASCII-satunya
Ok saya bisa mengerti, tapi masih ada sesuatu yang tidak beres untuk saya. Jika kita ingin menguji dengan set yang berbeda (dalam ukuran) kita harus memodifikasi kode, bahkan dalam loop cetak, ditambah input harus hanya set, bukan ukurannya. "Diberikan daftar bilangan bulat ... "jadi saya pikir input harus hanya daftar.
AZTECCO
@AZTECCO tidak yakin apakah diskusi ini termasuk dalam komentar jawaban ini, tetapi Anda mungkin ingin melihat meta - khususnya pada format I / O dan answer .
Atinat
1

K (ngn / k) , 18 byte

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

Cobalah online!


PENDEKATAN TUA

K (ngn / k) , 27 23 22 byte

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

Cobalah online!


ini tidak cukup ... solusi cepat dan kotor, saya akan memperbaiki ini nanti ketika saya mendapat kesempatan untuk memikirkan pendekatan yang lebih baik

penjelasan:

  • =xmengembalikan dict di mana kunci adalah item x dan nilainya adalah indeks mereka ( 3 1 4 5 9 2 6!(0 9;1 3;,2;4 8 10;5 11;,6;,7))
  • i: tetapkan dict ke i
  • #:'menghitung nilai untuk setiap tombol ( 3 1 4 5 9 2 6!2 2 1 3 2 1 1)
  • !:'sebutkan setiap nilai ( 3 1 4 5 9 2 6!(0 1;0 1;,0;0 1 2;0 1;,0;,0))
  • ,/.:ekstrak nilai dan ratakan daftar ( 0 1 0 1 0 0 1 2 0 1 0 0)
  • x[,/.:i]: ekstrak indeks dari i, ratakan, dan tetapkan setiap nilai dari daftar sisi kanan pada indeks ini

mengganggu, daftar diperbarui tetapi nilai nol dikembalikan oleh tugas, jadi saya harus mengembalikan daftar setelah tanda titik koma ( ;x)

sunting: menghapus titik dua yang tidak berhubungan

edit2: menghapus tugas yang tidak perlu

tulisan cakar ayam
sumber
0

Retina 0.8.2 , 30 byte

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

Cobalah online! Tautan termasuk kasus uji. 1-diindeks. Penjelasan: Bagian pertama dari regex cocok dengan masing-masing bilangan bulat dalam daftar pada gilirannya. Grup lookbehind mencocokkan setiap kemunculan integer pada baris tersebut hingga dan termasuk integer saat ini. Bilangan bulat kemudian diganti dengan jumlah kecocokan.

Neil
sumber
0

Batch, 61 byte

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

1-diindeks. Karena substitusi variabel terjadi sebelum parsing, set/aperintah akhirnya menambah nama variabel yang diberikan dengan menggabungkan huruf cdengan integer dari daftar (variabel numerik default ke nol dalam Batch). Hasilnya kemudian disalin ke integer lain untuk kemudahan output (lebih tepatnya, menghemat satu byte).

Neil
sumber
0

Japt, 8 byte

£¯YÄ è¶X

Coba di sini

£¯YÄ è¶X
             :Implicit input of array U
£            :Map each X at 0-based index Y
 ¯           :  Slice U to index
  YÄ         :    Y+1
     è       :  Count the elements
      ¶X     :    Equal to X
Shaggy
sumber