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 t
daha 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
= 9226
olduğu 36*256 + 10
ve 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)
0
ile kaldırma d0c -eKp
( varsayılan olarak K
olan 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ı exit
grupta olduğu gibi aynı şeyi yapıyor gibi görünüyor . Bununla birlikte, exit
sekizlik olarak kodlama $'\145\170\151\164'
, içermediği 2
veya içermediği ile sonuçlanır 3
. Aslında bunu taşınmalara karşı daha az esnek yapmamız gerekiyor . Bunun nedeni, herhangi birinin '\014567v
kaldı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ç 2
veya 3
3 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 '\01234567v
kaplandığını zaten biliyoruz . Aynı zamanda, daha 0# $#
önce yorumladı ve çıkarıldıysa 0
veya $
çıkarıldıysa yabancı çıktı üretmesini önler .