Xuất bài hát bảng chữ cái ŋarâþ crîþ mà không sử dụng (m) bất kỳ chữ cái nào


12

Mục tiêu của bạn là viết một chương trình không có đầu vào và xuất văn bản sau:

ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos.

Nhưng có một nhược điểm: đối với mỗi chữ cái (bất kỳ ký tự nào có danh mục chung bằng Unicode bắt đầu L) trong nguồn của bạn, bạn sẽ bị phạt 20 ký tự! (Để tham khảo, văn bản được in có 81 chữ cái.)

Mã Perl 6 bên dưới có 145 byte và 84 chữ cái, do đó, nó được điểm 1.845:

say "ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos."

Mã dưới đây có 152 byte và 70 chữ cái, do đó, nó được điểm 1,552:

$_="C e N ŋa V o S;
Þ Š R L Ł.
M a P F G T Č;
în J i D Ð.
ar ħo ên ôn ân uħo;
Crþ Tŋ neŋ es nem.
elo cenvos.";s:g/<:Lu>/{$/.lc~'a'}/;.say

Sơ hở tiêu chuẩn bị cấm.

Ban đầu, tôi đã nghĩ đến việc cấm hoàn toàn các chữ cái, nhưng tôi không nghĩ có nhiều ngôn ngữ có thể thực hiện được điều này. Bạn được chào đón để thử.

(ŋarâþ crîþ [aɹa̰θ kɹḭθ] là một trong những conlang của tôi. Tôi muốn viết hoa tên của nó ở đây, nhưng tôi nhận được một eng lớn xấu xí ở đây. Ồ, dù sao thì ngôn ngữ cũng không sử dụng chữ in hoa.

Chỉnh sửa: nhận ra rằng một trong những dòng là sai, nhưng tôi sẽ giữ nó vì đã có câu trả lời. Phiên bản chính xác của dòng thứ ba là ma a fa ga pa ta ča; thay vào đó, bạn có thể chọn tạo văn bản đã sửa.


11
độ phức tạp kolmogorov , nguồn bị hạn chế và ghi điểm đặc biệt là tất cả những thứ có lợi rất nhiều từ việc xem xét cẩn thận trong hộp cát. Hiện tại, có vẻ như cách tiếp cận tốt nhất cho thử thách này là chỉ cần viết ra tất cả các từ mã theo số thập phân sau đó biến chúng thành văn bản có tích hợp, với một số phím tắt để mã hóa tất cả các as - hoặc không, tùy thuộc vào số lượng các chữ cái sẽ mất, bởi vì 20 ký tự là một hình phạt thực sự lớn (mặc dù khi mọi thứ khác được ghi bằng byte, nó không được xác định rõ lắm ...)!
Chuỗi không liên quan

4
Và xem xét việc gọi Unicode, một số quy tắc rõ ràng chi phối các loại tiền mã hóa đặc biệt được sử dụng bởi hầu hết các golflang có thể được yêu cầu (bên cạnh có thể là một liên kết đến một tập lệnh để xác nhận tính điểm).
Chuỗi không liên quan

Câu trả lời:


21

7 , 410 ký tự, 154 byte trong mã hóa 7, 0 chữ cái = điểm 154

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

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

Trong một thách thức không thích sử dụng các chữ cái, ngôn ngữ nào tốt hơn để sử dụng hơn một ngôn ngữ chỉ bao gồm các chữ số?

Đây là một chương trình đầy đủ thoát ra khỏi sự cố, do đó, có đầu ra không liên quan đến thiết bị lỗi chuẩn, nhưng thiết bị xuất chuẩn là chính xác.

Giải trình

Một chương trình 7, trong lần lặp đầu tiên của nó, chỉ cần đẩy một số phần tử vào ngăn xếp (vì trong số 12 lệnh tồn tại trong 7, chỉ có 8 trong số chúng có thể được biểu diễn trong một chương trình nguồn và 8 phần tử này chuyên dùng để viết mã để đẩy các cấu trúc dữ liệu cụ thể vào ngăn xếp). Chương trình này không sử dụng 6lệnh (đây là cách đơn giản nhất để tạo các cấu trúc lồng nhau, nhưng mặt khác có xu hướng không xuất hiện theo nghĩa đen trong chương trình nguồn), do đó, đây chỉ là 7các lệnh xác định cấu trúc; 7đẩy một phần tử rỗng mới để phía trên cùng của ngăn xếp (trong khi 0... 5lệnh chỉ append để phía trên cùng của ngăn xếp). Do đó chúng ta có thể thêm khoảng trắng vào chương trình để hiển thị cấu trúc của nó:

551040105042001444344515102013040042201205040054344 7 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7 7

55102440304030434030421030442030424030455 7 7

33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

Các phần tử gần cuối chương trình được đẩy cuối cùng, do đó, nằm trên đỉnh của ngăn xếp khi bắt đầu lần lặp thứ hai. Trong lần lặp này và tất cả các lần lặp lại trong tương lai, 7 trình thông dịch sẽ tự động tạo một bản sao của đỉnh ngăn xếp và diễn giải nó như một chương trình. Nghĩa đen 41403đẩy (mã không chữ, mã sống) 47463(7 có 12 lệnh nhưng chỉ có 8 lệnh có tên; vì vậy, tôi sử dụng chữ đậm để hiển thị mã và không in đậm để hiển thị nghĩa đen tạo ra mã đó, nghĩa là đó, ví dụ: 4lệnh nối 4vào phần tử ngăn xếp trên cùng). Vì vậy, chương trình chạy trên lần lặp thứ hai là 47463. Đây là những gì nó làm:

47463 
4        Hoán đổi hai phần tử ngăn xếp trên cùng, thêm một phần tử trống vào giữa
  7       Thêm phần tử ngăn xếp trống vào đầu ngăn xếp
   4      Hoán đổi hai phần tử ngăn xếp trên cùng, thêm một phần tử trống vào giữa
    6     Làm việc ra lệnh nào sẽ tạo phần tử ngăn xếp trên cùng;
        nối nó vào phần tử bên dưới (và bật đỉnh cũ của ngăn xếp)
    3    Xuất phần tử ngăn xếp trên cùng, bật phần tử bên dưới

Điều này dễ hiểu hơn nếu chúng ta nhìn vào những gì xảy ra với ngăn xếp:

  • ... d c b một 47463 (mã để chạy: 47463)
  • ... d c b trống một (mã để chạy: )47463 7463
  • ... d c b trống một trống (mã để chạy: )47463 463
  • ... d c b trống rỗng rỗng một (mã để chạy: )47463 63
  • ... d c b trống rỗng " một " (mã để chạy: )47463 3
  • ... d c b trống (mã để chạy: trống )47463

Nói cách khác, chúng tôi lấy đầu ngăn xếp a , tìm ra mã nào có khả năng nhất đã tạo ra nó và xuất mã đó. Trình thông dịch 7 tự động bật các phần tử trống từ đỉnh ngăn xếp ở cuối vòng lặp, vì vậy chúng tôi kết thúc với mặt 47463sau trên đỉnh của ngăn xếp, giống như trong chương trình gốc. Thật dễ dàng để xem điều gì sẽ xảy ra tiếp theo: cuối cùng chúng ta lần lượt lướt qua từng phần tử ngăn xếp, xuất ra tất cả, cho đến khi ngăn xếp tràn ra và chương trình gặp sự cố. Vì vậy, chúng tôi đã cơ bản tạo ra một vòng lặp đầu ra đơn giản mà vẻ tại của chương trình mã nguồn để xác định những gì để đầu ra (chúng tôi không xuất ra các cấu trúc dữ liệu mà là push vào stack bởi chúng tôi 0...5thay vào đó, chúng ta sẽ tạo lại các lệnh đã được sử dụng bằng cách xem xét các cấu trúc nào được tạo và xuất ra các cấu trúc đó). Do đó, phần đầu ra của dữ liệu là 551220304010420030455(mã nguồn tạo ra phần tử ngăn xếp thứ hai từ trên xuống), phần thứ hai là 3341351…114525(mã nguồn tạo ra phần tử ngăn xếp thứ ba từ trên xuống), v.v.

Rõ ràng, mặc dù, những đoạn mã nguồn này không được đầu ra không được mã hóa. 7 chứa một số ngôn ngữ dành riêng cho miền khác nhau để mã hóa đầu ra; một khi ngôn ngữ dành riêng cho tên miền được chọn, ngôn ngữ đó vẫn được sử dụng cho đến khi bị xóa rõ ràng, nhưng nếu chưa có ngôn ngữ nào được chọn, chữ số đầu tiên của mã là đầu ra sẽ xác định ngôn ngữ nào sẽ sử dụng. Trong chương trình này, chỉ có hai ngôn ngữ được sử dụng: 5513.

551khá đơn giản: về cơ bản, đó là mã Baudot / teletype cũ được sử dụng để truyền các chữ cái qua teletypes, dưới dạng một bộ ký tự 5 bit, nhưng được sửa đổi để làm cho tất cả các chữ cái viết thường. Vì vậy, đoạn mã đầu tiên được giải mã như thế này:

551  22 03 04 01 04 20 03 04  55
     c  a  SP e  SP n  a  SP  reset output format

Có thể thấy, chúng ta ghép từng ký tự thành hai chữ số bát phân, đây là một tỷ lệ nén khá tốt. Các cặp chữ số trong phạm vi 0-5 cung cấp cho chúng tôi 36 khả năng, trái ngược với 32 khả năng mà Baudot cần, do đó bốn số còn lại được sử dụng cho các lệnh đặc biệt; trong trường hợp này, 55ở cuối sẽ xóa định dạng đầu ra được ghi nhớ, cho phép chúng tôi sử dụng một định dạng khác cho phần đầu ra tiếp theo mà chúng tôi sản xuất.

3về mặt khái niệm thậm chí đơn giản hơn, nhưng với một twist. Ý tưởng cơ bản là lấy các nhóm gồm ba chữ số (một lần nữa, trong phạm vi 0-5, vì đó là những chữ số mà chúng tôi có thể đảm bảo rằng chúng tôi có thể tạo lại mã nguồn gốc từ đầu ra của nó), diễn giải chúng thành ba chữ số số trong cơ sở 6, và chỉ xuất nó dưới dạng một byte ở dạng nhị phân (do đó cho phép chúng ta xuất các ký tự đa dòng trong đầu ra mong muốn chỉ bằng cách xuất ra nhiều byte). Mặc dù vậy, sự vặn vẹo xuất phát từ thực tế là chỉ có 216 số có ba chữ số (với các số 0 đứng đầu có thể) trong cơ sở 6, nhưng 256 byte có thể. 7 làm tròn số này bằng cách liên kết các số từ 332₆ = 128₁₀ trở lên đến hai byte khác nhau; 332có thể xuất ra byte 128 hoặc 192, 333hoặc byte 129 hoặc 193, v.v., lên đến 515byte đầu ra là byte 191 hoặc 255.

Làm thế nào để chương trình biết cái nào trong hai khả năng xuất ra? Bạn có thể sử dụng bộ ba chữ số 520trở lên để kiểm soát điều này một cách rõ ràng, nhưng trong chương trình này, chúng tôi không phải: 7 mặc định là chọn tất cả các byte mơ hồ theo cách sao cho đầu ra là UTF-8 hợp lệ! Hóa ra là luôn có nhiều nhất một cách để làm điều này, miễn là chúng tôi muốn UTF-8 (và chúng tôi làm trong trường hợp này), chúng tôi chỉ có thể để nó mơ hồ và chương trình vẫn hoạt động.

Phần cuối của mỗi 3…phần là 525, đặt lại định dạng đầu ra, cho phép chúng ta quay lại 551phần tiếp theo.


Đây là 410 byte + 0 chữ cái trong biểu diễn được giải nén hoặc 154 byte + rất nhiều chữ cái trong biểu diễn được đóng gói. Đếm các byte trong một và các chữ cái trong một cái khác có vẻ gian lận.
Grimmy

1
@Grimy: Bạn đang nhầm lẫn byte với các ký tự. Biểu diễn được đóng gói bao gồm 154 byte trong mã hóa của 7 mã hóa 410 chữ số bát phân, mỗi chữ số là một chữ số không phải là một chữ cái. Lý luận của bạn ngụ ý rằng, giả sử, ɓtrong Jelly không phải là một chữ cái (bởi vì mã hóa của nó trong mã hóa của Jelly tương ứng với mã điều khiển "CSI" nếu được hiểu theo một bộ ký tự 8 bit thông thường, thay vì một chữ cái). Giống như Jelly, 7 cũng sử dụng mã hóa tùy chỉnh; nhưng vì 7 không sử dụng chữ cái nên mã hóa không cần mã hóa chữ cái và do đó không thể.
ais523

10

Haskell, 0 chữ cái, 423 byte = điểm 423

(['\10'..]!!)<$>[89,87,22,91,22,100,87,22,321,87,22,108,87,22,101,22,105,87,49,0,244,87,22,343,87,22,104,87,22,98,87,22,312,87,36,0,99,87,22,87,22,102,87,22,92,87,22,93,87,22,106,87,22,259,87,49,0,228,100,22,96,87,22,95,22,90,87,22,230,87,36,0,87,104,22,285,101,22,224,100,22,234,100,22,216,100,22,107,285,101,49,0,89,87,104,244,22,106,87,321,22,100,91,321,22,91,105,22,100,91,99,36,0,91,98,101,22,89,91,100,108,101,105,36]

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


6

Jelly ,  274 260  212 byte + 2 chữ cái =  314 300  252

-48 byte nhờ Nick Kennedy

“19ב+49;7883,8220,8216,7884Ọ“19937801,1169680277365253“38“68112“;107¤+1+\“@“&%"("/%"@%"6%"0"3%$!<%" %"2%"-%"?%#!.%"%"1%")%"*%"4%"=%$!9/",%"+"'%":%#!%2">0"8/";/"7/"5>0$!&%2<"4%@"/(@"(3"/(.#!(-0"&(/603#“_32¤”;";/V

(Sử dụng !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”trong đó Vlà các chữ cái Unicode và được sử dụng một lần mỗi)

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




@NickKennedy Tôi đã chơi xung quanh với việc đánh số, nhưng không lùi bước và tìm cách bù đắp cho các chức vụ, thứ tốt - cảm ơn!
Jonathan Allan

3

PowerShell , điểm số 601 546

-join(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14|%{[char]($_+32)})

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

Cách tiếp cận ngây thơ; Tôi chỉ lấy các điểm mã và chuyển đổi chúng thành số thập phân, trừ 32, sau đó mã này xử lý chúng như chartrước khi đưa -joinnó trở lại thành một chuỗi.




3

Jelly , 321 byte + 2 chữ cái = điểm 361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

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

Điều này thật gớm ghiếc và ai đó chắc chắn có thể làm tốt hơn.

Xác nhận điểm số .


1
thực sự ít tệ hơn dường như
ASCII - chỉ

2

Python 3 , 380 byte + 5 chữ cái = 480

print("""\143\141 \145 \156\141 \513\141 \166\141 \157 \163\141;
\376\141 \541\141 \162\141 \154\141 \502\141.
\155\141 \141 \160\141 \146\141 \147\141 \164\141 \415\141;
\356\156 \152\141 \151 \144\141 \360\141.
\141\162 \447\157 \352\156 \364\156 \342\156 \165\447\157;
\143\141\162\376 \164\141\513 \156\145\513 \145\163 \156\145\155.
\145\154\157 \143\145\156\166\157\163.""")

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


1

Võng mạc , 140 ký tự, 159 byte, 14 chữ cái = điểm 439


%# ' 1# !# 9# 2 6#;¶þ# š# 5# /# ł#.¶0# # 3# (# )# 7# č#;¶î1 ,# + &# ð#.¶#5 ħ2 ê1 ô1 â1 8ħ2;¶%#5þ 7#! 1'! '6 1'0.¶'/2 %'1926.
T`!--/-9`ŋ\`-{

Hãy thử trực tuyến! Chỉnh sửa: Đã lưu 1 chữ cái bằng cách chuyển từ K`dòng mới. Bây giờ cũng hoạt động trong Retina 0.8.2 (nhưng tiêu đề sẽ quá dài).


1

Japt -S , 304 286 byte + 2 1 chữ cái s = 344 306

Chà, đây chỉ là chúa trời!

"3 1
5
14 1
235 1
22 1
15
19 1 -37 -86 158 1
257 1
18 1
12 1
226 1 -50 -86 13 1
1
16 1
6 1
7 1
20 1
173 1 -37 -86 142 14
10 1
9
4 1
144 1 -50 -86 1 18
199 15
138 14
148 14
130 14
21 199 15 -37 -86 3 1 18 158
20 1 235
14 5 235
5 19
14 5 13 -50 -86 5 12 15
3 5 14 22 15 19 -50"·®¸®°d96} ¬

Thử nó


1

PHP -a, 402 byte + 200 hình phạt = 602 điểm

foreach([67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,8,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14] as $i){echo ''.mb_chr($i+32);}

Cảng Câu trả lời Artermis Fowl , và mục nhập codegolf đầu tiên của tôi!

Để tôi ước rằng chr()có thể hỗ trợ UTF-8; thêm 3 byte + 40 ký tự đau!


Chào mừng bạn đến với PPCG :)
Shaggy

1

05AB1E , điểm 209 (189 byte + 20 hình phạt cho 1 chữ cái)

•£?;\:'%¢;.'¡£/':¢?'¢°':¢°#@¢«>#%¡¤;®[¢:¥¢:©¢:¦¢;®¢>#¡£#¨¢#&¢+¢#,¢:§¡¤#¬¢#@¢#)¢#(¢#<¢#¢#/¡£#¯¢#.¢#>¢#±¢#«¡¤#?¢;¢#\¢#°¢#:¢'¢#%•[₅‰`©®_#∞158+902201401301670804020409010150250102709022¾¡.¥>:ç?

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

Bức thư duy nhất là ç. Các ký hiệu tiền tệ €£¢không được coi là chữ cái trong Unicode.


0

Python 3 , 397 byte + 19 chữ cái = 777 điểm

print(''.join(chr(i+32)for i in[67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14]))

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

Câu trả lời của cảng admBorkBork .




562 , -2 nếu sử dụng python 2
ASCII-only

TIO không làm việc tại tổ chức của tôi, vì vậy tôi sẽ phải đợi để về nhà để thêm chúng.
Artemis vẫn không tin SE

0

R , 384 byte + 12 chữ cái * 20 điểm = 684 điểm

Không khủng khiếp ban đầu.

cat(intToUtf8(c(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14)+32))

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


0

05AB1E , điểm 383 365 (325 byte + 2 chữ cái * 20 hình phạt)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

Cổng câu trả lời Jelly của @HyperNeutrino .

Sẽ cố gắng cải thiện ở đây trên. Số chia hết cho một loạt các số , nhưng không ai trong số chúng sẽ lưu bất kỳ byte nào, và các ước số lớn hơn được nén chứa ít nhất 1 chữ cái ..

-18 (+2 byte và -20 hình phạt) nhờ @Grimy , thay thế chữ cái J(tham gia) bằng.«« (giảm bằng cách ghép).

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


1
Jcó thể .««cho -18. Hoặc cho một cách tiếp cận hoàn toàn khác, xem câu trả lời của tôi .
Grimmy

@Grimy Cảm ơn! :) Và câu trả lời tốt đẹp!
Kevin Cruijssen
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.