Uzun bir sayıyı kısaltma


10

Kod golf yaparken uzun sayılarla uğraşırken, kodunuzun uzunluğunu azaltmak zor olabilir, bu nedenle bir numarayı daha kısa ve yönetilmesi için herhangi bir ipucunuz var mı?

Örneğin, aşağıdaki Pyth kodu "Merhaba dünya" yı yazdırır, ancak 44 baytta bu tatmin edici değildir:

Vcjkj85942000775441864767076 2 7=k+kCiN2)k

Peki uzun sayıyı nasıl kısaltırım 85942000775441864767076?

Yanıtlar:


10

Bu soru için mükemmel zamanlama. @isaacg bugün bu sayıları son derece kısaltmayı sağlayan yeni bir özellik ekledi.

Temel teknik, sayıyı taban 256'ya ve karakterlere dönüştürmektir. Bunu kodu kullanarak yapabilirsiniz ++NsCMjQ256N. Ardından, sonuç dizesini Ctam tersini yapan (ile karakterleri int'e dönüştürün ve sonucu temel 256 sayısı olarak yorumlayın) ile birlikte kullanabilirsiniz. Yani 13 karakter olsun: C"2ìÙ½}ü¶d". Karakterlerin bazıları yazdırılamaz.

Ama 13 CHARS dediğime dikkat et, bayt değil. Karakterleri kopyalayıp https://mothereff.in/byte-counter ile sayarsam , 13 karakter ve 18 bayt yazıyor. Bunun nedeni varsayılan olarak UTF-8 olan karakterlerin karakter kodlamasıdır. UTF-8 sadece 2 ^ 7 farklı 1 baytlık karaktere izin verir. Her karakter cile ord(c) > 127aslında ikisini kullanıyor saklanan alır bir yerine bayt.

Ve işte @ isaacg'ın yeni özelliği devreye giriyor. Varsayılan kod formatını UTF-8'den iso-8859-1'e değiştirdi. iso-8859, sadece 1 baytlı 256 karakteri temsil edebilir. Böylece aslında 13 BYTE'ye ulaşabilirsiniz. Bu sadece standart derleyici ile mümkündür, ancak bu çevrimiçi derleyicide çalışmaz.

Öncelikle bu komut dosyasını kullanarak altıgen-değerlere sayı dönüştürmek istiyorum: jdm.[2.Hd"0"jQ256. Bu sana verir 12 32 ec d9 bd 07 7d fc b6 64. Daha sonra bu sayıları bir hex-editor (örn. Linux için hexedit) kullanarak kod dosyanıza kopyalayın.

onaltılı gösteri

Farkına varmak:

  • Açıkça ", dize kodun son parçasıysa, sonunda kaldırın .
  • Bu yalnızca sayıların taban-256 göstergesinde ( 34bayt 22) yoksa çalışır , çünkü bu "karakterdir ve dizeyi sona erdirir. Kaçan olsa da çalışır ( 5C 22).
  • Btw, onaltılık düzenleyici ile bir dosyayı açtığınızda muhtemelen bayt 0Aveya 0d 0asonunda kaldırabileceğiniz bir dosya göreceksiniz . Bu sadece satırın sonunu gösterir.

Çevrimdışı tercümanı makineme koymam gerekecek, ama bu harika, teşekkürler! :)
Beta Çürüğü

1
Dize, değerin null baytını da içeremez 00. Ek olarak \, bayt 5c, sonraki bayta bağlı olarak başka bir `` ile kaçmak zorunda kalabilir veya gerekmeyebilir.
isaacg
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.