Herhangi bir harf kullanmadan ŋarâþ crîþ alfabe şarkısının çıktısını al (m)


12

Amacınız, herhangi bir girdi almayan ve aşağıdaki metni çıkaran bir program yazmaktır:

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.

Ama bir yakalama var: Lkaynağınızdaki her harf (Unicode'daki genel kategorisi ile başlayan herhangi bir karakter ) için 20 karakter ceza alırsınız! (Referans olarak, yazdırılacak metinde 81 harf vardır.)

Aşağıdaki Perl 6 kodu 145 bayt ve 84 harfe sahiptir, bu nedenle 1.845 puanı alır:

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."

Aşağıdaki kod 152 bayt ve 70 harfe sahiptir, bu nedenle 1.552 puanı alır:

$_="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

Standart boşluklar yasaktır.

Başlangıçta, harfleri tamamen yasaklamayı düşündüm, ancak bunu mümkün kılan birçok dil olduğunu düşünmüyorum. Denemek için hoş geldiniz.

(ŋarâþ crîþ [ˈŋaɹa̰θ kɹḭθ] benim kavramlarımdan biri. Burada ismini büyük harfle yazmak istedim, ama burada çirkin büyük eng aldım. Oh, dil zaten romanizasyonunda büyük harf kullanmıyor.)

Düzenleme: Satırlardan birinin yanlış olduğunu fark ettim, ama zaten cevaplar olduğundan saklayacağım. Üçüncü satırın doğru sürümü ma a fa ga pa ta ča; seçiminize göre, bunun yerine düzeltilmiş metni üretmeyi seçebilirsiniz.


11
kolmogorov-karmaşıklığı , kısıtlı kaynak ve özel puanlama, kum havuzundaki dikkatli değerlendirmeden büyük ölçüde yararlanan her türlü şeydir. Şu anda, bu zorluğa en iyi yaklaşım, tüm kod noktalarını ondalık olarak yazmak ve bunları bir yerleşke ile metne dönüştürmek, tüm as'yi kodlamak için bazı kısayollarla - ya da değil, Harfler, çünkü 20 karakter gerçekten büyük bir penaltıdır (her şey bayt tarafından puanlandığında, iyi tanımlanmamıştır ...)!
İlişkisiz String

4
Unicode'un çağrılması düşünüldüğünde, çoğu golf etiketi tarafından kullanılan özel kod sayfalarını yöneten bazı açık kurallar büyük olasılıkla çağrılır (belki de puanlamayı doğrulamak için bir komut dosyasına bağlantı).
İlişkisiz String

Yanıtlar:


21

7 , 410 karakter, 7 kodlamasında 154 bayt, 0 harf = skor 154

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

Çevrimiçi deneyin!

Harfleri kullanmaktan hoşlanmayan bir meydan okumada, sadece rakamlardan oluşan dilden daha iyi bir dil hangisi?

Bu, çökme yoluyla çıkan tam bir programdır, bu nedenle stderr için harici çıktı vardır, ancak stdout doğrudur.

açıklama

Bir 7 programı, ilk yinelemesinde, yığına birkaç öğeyi iter (çünkü 7'de bulunan 12 komuttan sadece 8 tanesi bir kaynak programında temsil edilebilir ve bu 8 kod yazma konusunda uzmanlaşmıştır belirli veri yapılarını yığına itmek için). Bu program 6komutu kullanmaz (iç içe yapılar oluşturmanın en basit yoludur, ancak aksi halde tam olarak bir kaynak programda görünmeme eğilimindedir), bu nedenle yalnızca 7yapıyı belirleyen komutlar; 7yeni bir boş öğeyi yığının üstüne iter (oysa 05komutları yığının üstüne eklenir). Böylece, yapısını göstermek için programa boşluk ekleyebiliriz:

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7

55102440304030434030421030442030424030455 7

33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

Programın sonuna yakın öğeler en son itilir, bu nedenle ikinci yinelemenin başlangıcında yığının üstündedir. Bu yineleme ve gelecekteki tüm yinelemelerde, 7 yorumlayıcı otomatik olarak yığının üst kısmının bir kopyasını oluşturur ve bunu bir program olarak yorumlar. Değişmez 41403(değişmez, canlı kod) iter 47463(7'nin 12 komutu vardır, ancak bunlardan sadece 8inin adı vardır; bu nedenle, kodu göstermek için kalın ve bu kodu üreten değişmezi göstermek için kalın olmayan kullanın, yani örneğin 4, 4üst yığın öğesine eklenen komuttur ). Yani ikinci yinelemede çalışan program 47463. İşte yaptığı şey:

47463 
4        Üstteki iki yığın öğesini değiştirin, aralarına boş bir öğe ekleyin
  7       Yığının üstüne boş bir yığın öğesi ekleyin
   4      Üst iki yığın öğesini değiştirin, 6 arasına boş bir öğe ekleyin
        Hangi komutların üst yığın öğesini oluşturacağını hesaplayın;
        bunu aşağıdaki öğeye ekleyin (ve yığının eski üst kısmını açın)
    3    Üst yığın elemanını çıktılayın, aşağıdaki elemanı açın

Yığına ne olduğuna bakarsak, bunu anlamak daha kolaydır:

  • ... d c b bir 47463 (çalıştırmak için kod: 47463)
  • ... d c b boş bir (çalıştırmak için kod: )47463 7463
  • ... d c b boş bir boş (çalıştırmak için kod: )47463 463
  • ... d C b boş boş boş a (kod çalıştırmak için: )47463 63
  • ... d c b boş boş " bir " (kod çalıştırmak için: )47463 3
  • D c b boş (çalıştırılacak kod: boş )47463

Başka bir deyişle, a yığınının tepesini alırız , hangi kodun üretme olasılığının yüksek olduğunu araştırırız ve bu kodu çıkarırız. 7 yorumlayıcı, bir yinelemenin sonunda boş öğeleri otomatik olarak yığının üstünden çıkar, bu nedenle 47463orijinal programda olduğu gibi yığının üstündeki arka ile sonuçlanır. Bir sonraki adımın ne olduğunu görmek kolay olmalı: yığın yığınları tükenene ve program çökünceye kadar her yığın öğesinde birbiri ardına çalkalanıyor ve hepsini çıkartıyoruz. Yani temelde ne çıktı belirlemek için programın kaynak koduna bakar basit bir çıktı döngü oluşturduk (biz tarafından yığını itti veri yapıları çıktı değil bizim tarafından 0...5komutların yerine, hangi yapıların oluşturulduğuna bakarak ve bunların çıktılarını alarak hangi komutların kullanıldığını yeniden yaratıyoruz). Bu nedenle, veri çıkışının ilk parçası ( 551220304010420030455üstten ikinci yığın elemanını 3341351…114525üreten kaynak kodu ), ikincisi (üstten üçüncü yığın elemanını üreten kaynak kodu) vb.

Açıkçası, bu kaynak kodu parçaları kodlanmamış olarak üretilmiyor. Şekil 7, çıktıyı kodlamak için birkaç farklı alana özgü dil içerir; alana özgü bir dil seçildikten sonra, açıkça temizlenene kadar kullanımda kalır, ancak henüz dillerden hiçbiri seçilmediyse, çıkan kodun ilk basamağı hangi dillerin kullanılacağını belirler. Bu programda yalnızca iki dil kullanılır: 551ve 3.

551oldukça basittir: temelde, 5 bitlik bir karakter kümesi olarak teletipler üzerinden harfleri iletmek için kullanılan, ancak tüm harfleri küçük yapmak için değiştirilmiş eski Baudot / teletype kodu. Çıktı alınacak ilk kod parçası şöyle çözülür:

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

Görüldüğü gibi, her karakteri iki oktal basamağa sığdırıyoruz, ki bu oldukça iyi bir sıkıştırma oranı. 0-5 aralığındaki basamak çiftleri, Baudot'un ihtiyaç duyduğu 32 olasılıkın aksine bize 36 olasılık verir, bu nedenle geri kalan dört tanesi özel komutlar için kullanılır; bu durumda, 55sonunda, hatırladığımız çıktı formatını temizler ve ürettiğimiz bir sonraki çıktı parçası için farklı bir format kullanmamıza izin verir.

3kavramsal olarak daha basit, ama bir bükülme ile. Temel fikir, üç basamaklı grupları almaktır (yine, 0-5 aralığında, orijinal kaynak kodunu çıktısından yeniden oluşturabileceğimizi garanti edebileceğimiz rakamlar olduğu için), bunları üç basamaklı olarak yorumlamaktır. ve bunu ikili dosyada bir bayt olarak çıktılar (böylece birden çok bayt çıktısıyla istenen çıktıdaki çok baytlı karakterlerin çıktısını almamızı sağlar). Bununla birlikte, bükülme, taban 6'da sadece 216 üç basamaklı sayının (olası önde gelen sıfırlarla), ancak 256 olası bayt olduğu gerçeğinden kaynaklanmaktadır. 7, 332₆ = 128₁₀'den iki farklı bayta sayıları bağlayarak bunu tamamlar; 332bayt 128 veya 192, 333bayt 129 veya 193 vb. çıktı alabilir, buna kadar 515bayt 191 veya 255 çıktı alabilir.

Program iki çıktıdan hangisinin çıktı alabileceğini nasıl bilebilir? Bunu 520açıkça kontrol etmek için yukarıdan üçlülüğü kullanmak mümkündür , ancak bu programda şunları yapmak zorunda değiliz: 7'nin varsayılanı, belirsiz tüm baytları, çıktı geçerli UTF-8 olacak şekilde seçmektir! Bunu yapmak için her zaman en fazla bir yol olduğu ortaya çıkıyor, bu yüzden UTF-8 istediğimiz sürece (ve bu durumda yapıyoruz), bunu belirsiz bırakabiliriz ve program yine de çalışır.

3…Bölümlerin her birinin sonu 525, çıktı biçimini sıfırlayan 551ve bir sonraki bölüme geri dönmemizi sağlayan bölümdür.


Bu, paketlenmemiş sunumdaki 410 bayt + 0 harf veya paketlenmiş sunumdaki 154 bayt + bir sürü harftir. Birindeki baytları, diğerindeki harfleri saymak ucuz görünüyor.
Grimmy

1
@Grimy: Baytları karakterlerle karıştırıyorsunuz. Paketlenmiş gösterim, her biri harf değil, bir rakam olan 410 sekizlik basamağı kodlayan 7'nin kodlamasındaki 154 bayttan oluşur. Akıl yürütmeniz, örneğin ɓJelly'de bir harf olmadığını ima eder (çünkü Jelly'in kodlamasındaki kodlaması, bir harf yerine tipik bir 8 bit karakter kümesinde yorumlanırsa "CSI" kontrol koduna karşılık gelir). Tıpkı Jelly gibi, 7 de özel bir kodlama kullanır; ancak 7 harf kullanmadığından, kodlamanın harfleri kodlaması gerekmez ve bu nedenle de yazamaz.
ais523

10

Haskell, 0 harf, 423 bayt = puan 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]

Çevrimiçi deneyin!


6

Jöle ,  274 260  212 bayt + 2 harf =  314 300  252

Nick Kennedy sayesinde -48 bayt

“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

( Unicode harfleri !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”olan Vve her biri bir kez kullanılan harfler)

Çevrimiçi deneyin!




@NickKennedy Ben sayı golf oynadı, ama geri adım ve sadece ordinals, iyi şeyler dengelemek için bakmadı - teşekkürler!
Jonathan Allan

3

PowerShell puanlar 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)})

Çevrimiçi deneyin!

Saf yaklaşım; Kod noktalarını aldım ve ondalık sayıya dönüştürdüm, çıkartıldım 32, sonra bu kod, bunları tek bir dizgiye tekrar bir araya chargetirmeden önce onları ele alır -join.




3

Jöle , 321 bayt + 2 harf = puan 361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

Çevrimiçi deneyin!

Bu iğrenç ve biri kesinlikle daha iyisini yapabilir.

Skoru doğrulayın .


1
aslında göründüğünden daha az kötü
sadece ASCII

2

Python 3 , 380 bayt + 5 harf = 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.""")

Çevrimiçi deneyin!


1

Retina , 140 karakter, 159 bayt, 14 harf = puan 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`ŋ\`-{

Çevrimiçi deneyin! Düzenle: K`Bir satırsonuna geçerek 1 harf kaydedildi . Şimdi Retina 0.8.2'de de çalışıyor (ancak başlık çok uzun olurdu).


1

Japt -S , 304 286 bayt + 2 1 harfli s = 344 306

Bu sadece tanrý korkunç!

"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} ¬

Dene


1

PHP -a, 402 bayt + 200 ceza = 602 puan

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);}

Port Artermis kümes cevabı ve ilk codegolf girişi!

Beni chr()sadece UTF-8'i destekleyebilecek bir dilek bırakıyor; bu ekstra 3 bayt + 40 karakter acıyor!


PPCG'ye Hoş Geldiniz :)
Shaggy

1

05AB1E , skor 209 (189 bayt + 1 harf için 20 ceza)

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

Çevrimiçi deneyin!

Tek harf ç. Para birimi sembolleri €£¢Unicode'daki harfler olarak kabul edilmez.


0

Python 3 , 397 bayt + 19 harf = 777 puan

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]))

Çevrimiçi deneyin!

Liman AdmBorkBork'un cevabı .




562 , -2 python 2 kullanılıyorsa
sadece ASCII

TIO benim organizasyonumda çalışmıyor, bu yüzden bunları eklemek için eve gelmek için beklemem gerekecek.
Artemis hala SE

0

R , 384 bayt + 12 harf * 20 puan = 684 puan

Çok orijinal değil.

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))

Çevrimiçi deneyin!


0

05AB1E , puanı 383 365 (325 bayt + 2 harf 20 penaltı *)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

Port @HyperNeutrino 'in Jelly cevap .

Burada gelişmeye çalışacağım. Sayı bir grup sayı ile bölünebilir , ancak hiçbiri maalesef bayt tasarrufu yapmaz ve sıkıştırılmış daha büyük bölücüler en az 1 harf içerir.

@Grimy sayesinde -18 (+2 bayt ve -20 ceza) , harfi J(birleştirme) ile değiştirerek (birleştirerek .««azalt).

Çevrimiçi deneyin.


1
J.««-18 için olabilir . Ya da tamamen farklı bir yaklaşım için cevabımı görün .
Grimmy

@Grimy Teşekkürler! :) Ve güzel cevap!
Kevin Cruijssen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.