Marquee ký thư


41

Mỗi ngày bạn đưa ra một từ mới trên một ký hiệu marquee với các chữ cái có thể di chuyển được , chỉ mua các chữ cái bạn cần để viết nó. Bạn sử dụng lại các chữ cái bạn đã mua cho các từ trước đó bất cứ khi nào có thể. Đưa ra các từ bạn muốn viết mỗi ngày theo thứ tự, xuất ra các chữ cái bạn mua mỗi ngày.

Thí dụ

Input:  ['ONE', 'TWO', 'THREE', 'SEVENTEEN']
Output: ['ENO', 'TW', 'EHR', 'EENSV']

Ngày 1: Bạn bắt đầu với không có chữ cái, như vậy để ghi ONE, bạn mua tất cả các chữ của nó E, N, O.
Ngày 2: Ngày hôm sau, bạn muốn đưa lên TWO (gỡ xuống ONE). Bạn đã có một Otừ ONE, vì vậy bạn mua thêm TW.
Ngày 3: Tại thời điểm này, bạn có ENOWT. Để viết THREE, bạn cần EHR. Lưu ý rằng bạn cần mua một thứ hai Engoài cái bạn có.
Ngày 4: Để viết SEVENTEEN, bạn cần Etổng cộng 4 trong số đó bạn đã có hai (không phải ba!), Vì vậy bạn mua thêm hai. Bạn cũng có một Tvà một trong số Nđó, vì vậy bạn mua các chữ cái còn lại : EENSV.

Chúng tôi đã xuất các chữ cái được sắp xếp theo thứ tự abc trong ví dụ này, nhưng bạn có thể xuất chúng theo bất kỳ thứ tự nào.

Dữ liệu vào: Một danh sách không trống các chuỗi ký tự không trống A-Z. Bạn có thể sử dụng chữ thường nếu bạn thích. Danh sách các ký tự là tốt cho chuỗi.

Đầu ra: Xuất hoặc in các chữ cái bổ sung bạn cần mua mỗi ngày. Các chữ cái trong một ngày có thể là đầu ra theo bất kỳ thứ tự nào, nhưng các ngày phải đến theo đúng thứ tự.

Các chữ cái từ mỗi ngày nên được tách ra khỏi các ngày khác để bạn có thể biết ngày kết thúc ở đâu. Một dấu phân cách và / hoặc dấu phân cách hàng đầu là tốt, cả trong vòng một ngày hoặc giữa các ngày. Lưu ý rằng một ngày có thể không có chữ cái nào được mua, nên được phản ánh trong đầu ra (một khoảng trắng hoặc dòng trống là OK, ngay cả cho ngày cuối cùng).

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

['ONE', 'TWO', 'THREE', 'SEVENTEEN']
['ENO', 'TW', 'EHR', 'EENSV']

['ONE', 'TWO', 'ONE', 'THREE']
['ENO', 'TW', '', 'EHR']

['ABC', 'AABC', 'ABBC', 'ABCC', 'AABBCC']
['ABC', 'A', 'B', 'C', '']

['SHORT', 'LOONG', 'LOOOONG', 'LOOOOOOONG', 'SHORT', 'LOOONG']
['HORST', 'GLNO', 'OO', 'OOO', '', '']

Dưới đây là tất cả các đầu vào và đầu ra dưới dạng danh sách riêng biệt:

[['ONE', 'TWO', 'THREE', 'SEVENTEEN'], ['ONE', 'TWO', 'ONE', 'THREE'], ['ABC', 'AABC', 'ABBC', 'ABCC', 'AABBCC'], ['SHORT', 'LOONG', 'LOOOONG', 'LOOOOOOONG', 'SHORT', 'LOOONG']]
[['ENO', 'TW', 'EHR', 'EENSV'], ['ENO', 'TW', '', 'EHR'], ['ABC', 'A', 'B', 'C', ''], ['HORST', 'GLNO', 'OO', 'OOO', '', '']]

Và như các chuỗi được phân tách bằng dấu cách (khoảng trắng ở phần đầu ra có vấn đề):

ONE TWO THREE SEVENTEEN
ONE TWO ONE THREE
ABC AABC ABBC ABCC AABBCC
SHORT LOONG LOOOONG LOOOOOOONG SHORT LOOONG

ENO TW EHR EENSV
ENO TW  EHR
ABC A B C 
HORST GLNO OO OOO  

Bảng xếp hạng


5
Một kịch bản bảng xếp hạng hoang dã đã xuất hiện trong thời đại người dùng: o
Quintec

Chúng ta có thể xuất ra như một mảng các ký tự cần phải mua hơn là một chuỗi gồm tất cả các ký tự không? ví dụ:[['E', 'N', 'O'], ...]
Hạ cấp

Đầu ra SHORTLONGOOOOOcó hợp lệ cho đầu ra cuối cùng không? AKA không sử dụng dấu phân cách?
Bạch tuộc ma thuật Urn

@Downgoat Có, danh sách ký tự là tốt để đầu ra.
xnor

@MagicOctopusUrn Không, bạn cần phân cách, nếu không bạn không thể biết chữ cái nào cho ngày nào.
xnor

Câu trả lời:


10

Haskell, 54 49 byte

import Data.List
g x=zipWith(\\)x$scanl(++)""$g x

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

Chúng tôi xây dựng danh sách đầu ra bằng cách tính toán cặp đôi chênh lệch danh sách ( \\) của danh sách đầu vào và phần bổ sung tích lũy của danh sách đầu ra (bắt đầu bằng "").

input list:                ONE       TWO       THREE        SEVENTEEN
cumulative append:         ""   +->  ONE  +->  ONETW   +->  ONETWHRE
list difference (output):  ONE -+    TW  -+    HRE    -+    SVEEN

Với cả hai Data.ListData.Functiontrong phạm vi (ví dụ: bằng cách sử dụng môi trường lambdabot), điều này có thể rút ngắn xuống còn 30 byte:

fix.(.scanl(++)"").zipWith(\\)

Chỉnh sửa: -5 byte nhờ @Sriotchilism O'Z cổ.



10

Python 2 , 72 68 byte

-4 byte nhờ Jonathan Allan.

p=''
for r in input():
 for x in p:r=r.replace(x,'',1)
 print r;p+=r

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

Đã bình luận

l=input()       # the list of words to write
p=''            # p contains all letters we own
for r in l:     # for each word ...
  for x in p:   # for each letter we own ...
    r=r.replace(x,'',1)   # remove one occurence from the current word
  print r       # print the remaining word
  p+=r          # add the remaining chars to p

3
for r in input():tiết kiệm 4 byte.
Jonathan Allan


7

Perl 6 , 44 byte

{$!=@;.map:{kxxv $!=.comb.Bag∖($⊎=$!):}}

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

Đầu ra như một danh sách các danh sách các ký tự.

Giải trình

{                                      } # Anonymous codeblock
 $!=@;                                   # Initialise $! to an empty list
      .map:{                          }  # Map each item in the input to
                    .comb                # The string split to characters
                         .Bag            # In a Bag
                                        # Set minus
                              ($⊎=$!)    # The accumulated Bag of results
                 $!=                     # And save the result for the next item
            kxxv                     : # Then decompose the Bag into a list

2
Một lý do cho downvote sẽ được đánh giá cao
Jo King

Không phải downvoter, nhưng tôi sẽ nói định dạng đầu ra này đi quá xa. Một cái gì đó giống như Bag(E(2), N, S, V)cần phải thực sự hiển thị hai E là OK.
xnor

3
Những gì thực sự? Đó chỉ là định dạng in mặc định. Kết quả trả về là một danh sách không có thứ tự chứa các ký tự đó (và có thể chứa nhiều ký tự giống nhau). Tôi sẽ cập nhật định dạng đầu ra để phản ánh tốt hơn điều này, nhưng downvote có vẻ vô lý.
Jo King

Downvoter, bạn có thể vui lòng giải thích, đây là về I / O hay cái gì khác? Về định dạng túi, tôi không biết Perl, đây có phải là phổ biến cho I / O trong golf Perl không? Nhìn vào các tài liệu (được lưu trong bộ nhớ cache vì trang web bị sập), chúng dường như giống với các số liệu hơn, giống với Python collections.Countermà tôi không có ý định cho phép làm đầu ra. Người ta có thể dễ dàng lặp đi lặp lại trên túi elts với bội số, chuyển thành một danh sách / mảng, hiển thị với bội số, vv?
xnor

3
Downvote là một sai lầm, có nghĩa là phải lên.
Jonathan Allan

7

Haskell , 44 byte

import Data.List
foldl1(\a x->a++',':(x\\a))

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

Đầu ra là một chuỗi như ONE,TW,HRE,SVEENvới dấu phẩy giữa các ngày.


1
Thật là một cách sử dụng tốt định dạng đầu ra để tránh cần phải gấp \`. And an unexpected trường hợp cơ sở Foldl1`.
xnor

7

JavaScript (Node.js) , 59 byte

a=>a.map(h=>([...t].map(c=>h=h.replace(c,'')),t+=h,h),t='')

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

Giải pháp khá đơn giản. Đối với mỗi từ h, loại bỏ các chữ cái chúng tôi đã có.

Đây là một phiên bản được giải thích của mã đó:

f = list => {
  // the string that accumulates all the letters already bought
  let accu = '';
  // for every word in the list
  return list.map( word => {
    // for every letter already bought 
    [...accu]
      // remove the letter from the word
      .map(char => {
        return word = word.replace(char,'')
      });
    // add not bought letters to accumulator
    accu += word;
    // the reduced word (without already bought letters) should be added to result map
    // this represents the letters to buy today
    return word
  }, accu)
}

console.log(f(['ONE', 'TWO', 'THREE', 'SEVENTEEN']))
console.log(f(['ONE', 'TWO', 'ONE', 'THREE']))
console.log(f(['ABC', 'AABC', 'ABBC', 'ABCC', 'AABBCC']))
console.log(f(['SHORT', 'LOONG', 'LOOOONG', 'LOOOOOOONG', 'SHORT', 'LOOONG']))


Bạn có thể tiết kiệm 1 byte bằng cách mượn thủ thuật đáng giá duy nhất từ ​​giải pháp quá phức tạp của tôi.
Arnauld

5

J , 29 byte

-29 byte nhờ FrownyFrog!

(],a.<@#~0>.-&(1#.a.=/;))/@|.

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

Bài gốc

J , 58 byte

[:}.@>[:(],<@(/:~@({.@>@-.&(((e.<@#[){:)\));))&.>/<@a:,~|.

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

Cảm ơn ngn vì đã giúp cải thiện "trừ các chữ cái trong khi tôn trọng phần lặp lại".

Không phải là một phù hợp tuyệt vời cho J, nhưng một bài tập chiếu sáng.

Chúng ta hãy bắt đầu bằng cách xây dựng một động từ trợ giúp wo("không có") để loại bỏ tất cả các ký tự trong một chuỗi từ một chuỗi khác, trong khi tôn trọng sự lặp lại.

wo=.{.@>@-.&(((e. <@# [) {:)\)

Có một ý tưởng thú vị ở đây: Chúng tôi làm cho mỗi trường hợp lặp lại của một ký tự là duy nhất, bằng cách lặp lại số lần cần thiết. Vì vậy, nếu chuỗi ban đầu của chúng tôi là ABBAnó trở thành:

┌─┬─┬──┬──┐
│A│B│BB│AA│
└─┴─┴──┴──┘

Một phần ba Asẽ trở thành AAAvà như vậy. Điều này được thực hiện bằng cụm từ ((e. <@# [) {:)\, lấy từng tiền tố \, xem xét phần tử cuối cùng {:của nó và xây dựng mặt nạ của tất cả các phần tử trong tiền tố đó khớp với e.phần tử cuối cùng đó, sau đó lọc và đóng hộp các phần tử đó <@#.

Với đầu vào của chúng tôi, cả hai "ified ified", giờ đây chúng tôi có thể sử dụng một cách an toàn trừ đi bộ bình thường -. trong khi vẫn tôn trọng sự lặp lại.

Sau đó, chúng tôi mở từng kết quả và chỉ lấy phần tử đầu tiên để "hoàn tác" các lần lặp lại của chúng tôi: {.@>

Cắm động từ trợ giúp này vào, giải pháp tổng thể của chúng tôi (chỉ đơn giản là nội tuyến nó) trở thành:

[: }.@> [: (] , <@(/:~@wo ;))&.>/ <@a: ,~ |.

Về cơ bản, tất cả những gì chúng tôi làm ở đây là thiết lập vấn đề của chúng tôi dưới dạng giảm một lần duy nhất. Chúng tôi bắt đầu đảo ngược đầu vào |.và nối thêm vào hộp ,~ace a:hoặc ô trống, đây sẽ là giá trị ban đầu của kết quả cuối cùng của chúng tôi, như vậy:

┌─────────┬─────┬───┬───┬──┐
│SEVENTEEN│THREE│TWO│ONE│┌┐│
│         │     │   │   ││││
│         │     │   │   │└┘│
└─────────┴─────┴───┴───┴──┘

Chúng tôi dán động từ sau giữa mỗi thành phần để thực hiện giảm:

(] , <@(/:~@wo ;))/

Điều này cho biết: lấy đầu vào bên phải ](nghĩa là kết quả của chúng tôi) và nối với , đầu vào bên trái (đây là ONElần lặp đầu tiên, TWOvào ngày 2, v.v.) mà không bị woloại ;bỏ đầu vào bên phải (nghĩa là không có bất kỳ chữ cái nào trước đó được sử dụng), nhưng trước khi nối thêm sắp xếp nó /:~và đóng hộp lại <@.

Cuối cùng, chúng ta sẽ có kết quả mà chúng ta muốn, một danh sách các hộp, nhưng tất cả bên trong một hộp bổ sung lớn, và vẫn còn hộp trống ở phía trước. Vì vậy, chúng tôi mở để loại bỏ hộp bên ngoài và giết phần tử đầu tiên : }.@>.


[:}.@>|.(],a.<@#~0>.-&(1#.a.=/;))&.>/@,<@a:
FrownyFrog

Một đơn giản (],a.<@#~0>.-&(1#.a.=/;))/@|.cũng hoạt động trừ khi tôi thiếu một trường hợp cạnh.
FrownyFrog

Theo như tôi có thể nói, sắp xếp không có trong các yêu cầu.
FrownyFrog

2
Đã cập nhật và bây giờ tôi đã có thời gian để tiếp thu nó, chỉ muốn nói lại: Thật tuyệt vời J!
Giô-na

4

JavaScript (ES6),  66  65 byte

a=>a.map(b=s=>[...s].filter(c=>x==(x=x.replace(c))?b+=c:0,x=b+0))

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

Đã bình luận

bbxcxb

a =>                      // a[] = input
  a.map(b =               // initialize b to the callback function of this map()
                          // it will be coerced to a string that does not contain
                          // any letter in uppercase
    s =>                  // for each entry s in a[]:
    [...s].filter(c =>    //   for each character c in s:
      x == (              //     check whether x is changed when
        x = x.replace(c)  //     c is replaced with 'undefined'
      ) ?                 //     if so:
        b += c            //       append c to b and keep c
      :                   //     else:
        0,                //       discard c
      x = b + 0           //     coerce b to a string and save it in x
    )                     //   end of filter()
  )                       // end of map()

4

C ++ (gcc) , 177 170 byte

-5 byte nhờ vào mẹo của @ anatolyg, -2 byte cho những điều nhỏ nhặt mà tôi nhận thấy.

#import<random>
#define v std::vector<std::string>
v a(v p){std::vector<int>o(91),b;int j=-1;for(auto i:p){b=o;p[++j]="";for(int c:i)--b[c]<0?p[j]+=c,++o[c]:0;}return p;}

Giải trình

#import<random>thêm cả hai <string><vector>cho một nửa byte.

Đầu tiên tạo ra một vectơ 91 phần tử bằng 0 (chỉ các chỉ số 65-90 được sử dụng để lưu trữ các lần xuất hiện của chữ cái) và một vectơ khác cùng loại nhưng không được đặt thành giá trị. Lặp lại qua từng yếu tố của đầu vào (ngày): nhận các chữ cái hiện đang sở hữu, nhận các chữ cái cần thiết trong ngày, ghi đè đầu vào tại chỉ mục với số lượng cần thiết và cập nhật các chữ cái sở hữu. Trả về đầu vào bị ghi đè.

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


Bạn có thể làm #define v std::vector<std::stringvà loại bỏ using namespace stdđể giảm số lượng byte xuống 6 byte.
anatolyg

2

C # (Trình biên dịch tương tác Visual C #) , 123 byte

a=>{var b="";for(dynamic i=0,e,f;i<a.Count;b+=a[i++]=f)foreach(var c in((e,f)=(b.ToList(),"")).f+a[i])f+=e.Remove(c)?"":c;}

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

Hàm ẩn danh xuất ra bằng cách sửa đổi một mảng đầu vào.

// a: input array of strings
a=>{
  // b: cumulative letters
  var b="";
  for(
    // i: loop index of string
    // e: copy of cumulative letters for manipulation
    // f: characters missing from current string
    dynamic i=0,e,f;
    // iterate over each string in a
    i<a.Count;
    // add missing letters of the day to
    // cumulative missing letters and
    // update array for output
    b+=a[i++]=f
  )
    // iterate current string with character c
    foreach(var c in
      // tuplized variable assignment
      // e=b.ToList()
      //   set e to a copy of the cumulative letters
      // f=""
      //   initially there are no letters needed for the day
      ((e,f)=
      (b.ToList(),"")).f+a[i]
    )
      // conditionally add c to missing letters for the day
      f+=e.Remove(c)?"":c;
}

2

R, 119 112 106 103 byte

-7 byte từ bí danh hai tên hàm dài hơn và hiện lấy đầu vào của người dùng từ scan()
-6 byte để chỉ gọi strsplit()một lần ở đầu
-3 byte để loại bỏ bí danh một lần nữa và gán hai biến trong một cuộc gọi

(Cũng đã chỉnh sửa số byte bị lỗi thấp trước đó)

a=scan(,'');b=a=strsplit(a,'');for(i in 2:length(a))b[[i]]=vecsets::vsetdiff(a[[i]],unlist(b[1:i-1]));b

Đây là lần nộp PPCG đầu tiên của tôi dưới mọi hình thức! Vì vậy, tôi không biết tôi đang làm gì cả về mặt golf và về mặt đăng tải nghi thức. Đầu ra là một danh sách các vectơ có thể hoặc không thể đáp ứng các điều khoản của thử thách. :-P

Đối với bản thân mã, nó đưa đầu vào của người dùng thông qua scan()và so sánh các chữ cái của ngày mới với các chữ cái được sở hữu tích lũy, như trong các giải pháp khác. Nếu có các lựa chọn thay thế ngắn hơn unliststrsplitđể chuyển đổi chuỗi thành vectơ của các ký tự riêng lẻ sẽ rất tuyệt để biết. Tôi cũng đã sử dụng vsetdiffchức năng trong vecsetsgói của Carl Withoft để có được sự khác biệt đã đặt của các chữ cái cần thiết cho ngày hôm sau và các chữ cái hiện có.


1
không, nó hoàn toàn ổn Bản thân tôi hơi lưỡng lự khi sử dụng các gói bên ngoài, nhưng đó chỉ là tôi ... Tôi thích tiếp cận các thách thức trong mã R cơ sở;)
digEmAll






2

Japt , 15 14 byte

£Q®X=rZPPÃQ±XX

Thử nó

£Q®X=rZPPÃQ±XX     :Implicit input of array
£                  :Map each X
 Q®                :  Map each Z in Q (initially a quotation mark)
   X=              :    Reassign to X
     rZ            :    Replace Z with
       P           :    The empty string
        P          :    With the default global flag disabled
         Ã         :  End map
          Q±X      :  Append X to Q
             X     :  Return X

1
@Downvoter, xin vui lòng để lại bình luận.
Shaggy


1

PowerShell , 71 byte

$args|%{$w=$_;$p|% t*y|%{$w=$w-replace"^(.*?)$_(.*)",'$1$2'};$w;$p+=$w}

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

Có các từ đầu vào $argsvà lặp đi lặp lại trên chúng. Mỗi lần lặp, chúng tôi đặt từ hiện tại $w, sau đó lặp qua $pool các chữ cái đã mua. Mỗi vòng lặp bên trong, chúng tôi thực hiện một biểu thức chính thức -replacetrên lệnh hiện tại của chúng tôi $wđể chúng tôi chỉ thay thế phiên bản đầu tiên của chữ cái từ $pool của chúng tôi . Khi chúng tôi đã duyệt qua tất cả các chữ cái trong nhóm, chúng tôi sẽ xuất những gì còn lại $w(nghĩa là những gì chúng tôi cần mua), và sau đó giải quyết những chữ cái đó vào nhóm của chúng tôi $p+=$wcho từ tiếp theo.


1

VBA Excel, 127 byte

Function z(w)
z=""
For Each x In w.Cells
v=x.value
For y=1To Len(z)
v=Replace(v,Mid(z,y,1),"",1,1)
Next
z=z&v
Next
End Function

Đưa đầu vào dưới dạng một phạm vi excel.


1

C (gcc) , 118 byte

m(a,r,q,u)char**a,*r,*q,*u;{for(;*a;a++,memcpy(r,q,255))for(memcpy(q,r,255),u=*a;*u;u++)*u=r[*u]-->0?32:(q[*u]++,*u);}

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

Như một phần thưởng nhỏ, nó đưa cổ phiếu vào rlúc bắt đầu như một mảng. Xuất ra danh sách chuỗi kết thúc null kết thúc null avới tất cả các chữ cái sở hữu trước được thay thế bằng khoảng trắng.




1

Swift 4.2 / Xcode 10.2 , 244 242 239 238 byte

a.reduce(([Character:Int](),[String]())){c,l in let b=l.reduce(into:[Character:Int]()){$0[$1,default:0]+=1}.map{($0,max(0,$1-(c.0[$0] ?? 0)))};return(c.0.merging(b){$0+$1},c.1+[b.map{String(Array(repeating:$0.0,count:$0.1))}.joined()])}.1

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

Các chữ cái không được sắp xếp theo thứ tự bảng chữ cái, nó không bị cấm bởi các quy tắc.


1

Scala, 68 byte

(c:Seq[String])=>c./:(Seq(""))((a,n)=>a:+n.diff(a./:("")(_+_))).tail

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

/: là viết tắt của toán tử FoldLeft, a là tổng hợp, cuối cùng trả về kết quả mà chúng ta muốn, n là phần tử tiếp theo

Không chơi gôn

def NewLettersPerDay(c: Seq[String]): Seq[String] = {
    c.foldLeft(Seq(""))((agg, next) => {
      val existingLetters = agg.reduce(_+_)
      val newDayLetters = next.diff(existingLetters)
      agg :+ newDayLetters
    }).tail
}


0

Than , 18 byte

EθΦι¬⊙…θκ‹№…ιμλ№νλ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

 θ                  Input array
E                   Map over strings
   ι                Current string
  Φ                 Map over characters
       θ            Input array
      …             Truncated to length
        κ           Outer index
    ¬               Logical Not
     ⊙              Any element exists where
          №         Count of
              λ     Current letter in
            ι       Outermost word
           …        Truncated to
             μ      Current letter index
         ‹          Is less than
               №    Count of
                 λ  Current letter in
                ν   Innermost word
                    Implicitly print each day's bought letters on their own line

0

Nhận biết PHP, UTF-8 (253 byte)

<?php $p=[];for($i=1;$i<$argc;$i++){$a=$p;$b=[];for($j=0;$j<mb_strlen($s=$argv[$i]);$j++){$k=1;if(isset($a[$c=mb_substr($s,$j,1)]))if($a[$c]){$k=0;$a[$c]--;}if($k){echo $c;if(isset($b[$c]))$b[$c]+=$k;else $b[$c]=$k;}}$p=array_merge($p,$b);echo PHP_EOL;}

0

C # (Trình biên dịch tương tác Visual C #) , 112 byte

a=>{var b="";for(int i=0;;b+=a[i++])foreach(var z in b)if(a[i].Contains(z))a[i]=a[i].Remove(a[i].IndexOf(z),1);}

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


Hmm ... Điều này ném một ngoại lệ?
dana

@dana Tôi khá chắc chắn các chức năng không trả lại bất cứ thứ gì được phép thoát ra ngoại lệ
Hiện thân của sự thiếu hiểu biết

Thú vị ... Tôi cho rằng đó không phải là quy tắc kỳ lạ nhất.
dana




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.