zsh, 603 594 566 561 548 440 415 399 378 370 bayt
ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}
Coreutils + 'ya bağlıdır dc.
Çevrimiçi deneyin!
Bu ... bir yolculuktu.
Bu cevap üç bölümden oluşmaktadır. İlk 4 satır, takip eden kodu basitleştirmek için bazı özel durumları ele alır. Sonraki 2 satır ve son satır, esasen aynı şeyi gerçekleştirir, ancak tam olarak biri herhangi bir karakter kaldırmasıyla çalıştırılır. Çoğunlukla tamamlayıcı karakter kümeleriyle yazılmıştır, böylece herhangi bir karakterin en fazla kırılması, diğerinin çalışmaya devam etmesine izin verir.
İlk kısma baktığımızda, ilk önce biz başlarız
- Newline kaldırma
ec\nho \\n
- ile boşluk kaldırma
ca t<<<$'\x20'( exi tdaha sonra çıktının alınmasına neden olacak daha sonra kodun çalıştırılmasını önlemek için)
$kaldırılması ile d$c -e8BC6P( 8BC6= 9226olduğu 36*256 + 10ve 36 ve 10 bayt değerleri $sırasıyla ve satır karakterleri; line 6 büyük yorumda dahil etmek zorunda kalmamak için, ondalık altıgen basamak kullanın)
0ile kaldırma d0c -eKp( varsayılan olarak Kolan ondalık hassasiyetini alır 0)
Bir sonraki bölümde kullanılan tek karakter (ikinci satırın sonundaki çöplerin yanı sıra) $'\01234567v;boşluk ve yeni satırdır . Bunlardan dördü hesaba katılmıştır, böylece kalan ( '\1234567v) son satırda olamaz. Sekizlik kaçışları genişleterek ( $'\123'123 8 değerine sahip ASCII karakterini gösterir ):
zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'
İlk satır, programda kullanılan tüm karakterler arasında dolaşır ve her birini kendi kaynak kodunda arar ( $0çalışmakta olan komut dosyasının dosya adıdır), bulunmayan herhangi bir karakteri yazdırır.
İkinci satır biraz garip görünüyor ve aynı exitgrupta olduğu gibi aynı şeyi yapıyor gibi görünüyor . Bununla birlikte, exitsekizlik olarak kodlama $'\145\170\151\164', içermediği 2veya içermediği ile sonuçlanır 3. Aslında bunu taşınmalara karşı daha az esnek yapmamız gerekiyor . Bunun nedeni, herhangi birinin '\014567vkaldırılması, ilk satırın kırılması, ikinci satırın da kırılması ve kodun geri kalanının çalıştırılmasına izin verilmesidir. Ancak, o da kırmak eğer ihtiyaç 2veya 33 ve 4 satır çalıştırmak böylece kaldırılır. Bu in shoehorning ile gerçekleştirilir :ve ;sırasıyla sekizlik gösteriminde 2 ve 3, bir sahip olan,.
Satır 2'nin sonundaki hurdalık, yazdırılabilir her ASCII karakterinin en az bir kez görünmesini sağlamak için vardır, zira kontrolün her birinden geçerek yapılması gerekir.
Eğer exit(o birinin çıkarılması tarafından bozulan edildi yani birinci bölümde çağrılmadı '\01234567v), biz bu karakterlerin herhangi kullanmadan aynı şeyi başarmak zorunda olduğu ikinci, geçin. Son satır, kod çözülen ilk satıra benzer, ancak birkaç bayttan tasarruf etmek için döngü aralığını daraltabiliriz, çünkü hariç tüm karakterlerin '\01234567vkaplandığını zaten biliyoruz . Aynı zamanda, daha 0# $#önce yorumladı ve çıkarıldıysa 0veya $çıkarıldıysa yabancı çıktı üretmesini önler .