Tìm các yếu tố duy nhất dựa trên một khóa nhất định


8

Đầu vào

Lấy một danh sách các giá trị x i mỗi cặp được ghép với một khóa y i .

[(x1, y1), (x2, y2), ...]

Đầu ra

Trả về danh sách L chỉ chứa các giá trị từ tập { x i }.

  • Độ dài của L phải bằng số lượng khóa duy nhất k trong tập { y i }.
  • Đối với mỗi khóa duy nhất k phải có một giá trị từ { x i } có khóa k .

Chi tiết

  • Sơ hở tiêu chuẩn không được phép.
  • Bạn có thể giả sử tất cả các giá trị trong đầu vào sẽ là các số nguyên không âm.
  • Có thể có các giá trị trùng lặp và khóa.
  • Bạn có thể giả sử có ít nhất một cặp giá trị / khóa trong đầu vào.
  • Nếu bạn muốn lấy hai danh sách có độ dài bằng nhau làm đầu vào (một cho các giá trị, một cho các khóa) thì tốt.
  • Bạn không thể lấy bất kỳ đầu vào khác.
  • Thứ tự của danh sách bạn xuất ra không quan trọng.
  • Các x i bạn chọn cho mỗi phím không quan trọng.

Ví dụ, với đầu vào [[0, 0], [1, 3], [2, 3]]bạn có thể trở lại một trong hai [0, 1]hoặc [0, 2]hoặc bất kỳ hoán vị trong số này.

Ví dụ

[[1, 2], [3, 2], [3, 0]]  -> [1, 3] or [3, 3]
[[7, 2], [7, 0], [7, 1]]  -> [7, 7, 7]
[[4, 0], [4, 0], [9, 1], [5, 2]]  -> [4, 9, 5]
[[9, 1], [99, 10], [5, 5], [0, 3]]  -> [9, 99, 5, 0]

Ít byte nhất sẽ thắng.


Tôi có thể nhận đầu vào trong mẫu key value key value key value ...?
lãng phí

@wastl Có bạn có thể
dylnan

Điều gì xảy ra nếu ngôn ngữ của bạn không hỗ trợ Bản đồ có cùng keys? Chúng ta có thể lấy hai mảng là keysvalueslàm đầu vào không? Hoặc tạo Bản đồ tùy chỉnh của riêng chúng tôi, lấy nhiều giá trị làm đầu vào (hoặc có thể là danh sách các cặp khóa-giá trị)?
Kevin Cruijssen

1
@KevinCruijssen If you prefer to take two lists of equal length as input that is fine.Đây có phải ý bạn không? Tôi không biết ý của bạn về "Bản đồ".
dylnan

@dylnan Ah, đó thực sự là những gì tôi muốn nói, cảm ơn. Đọc qua nó. Và "maps" là thuật ngữ cho các cặp khóa-giá trị trong Java, không chắc nó có được gọi khác nhau trong các ngôn ngữ khác hay không.
Kevin Cruijssen

Câu trả lời:


4

Python 2 , 34 byte

lambda a,b:dict(zip(b,a)).values()

Hãy thử trực tuyến!

Lấy đầu vào là danh sách các giá trị và danh sách các khóa.
Tạo từ điển, trao đổi khóa và giá trị, chỉ để lại các giá trị y duy nhất. Trả về tất cả các giá trị x tương ứng


1
Bạn có thể lưu 3 byte nếu bạn đảo ngược thứ tự của các đối số đầu vào (câu hỏi không quy định một thứ tự cụ thể) và lấy và chuyển chúng dưới dạng đối số kiểu chữ
David Foerster



3

Clojure, 20 18 byte

(comp vals zipmap)

Cái này lấy danh sách các giá trị và khóa làm đối số, theo thứ tự đó.




2

JavaScript (ES8), 43 byte

Lấy đầu vào là 2 danh sách riêng biệt trong cú pháp currying (values)(keys).

v=>k=>v.filter(o=(x,i)=>o[j=k[i]]?0:o[j]=1)

Hãy thử trực tuyến!


Bài học JavaScript ngày nay: các hàm là mảng.
Jakob

@Jakob Chính xác hơn, các chức năng là các đối tượng. Vào cuối trường hợp thử nghiệm đầu tiên, o trông như thế { [Function: o] '0': 1, '2': 1 }.
Arnauld

2

Husk , 4 byte

ṁhüt

Hãy thử trực tuyến!

Làm sao?

hüt - Chương trình đầy đủ. 
  üt - Nhóm theo đuôi (danh sách không có phần tử đầu tiên).
h - Đầu bản đồ (danh sách không có phần tử cuối cùng) và nối các kết quả.

2

Stax , 5 byte

╠HB%§

Chạy và gỡ lỗi nó

Có hai mảng, giá trị đầu tiên, sau đó là khóa.

Giải trình:

cu:I@J Full program, unpacked
cu     Push a unique copy of the keys.
  :I   Indices of the unique elements
    @  Index the values array
     J Join by space
       Implicit output


2

Japt , 8 byte

â £VgUbX

Thông dịch viên Japt

Cảm ơn Shaggy đã lưu 1 byte cuối cùng

Hoàn toàn làm lại logic. Có một số tín hiệu từ câu trả lời của Luis, nhưng tôi nghĩ nó vẫn được cải thiện. Bây giờ lấy đầu vào là hai danh sách , keys, values. Rõ ràng tôi vẫn còn thiếu tối ưu.

Giải trình:

â £         For each unique Key X
     Ub     find the first index in "keys"
       X    which is equal to X
   Vg       then take the "value" with the same index

12 byte . Bạn có thể lưu một vài byte bằng cách lấy các khóa & giá trị làm đầu vào riêng biệt.
Xù xì

Có một giải pháp 8 byte nếu bạn muốn thử.
Xù xì

Các ¥không cần thiết;)
Shaggy

@Shaggy Thật vậy! Tôi đã tự hỏi sự khác biệt giữa sự quá tải blà gì, không hề nhận thấy rằng chỉ một trong số họ có chức năng.
Kamil Drakari

Và đó là 8 giải pháp tôi có trong đầu, được thực hiện một cách độc đáo. Ngoài ra, bạn có thể đảo ngược các đầu vào và nó vẫn sẽ là 8 byte : Vâ £gVbX.
Xù xì


1

05AB1E , 4 byte

DÙkè

Lấy hai danh sách đầu vào: đầu tiên là các giá trị, sau đó là các phím.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

D        # Duplicate the values-list
 Ù       # Get all unique items of the values-list
         #  i.e. [0,0,1,0,2] → ['0','1','2']
  k      # Get all (first) indices of these unique values
         #  i.e. [0,0,1,0,2] and ['0','1','2'] → [0,2,4]
   è     # And use this index to get the key from the keys-list
         #  i.e. [0,2,4] and [4,4,9,5,4] → [4,9,4]

1

Java 8, 82 byte

Một lambda từ một dòng các int[]cặp đến java.util.Collection<Integer>.

m->m.collect(java.util.stream.Collectors.toMap(a->a[1],a->a[0],(a,b)->a)).values()

Dùng thử trực tuyến


1

Julia 0,6 , 36 34 32 byte

A->values(Dict(y=>x for(x,y)=A))

Hãy thử trực tuyến!

(đã loại bỏ hai byte nhờ @JonathanFrech)
(hai byte khác bằng cách thay thế bằng =cách hiểu)

Định dạng đầu vào được chỉ định trong câu hỏi [[1, 2], [2, 7]]hoạt động như ở Julia như một mảng các mảng chứa các cặp giá trị khóa (tiềm năng), điều duy nhất cần quan tâm là khóa đứng thứ hai và giá trị trước.


Thay đổi nhẹ, cho cùng một bytecount,

A->values(Dict((y,x)for(x,y)∈A))

Hãy thử trực tuyến!


Chào mừng đến với PPCG! Tôi không quen thuộc với Julia, nhưng dường như với tôi bạn có thể loại bỏ hai byte bằng cách xóa cả hai dấu ngoặc vuông.
Jonathan Frech

Cảm ơn bạn. Tôi đã cho rằng các dấu ngoặc luôn cần thiết để hiểu, nhưng dường như chúng là tùy chọn khi chúng được sử dụng làm đối số. Đề nghị tốt, đặc biệt là cho một người dùng không phải Julia! :)
- Phục hồi Monica

1
Tôi giả sử nó là một loại hiểu biết tuple (đến từ Python). Như một mẹo chung, TIO có một trình hướng dẫn sao chép cho phép bạn dễ dàng soạn một bài nộp PPCG (biểu tượng liên kết ở góc trên bên phải, giải quyết các vấn đề như không gian hàng đầu trong bài đăng hiện tại của bạn). Với những sân golf nhỏ như của tôi, điều đó không thực sự cần thiết, nhưng nhìn chung tôi sẽ khuyên bạn nên ghi nhận những cải tiến về golf từ những người dùng khác.
Jonathan Frech

À, tôi chỉ tự hỏi làm thế nào bài nộp của mọi người ở một định dạng thống nhất, liệu có công cụ tự động hóa nào mà tôi không biết. Tôi đang sử dụng biểu tượng liên kết, nhưng lười biếng dừng cuộn tại Markdown và không nhận ra có một cái nào dành riêng cho PPCG. (Và lưu ý về phần tín dụng, sẽ làm.)
- Phục hồi Monica


1

MATL , 9 byte

viiQ(5Mu)

Hãy thử trực tuyến!

Có lẽ là tối ưu, nhưng hey, nó hoạt động!

Sử dụng thực tế là (a) đầu vào được đảm bảo chỉ có số nguyên không âm, (b) MATL mở rộng một mảng bạn cố gắng gán cho một chỉ mục không tồn tại.

v - tạo một mảng trống trong ngăn xếp

i - lấy mảng các giá trị

iQ - lấy mảng các khóa, tăng thêm 1 (vì vậy giá trị tối thiểu là 1, không phải 0, vì lập chỉ mục MATL là dựa trên 1)

( - lập chỉ mục gán - sử dụng mảng các khóa làm chỉ mục và gán giá trị cho các chỉ mục đó (nếu có bất kỳ khóa nào được lặp lại, chỉ còn giá trị cuối cùng ở vị trí đó)

5M - nhận đầu vào cuối cùng của cuộc gọi cuối cùng - đó sẽ là mảng các chỉ số chúng tôi đã sử dụng

u) - lấy một danh sách duy nhất của các chỉ mục, chỉ mục với danh sách đó và để lại kết quả đó (là danh sách các giá trị của các khóa duy nhất) trong ngăn xếp


1

Japt , 24 20 16 8 byte

-4 byte nhờ @Shaggy

Đưa đầu vào là key, values

â £VgUbX

Hãy thử trực tuyến!


Japt , 20 18 byte

r@bY <Z?X:XpVgY}[]

Hãy thử trực tuyến!


1
Một vài mẹo / gợi ý nhanh để giúp bạn chơi gôn hơn nữa: 1Đảo ngược đầu vào, 2Kiểm tra các phím tắt Unicode.
Shaggy

Cảm ơn @Shaggy Tôi vẫn đang đọc tất cả các phương pháp từ các tài liệu và đang cố gắng thích nghi. Tôi sẽ chơi gôn này nhiều hơn trong vài giờ nữa
Luis felipe De jesus Munoz

Có một giải pháp 8 byte nếu bạn muốn thử.
Xù xì

Thay vì m@A?B:C} k¥B, bạn có thể muốn thử k@A} m@C:-)
ETHproductions 7/07/18



0

Perl 6 , 25 byte

{.unique(:as(*[1]))[*;0]}

Thử nó

Mở rộng:

{  # bare block lambda with implicit parameter $_

  .unique(  # find the unique results (implicit method call on $_)

    :as(    # use this code to compare
      *[1]  # the second value (WhateverCode lambda)
    )

  )[        # index into that
    *;      # all in the top level
    0       # only the first value from each
  ]
}

Làm tốt. Tôi luôn bị sốc bởi sự đơn giản của Perl 6.
Jakob

0

C-Sharp, 63 byte

object _(int[][]p)=>p.GroupBy(i=>i[1]).Select(g=>g.First()[0]);

Trả về vô số số nguyên.




0

Perl 6 , 12 byte

{%$_.values}

Hãy thử trực tuyến!

Ép buộc danh sách đã cho vào Hash và sau đó trả về các giá trị. Điều này hoạt động trên cả danh sách các cặp và danh sách key, value, key, value....

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.