Tự liệt kê pangram


12

Pangram

Con cáo nâu nhanh nhẹn nhảy qua thân con chó lười.

Đây là một ví dụ về một pangram - một câu có chứa mọi chữ cái của bảng chữ cái ít nhất một lần.

Một pangram tự liệt kê là một câu đáp ứng các tiêu chí để trở thành một pangram bằng cách đưa ra một phân tích về số lượng chữ cái của chính nó.

Một ví dụ để đạt được điều này là câu

Chiếc pangram này chứa bốn As, một B, hai C, một D, ba mươi Es, sáu F, năm Gs, bảy Hs, mười một Is, một J, một K, hai Ls, hai Ms, mười tám Ns, mười lăm Os, hai Ps , một Q, năm R, hai mươi bảy S, mười tám Ts, hai Us, bảy Vs, tám W, hai X, ba Y, và một Z.


Các thách thức

Tạo một hàm với đầu vào là chuỗi dẫn vào kho thư. Trong ví dụ này, đầu vào sẽ là "pangram này chứa". Số lượng của mỗi chữ cái phải ở dạng viết và đóng góp vào số lượng chữ được hiển thị.


Quy tắc

  • Dấu phẩy Oxford là tùy chọn
  • Sử dụng ký hiệu và trước Z (hoặc, đối với chế độ cứng, bao gồm khả năng chuyển đổi giữa "&" và "và" trong chức năng)
  • Mỗi chữ cái được tính vào tổng số chữ cái
  • Không có số không viết
  • Đây là vì vậy đoạn mã ngắn nhất tính bằng byte sẽ thắng
  • Trong hono u r của cặp vợ chồng cuối tuần này, những con số sẽ được viết bằng tiếng Anh của Nữ hoàng. ví dụ: nine hundred and ninety-nine Gs999 lần xuất hiện của chữ G và nine hundred and nine Gscho 909.
  • Các đơn đặt hàng độ lớn sẽ được viết trong quy ước đặt tên quy mô ngắn tiêu chuẩn

Trường hợp cạnh

  • Có một số trường hợp mã sẽ bị kẹt trong một vòng lặp - ví dụ: nếu có hai Os, mã sẽ tăng số đếm lên ba Os, khiến mã này lại đếm hai Os. Nếu tính tất cả các bức thư khác trước khi trở lại này không thể giải quyết vấn đề này, hãy xem xét đầu vào là một khởi động sai và đầu ra false, nullhoặc một chuỗi rỗng.
  • Nếu một chữ cái có hơn 999 lần xuất hiện, đầu vào nên được coi là một khởi đầu sai.

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

  • "Pangram này chứa" nên xuất câu ví dụ

8
Tôi chưa thử nghiệm nó, nhưng tôi khá chắc chắn rằng có một số trường hợp bạn không thể xây dựng một giải pháp hợp lệ, đầu ra phải là gì trong trường hợp đó? Ví dụ: nếu bạn có một chuỗi chứa hai o-s mà không có từ để đếm, thì khi bạn đánh vần nó ra two, toàn bộ chuỗi bây giờ có ba o-s, nghĩa là từ này không chính xác, chuyển đổi nó làm cho nó không chính xác nữa , v.v.
Nit

2
Số bằng văn bản lớn nhất mà giải pháp phải hỗ trợ là gì? Một trăm, một ngàn, một triệu?
Nit

7
Câu hỏi đầu tiên rất hay! Tuy nhiên, cá nhân tôi khuyên bạn nên giới hạn số lượng chữ cái tối đa là 999 hoặc thậm chí chỉ là 99. Điều này sẽ giúp thách thức dễ dàng hơn đối với các ngôn ngữ không có số thập phân được tích hợp trong văn bản, trong khi vẫn giữ được sự thú vị. (Ngoài ra, thậm chí có thể không thể kiểm tra các mục có hàng triệu chữ cái trong một số ngôn ngữ.)
Arnauld


1
Rob enjoys any sentence with two As, two Bs, two Cs, one D, thirty five Es, four Fs, three Gs, nine Hs, eight Is, two Js, one K, two Ls, one M, twenty two Ns, eighteen Os, one P, one Q, nine Rs, twenty three Ss, twenty three Ts, three Us, four Vs, eleven Ws, one X, seven Ys, & one Z.
Chas Brown

Câu trả lời:


6

Python 2 , 615 byte

def g(n):S=str.split;D=S('z one two three four five six seven eight nine');K=' fif six seven eigh nine';n,m=n/100,n%100;e,d=m/10,m%10;return' '.join([D[n],'hundred']*(n>0)+([S('ten eleven twelve thir four'+K)[d]+'teen'*(d>2)]if 9<m<20else[S('twen thir for'+K)[e-2]+'ty']*(e>0)+[D[d]]*(d>0)))
from random import*
X='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def f(p):
 T=set();s='';i=0
 while 1:
	Q=s.upper().count;t=p+' '+', '.join(['& '*(c=='Z')+g(Q(c))+' '+c+'s'*(Q(c)!=1)for c in X])+'.'
        if s==t:return i,t
	if t in T:t=''.join(c*max(1,t.upper().count(c)+(randint(0,6)-3)*(random()<0.25))for c in X)
	T.add(t);s=t;i+=1

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

Hàm flấy plàm tiền tố chuỗi; và trả về một tuple của một số nguyên biểu thị số bước đã thực hiện và chữ ký.

Hàm gmã hóa một số 1<=n<=999thành chuỗi tiếng Anh của nó; nó chiếm tới 29 byte, gần bằng một nửa tổng số byte. Mật mã

Q=s.upper().count
t=p+' '+', '.join(['& '*(c=='Z')+g(Q(c))+' '+c+'s'*(Q(c)!=1)for c in X])+'.'

mã hóa chuỗi sthành một pangram (có khả năng autogram-matic) t.

Chúng tôi lặp lại quá trình, hy vọng cho tình huống mà chúng tôi tìm thấy một tcái đó tlà một chữ ký (nghĩa là, ở đâu t==s). Nếu Khi chúng tôi vào một vòng lặp, chúng tôi sẽ ngẫu nhiên nhích số lượng chữ cái theo cách hoàn toàn đặc biệt.

Đối với hầu hết các giá trị của p, quá trình này sẽ hết thời gian trên TIO. Thông thường, hàng triệu khả năng được kiểm tra trước khi tìm thấy sự kết hợp 'chiến thắng'.

Tôi không có bất kỳ bằng chứng nào cả, nhưng tôi đoán là: (a) ngoài một tìm kiếm vũ lực toàn diện tương tự như những gì người sáng lập Lee Sallows mô tả ở đây và thực hiện trong phần cứng (!), Kiểu heuristic ngẫu nhiên này là về tốt như bạn có thể nhận được; và (b) sẽ không có giải pháp cho nhiều cụm từ ban đầu (hầu hết?) p.


map(chr,range(65,91))lưu một số byte.
ბიმო
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.