Nhận các bước trình tự


17

Thử thách

Đưa ra một chuỗi các số, tạo một hàm trả về các bước của chuỗi.

  • Giả sử một chuỗi sẽ là N >= 3
  • Trình tự sẽ lặp lại các bước ít nhất một lần
  • Chuỗi sẽ chỉ chứa số tự nhiên
  • Chức năng hoặc chương trình của bạn sẽ trả về chuỗi các bước ngắn nhất có thể

Thí dụ:

Đầu vào: [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17]

Đầu ra: [1, 1, 2]

Giải thích: Trình tự ban đầu đi từ 1 => 2 (1 step), 2 => 3 (1 step), 3 => 5 (2 steps). Rồi nó lặp lại. Đầu ra sau đó là[1 step, 1 step, 2 steps] => [1, 1, 2]

Một vi dụ khac:

Đầu vào: [2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]

Đầu ra: [3, 1, 1, 1]

[2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
 \  /\ /\ /\ / 
  3   1  1  1  Then it repeats...

Các trường hợp thử nghiệm

Input: [1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28] => Output: [3,4,1,1]

Input: [6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] => Output: [5,2]

Input: [2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47] => Output: [4,4,3,4]

Input: [5, 6, 7] => Output: [1]


Làm rõ

  • Độ dài đầu vào - 1 chia hết cho chiều dài đầu ra
  • Giả sử trình tự sẽ luôn luôn tăng

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.



6
Tôi đã thấy một vài thử thách mà bạn đã đăng gần đây với rất nhiều bình luận làm rõ và một cặp đôi đóng cửa là "không rõ ràng", và sau đó mở lại sau khi bạn thực hiện các chỉnh sửa phù hợp. Bạn đã xem xét đăng những thứ này trong hộp cát trong vài ngày / một tuần chưa? Tôi rất thích các thử thách của bạn vì chúng khá dễ tiếp cận, nhưng tất cả các thử thách, dù chúng được đăng đơn giản hay do ai đăng, đều có thể sử dụng sàng lọc.
Giuseppe

2
@Giuseppe Cảm ơn lời đề nghị của bạn. Tôi đã đăng một số thử thách khác trong hộp cát (thông thường nếu tôi không có cách đúng để tạo thử thách với nó thì tôi sẽ xóa nó). Đối với những thử thách này, tôi nghĩ rằng chúng đủ rõ ràng và đó là lý do tại sao tôi đăng ngay lập tức nhưng tôi sẽ bắt đầu đăng chúng trong hộp cát trước. Cảm ơn
Luis felipe De jesus Munoz

2
@LuisMendo Dị giáo! 0 là số tự nhiên! Billy Joel thậm chí đã có cả một album dành riêng cho Người đàn ông Peano!
ngm

1
@AdmBorkBork, điều này có liên quan nhiều hơn nhờ vào việc xử lý các danh sách hoạt động có độ dài tùy ý.
Peter Taylor

Câu trả lời:


10

Thạch , 9 7 byte

IsJEƇḢḢ

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

Làm thế nào nó hoạt động

IsJEƇḢḢ  Main link. Argument: A (array)

I        Increment; compute D, the array of A's forward differences.
  J      Indices; yield [1, ..., len(A)].
 s       Split D into chunks of length k, for each k in [1, ..., len(A)].
   EƇ    Comb equal; keep only partitions of identical chunks.
     Ḣ   Head; extract the first matching parititon.
      Ḣ  Head; extract the first chunk.

9

JavaScript (ES6), 58 byte

Xuất ra một chuỗi được phân tách bằng dấu phẩy (có dấu phẩy hàng đầu).

a=>(a.map(p=x=>-(p-(p=x)))+'').match(/N((,\d+)*?)\1*$/)[1]

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

Hoặc 56 byte nếu chúng ta sử dụng ,-làm dấu phân cách và chúng tôi giả sử rằng chuỗi luôn luôn nghiêm ngặt tăng .

Làm sao?

Trước tiên, chúng tôi chuyển đổi mảng đầu vào a [] thành một danh sách các khác biệt liên tiếp với:

a.map(p = x => -(p - (p = x)))

Do p ban đầu được đặt thành giá trị không phải là số (hàm gọi lại của map () ), nên lần lặp đầu tiên mang lại NaN .

Thí dụ:

[6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41]
[ NaN, 5, 2, 5, 2, 5, 2, 5, 2, 5, 2 ]

Sau đó chúng tôi ép kết quả thành một chuỗi:

"NaN,5,2,5,2,5,2,5,2,5,2"

Cuối cùng, chúng tôi tìm mẫu 1 số nguyên ngắn nhất được phân tách bằng dấu phẩy ( ,\d+) bắt đầu ngay sau "NaN" và lặp lại cho đến hết chuỗi:

match(/N((,\d+)*?)\1*$/)

1: sử dụng không tham lam *?


Tôi đang đăng một giải pháp dựa trên cùng một ý tưởng regex, nhưng rất khác nhau trong cách thực hiện. Tất nhiên tôi đã không xem xét các giải pháp khác trước khi phát triển giải pháp của mình và nó có vẻ đủ khác biệt, và có lẽ đó là lần đầu tiên tôi xoay sở để đạt điểm cao hơn bạn ở đây.
edc65

1
53 byte : /(,.+?)\1*$/.
Neil

6

Brachylog , 11 byte

s₂ᶠ-ᵐṅᵐ~j₍t

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

Sẽ là 5 byte nếu có tích hợp cho các khác biệt liên tiếp.

Giải trình

Example input: [6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] 

s₂ᶠ             Find all substrings of length 2: [[6,11],[11,13],…,[34,39],[39,41]]
   -ᵐ           Map subtraction: [-5,-2,-5,-2,-5,-2,-5,-2,-5,-2]
     ṅᵐ         Map negate: [5,2,5,2,5,2,5,2,5,2]
       ~j₍      Anti-juxtapose the list of differences; the shortest repeated list is found
                  first, with the biggest number of repetitions: [5,[5,2]]
            t   Tail: [5,2]

Bạn có thể phủ định sau đuôi, để tiết kiệm một byte?
Rod

@Rod Tôi vẫn sẽ cần ánh xạ nó, vì vậy nó sẽ có cùng độ dài. Phủ định là một vị ngữ giữa hai số, nó không tự động chuyển sang các danh sách như các ngôn ngữ khác (nếu không nó sẽ không hoạt động tốt với các đầu vào / đầu ra không xác định phổ biến trong các chương trình khai báo)
Fatalize

5

Bình thường, 11 byte

<J.+Qf.<IJT

Hãy thử nó ở đây

Giải trình

<J.+Qf.<IJT
 J.+Q          Call the sequence of differences in the input J.
     f         Find the first positive integer T...
      .<IJT    ... where rotating J by T doesn't change it.
<J             Take that many elements of J.

5

Japt , 14 12 byte

äa
¯@eUéX}aÄ

Thử nó


Giải trình

              :Implicit input of array U
äa            :Consecutive absolute differences
\n            :Reassign to U
 @    }aÄ     :Return the first positive integer X that returns true
   UéX        :  Rotate U right X times
  e           :  Check equality with U
¯             :Slice U to that element

Nguyên

äa
@eUîX}a@¯XÄ

Thử nó


5

R , 49 46 byte

Chương trình đầy đủ:

d=diff(scan());while(any((s=d[1:T])-d))T=T+1;s

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

R , 72 58 54 byte

Trình chức năng gốc với tất cả các trường hợp thử nghiệm ở một nơi:

function(a,d=diff(a)){while(any((s=d[1:T])-d))T=T+1;s}

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

Cảm ơn JayCe đã đề xuất lộ trình chương trình đầy đủ và -4 byte trên hàm và Giuseppe để biết thêm -3.



@JayCe cũng không cần a<-ở đây
Giuseppe

4

J , 22 19 byte

3 byte được lưu nhờ FrownyFrog!

0{"1[:~./:|."{}.-}:

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

[Dùng thử trực tuyến!] [TIO-ji2uiwla]

Làm sao?

                 -      find the successive differences by subtracting 
                  }:    the list with last element dropped
               }.       from the list with the first element dropped 
           |."{         rotate the list of differences
         /:             0..length-1 times (the input graded up)
     [:~.               remove duplicating rows
 0{"1                   take the first element of each row

Nếu bạn /:thay vì #\, bạn có thể 0{"1[:~.lưu 1 byte.
FrownyFrog

"0 1"{
FrownyFrog

@FrownyFrog Cảm ơn, một lần nữa!
Galen Ivanov

1
điều này thật tuyệt
Giô-na

@Jonah Vâng, cảm ơn FrownyFrog!
Galen Ivanov

4

05AB1E , 8 byte

Đã lưu 3 byte nhờ Kevin Cruijssen .

¥.œʒË}нн

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


05AB1E , 11 byte

āεI¥ô}ʒË}нн

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

εεI ô} ʒË} н chương trình đầy đủ.
ā Phạm vi chiều dài. Đẩy [1 ... len (inp)].
 ε} Đối với mỗi ...
  Tôi ¥ ô ... Cắt các đồng bằng thành các miếng có kích thước tương ứng
      ʒË} Chỉ giữ lại những phần tử có tất cả các phần tử bằng nhau.
         нн Và đầu tiên lấy phần tử đầu tiên của phần đầu tiên.

13 byte

Một lựa chọn dễ thương, IMO:

¥©ηʒDg®ôÙ˜Q}н

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

¥©ηʒDg®ôÙ˜Q}н   Full program.
¥               Push the deltas.
 ©              Copy them to the register.
  ηʒ       }    And filter the prefixes by...
    D     Q     ... Is the prefix itself equal to...
     g®ô        ... The deltas, split into chunks of its length...
        Ù˜      ... Deduplicated and flattened?
            н   Head.

1
8 byte bằng cách sử dụng.
Kevin Cruijssen

3

Javascript, 49 56 byte

Biên tập 7 byte được lưu cảm ơn (đoán ai?) Arnauld

Cùng một ý tưởng regex như Arnauld, nhưng thật kỳ lạ khi thực hiện ...

Trả lại một chuỗi với các bước được phân tách bằng dấu phẩy (và dấu phẩy hàng đầu)

p=>/N(.+?)\1+$/.exec(p.map(p=v=>[v-p,p=v][0]))[1]

Kiểm tra

var F=
p=>/N(.+?)\1+$/.exec(p.map(p=v=>[v-p,p=v][0]))[1]

;[[1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17]
,[1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28]
,[6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] 
,[2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47]
,[5, 6, 7]]
.forEach(x=>console.log(x + ' -> ' + F(x)))


Sử dụng matchlà một quyết định kém của tôi. Bạn có thể vượt qua tôi một số chi tiết . :-)
Arnauld

3

MATL , 14 13 12 byte

dt5YLFTF#Xu)

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

Chỉ cần phát hiện ra rằng MATL không có chức năng tuần hoàn!

Giải trình

d - Nhận sự khác biệt giữa các điều khoản liên tiếp, như là một mảng

t5YL- sao chép đó, sau đó gọi hàm YL('gallery') với5 tùy chọn ('tuần hoàn'). Tạo một ma trận với vectơ đã cho là hàng đầu tiên, sau đó các hàng liên tiếp là cùng một vectơ được dịch chuyển theo vòng tròn, cho đến khi nó bao quanh.

FTF#Xu- Kiểm tra các hàng duy nhất và nhận số hàng của chúng (không chắc có cách nào ngắn hơn để thực hiện việc này không). Khi các bước tuần tự lặp lại, hàng được dịch chuyển vòng tròn sẽ giống như hàng đầu tiên và các hàng tiếp theo sẽ được lặp lại. Vì vậy, điều này nhận được các chỉ số của bước đầu tiên của chuỗi bước trước khi chúng bắt đầu lặp lại.

) - chỉ mục sử dụng điều đó vào mảng khác biệt ban đầu, để có câu trả lời.


Lớn hơn:

d`tt@YS-a}@:)

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

(-1 byte nhờ Giuseppe)

Giải trình:

d   % Get the differences between successive terms, as an array
`   % Start do-while loop
  tt  % duplicate the difference array twice
  @   % push the current loop index value
  YS  % circularly shift the difference array by that amount
  -   % subtract the shifted diffs from the original diffs
  a   % see if the subtraction resulted in any non-zeros
    % if it did, shifted differences were not equal to original differences, so continue loop 
}@ % if it didn't, then get loop index
:) % get the differences upto the loop index, before they started repeating
   % implicit loop end

2

Python 2 , 101 byte

def f(l):d=[y-x for x,y in zip(l,l[1:])];g=len(l);print[d[:k]for k in range(1,g+1)if g/k*d[:k]==d][0]

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

Đầu tiên tạo ra deltas d , sau đó tìm tiền tố đầu tiên p của d mà khi lặp lại ⌊len (L) / len (p) lần mang lại L , trong đó L là danh sách đầu vào.



2

Java 10, 104 100 byte

a->{var t="";for(int i=a.length;i-->1;t+=a[i]-a[i-1]+" ");return t.replaceAll("( ?.+?)\\1*$","$1");}

Regex ( ?.+?)\1*$cho ngắn lặp đi lặp lại substring từ @Neil bình luận 's trên @Arnauld ' JavaScript (ES6) câu trả lời s .

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

Giải trình:

a->{                        // Method with integer-array parameter and String return-type
  var t="";                 //  Temp-String, starting empty
  for(int i=a.length;i-->1; //  Loop backward over the input-array, skipping the first item
    t+=a[i]-a[i-1]          //   Calculate the difference between two adjacent items
       +" ");               //   And append this with a space to the temp-String
  return t.replaceAll("( ?.+?)\\1*$", 
                            //  Find the shortest repeating substring
                     "$1");}//  And only keep one such substring

1

APL + THẮNG, 39 byte

Nhắc cho đầu vào.

(↑((⍴v)=+/¨(⊂v)=(⍳⍴v)⌽¨⊂v)/⍳⍴v)↑v←-2-/⎕

Hãy thử trực tuyến! Lịch sự của Dyalog Classic

Giải trình:

v←-2-/⎕ Prompt for input and take successive differences

(⍳⍴v)⌽¨⊂v create a nested vector ans sequentially rotate by one to length of v

+/¨(⊂v)= compare to original v and sum positions where there is match

(⍴v)= identify where all elements match

(↑(....) identify number of rotations giving a first complete match

(↑(...)↑v take first number of elements from above from v as repeated sequence

1

Python 2 , 86 85 byte

def f(a,n=1):d=[y-x for x,y in zip(a,a[1:])];return d[:-n]==d[n:]and d[:n]or f(a,n+1)

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

Xây dựng sự khác biệt như d; nếu dlặp lại với kích thước đơn vị nthì d[n:]==d[:-n]; khác tái diễn.


1

Võng mạc 0.8.2 , 42 byte

\d+
$*
(?<=(1+),)\1

1+(.+?)\1*$
$1
1+
$.&

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Đầu ra bao gồm dấu phẩy hàng đầu. Giải trình:

\d+
$*

Chuyển đổi sang unary.

(?<=(1+),)\1

Tính toán sự khác biệt về phía trước, ngoại trừ số đầu tiên, bị bỏ lại phía sau.

1+(.+?)\1*$
$1

Phù hợp lặp lại sự khác biệt.

1+
$.&

Chuyển đổi thành số thập phân.


1

05AB1E , 14 13 byte

¥DηvÐNƒÁ}QD—#

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

Tôi biết đã có hai câu trả lời 05AB1E ngắn hơn được đăng bởi @ Mr.Xcoder , nhưng tôi muốn thử phương pháp thay thế này bằng cách sử dụng kiểm tra xoay vòng và bình đẳng.
Có thể đánh gôn xuống một vài byte mà không làm rơiÁ .

-1 byte sau một mẹo của @Emigna để xóa các thanh ghi global_variable ( ©và 2x ®) và sử dụng một Bản sao ( D) và Triplicate ( Ð) để thay thế.

Giải trình:

¥             # Calculate the deltas of the input-array
              #  i.e. [1,2,3,5,6,7,9] → [1,1,2,1,1,2]
 D            # Duplicate it
  η           # Push all its prefixes
              #  [1,1,2,1,1,2] → [[1],[1,1],[1,1,2],[1,1,2,1],[1,1,2,1,1],[1,1,2,1,1,2]]
v             # For-each over these prefixes
 Ð            #  Triplicate the (duplicated) deltas-list
  NƒÁ}        #  Rotate the deltas-list N+1 amount of times,
              #  where N is the prefix index (== prefix_length-1)
              #   i.e. [1,1,2] and [1,1,2,1,1,2] (rotate 3 times) → [1,1,2,1,1,2]
      Q       #  If the rotated deltas and initial deltas are equal
              #   [1,1,2,1,1,2] and [1,1,2,1,1,2] → 1
       D—#    #  Print the current prefix-list, and stop the for-each loop

1
Đây là số 9 (câu trả lời riêng vì đây là một thuật toán rất khác, mặc dù nó có chung η).
Grimmy

@Grimy Bạn có trải qua tất cả các câu trả lời 05AB1E của tôi và đánh gôn từng câu không, haha? ; p Câu trả lời hay mặc dù (một lần nữa), +1 từ tôi.
Kevin Cruijssen

1
Không phải tất cả trong số họ, tôi chỉ đi qua những người được liên kết trong bài viết này .
Grimmy

@Grimy Ah ok, điều đó có ý nghĩa. :)
Kevin Cruijssen

1

Haskell, 107 byte

let i=map(uncurry(-))$zip(tail x)(init x)in head$filter(\s->take(length i)(concat$repeat s)==i)(tail$inits i)

x là mảng đầu vào.


Chào mừng bạn đến với sân golf PPCG và Haskell nói riêng! Bạn không thể giả sử đầu vào có mặt trong một biến nhất định, mặc dù điều này dễ dàng được sửa bằng cách thêm trước f x=. Ngoài ra việc sử dụng các initsyêu cầu import Data.List, vì nó không phải là một phần của Prelude: Hãy thử trực tuyến!
Laikoni

Tuy nhiên, bạn có thể lưu khá nhiều byte: (init x)có thể là xdo ziptự động cắt bớt nếu một trong các danh sách dài hơn danh sách kia. Và để map(uncurry(-))$ziptồn tại một tích hợp : zipWith(-). Thay vì f x=let i=...inbạn có thể sử dụng một mô hình bảo vệ : f x|i<-...=.
Laikoni

Hơn nữa, bạn có thể sử dụng một sự hiểu biết danh sách thay vì filter, !!0thay vì headcyclethay vì concat$repeat: Hãy thử trực tuyến!
Laikoni

@Laikoni Cảm ơn rất nhiều vì sự cải tiến của bạn! Bạn nói đúng, mã của tôi cần một khai báo hàm và nhập cho Data.List.inits. Nhưng tôi đã tự hỏi, có nên thêm vào độ dài của mã không? Tôi đang hỏi bởi vì một số mẫu mã khác cũng dựa vào một số mã bổ sung.
misja111

Vâng, có sự đồng thuận chung rằng các byte đó được bao gồm trong điểm số. Chúng tôi có một hướng dẫn về các quy tắc chơi gôn ở Haskell bao gồm hầu hết các trường hợp này.
Laikoni

1

Stax , 8 6 byte

░»F\☺»

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

Đây là một phiên bản chú thích được giải nén để hiển thị cách thức hoạt động.

:-  pairwise differences
:(  all leftward rotations of array
u   keep only unique rotations
mh  output the first element from each unique rotation

Chạy cái này


1

Perl 6 , 57 byte

{~(.rotor(2=>-1).map:{.[1]-.[0]})~~/^(.+?){}" $0"+$/;~$0}

Kiểm tra nó

Đầu ra được phân tách không gian ("1 1 2" )

Mở rộng:

{      # bare block lambda with implicit parameter $_

  ~(   # stringify (space separated)

    .rotor( 2 => -1 )     # from the input take 2 backup 1, repeat
    .map: { .[1] - .[0] } # subtract each pair to find the differences
  )

  ~~   # smartmatch

  /    # regex

    ^  # beginning of string

    ( .+? ) # match at least one character, but as few as possible
    {}      # make sure $0 is set (probably a compiler bug)
    " $0"+  # match $0 one or more times (with a leading space)

    $  # end of string
  /;

  ~$0  # return the stringified $0
}

Toàn bộ phần đầu tiên có thể là~(.skip Z-$_)
Jo King

1

05AB1E , 9 byte

¥©η.ΔÞ®Å?

Giải trình:

          # take input implicitly
¥         # deltas, eg [4, 5, 7, 8, 10] -> [1, 2, 1, 2]
 ©        # save this to the global register
  η       # prefixes, eg [1, 2, 1, 2] -> [[1], [1, 2], ...]
   .Δ     # find the first one such that
     Þ    # cycled infinitely, eg [1, 2] -> [1, 2, 1, 2, ...]
       Å? # starts with
      ®   # the global register
          # and implicitly print the found element

9 byte thay thế:

¥η.ΔÞ.¥-Ë

Cùng một thuật toán, nhưng thay vì so sánh với danh sách các vùng đồng bằng (cần được lưu / khôi phục), thì điều này sử dụng (undelta) sau đó so sánh với đầu vào (ẩn).

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


0

K4 , 30 byte

Giải pháp:

(*&d~/:c#'(!c:#d)#\:d)#d:1_-':

Ví dụ:

q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20
3 1 1 1
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17
1 1 2
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28
3 4 1 1
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41
5 2
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47
4 4 3 4
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':5 6 7
,1

Giải trình:

Có vẻ nặng nề cho những gì chúng tôi đang cố gắng giải quyết. Nhận deltas của đầu vào và sau đó xây dựng các chuỗi và xác định chuỗi ngắn nhất phù hợp với nó.

(*&d~/:c#'(!c:#d)#\:d)#d:1_-': / the solution
                           -': / deltas 
                         1_    / drop first
                       d:      / save as d
                      #        / take (#) from
(                    )         / do this together
                 #\:d          / take (#) each-left (\:) from d
          (     )              / do this together
              #d               / count length of d
            c:                 / save as c
           !                   / range 0..c-1
       c#'                     / take c copies of each
   d~/:                        / d equal (~) to each right (/:)
  &                            / where true
 *                             / first one


0

Perl 5 -p , 55 byte

s/\d+ (?=(\d+))/($1-$&).$"/ge;s/\d+$//;s/^(.+?)\1*$/$1/

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

Các số được nhập dưới dạng một danh sách được phân tách bằng dấu cách. Đầu ra là định dạng tương tự.

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.