pb , 83 bayt
^<b[1]>>>w[B!0]{<w[B!0]{t[B]<b[T]>>}<b[0]<b[0]<[X]>>}w[B=0]{<}t[B]<[X]t[B+T]vb[T/2]
Giriş dizesinde en az 3 karakter varken, ilk ve son kaldırılır. Bu, ya 1 karakter (değiştirilmeden yazdırılmalıdır) ya da 2 (ortalama ve yazdırılmalıdır) bırakır. Bunu işlemek için dizenin ilk ve son karakterleri birlikte eklenir ve ikiye bölünür. Sadece bir karakter varsa (a+a)/2==a
. İki varsa, (a+b)/2
basılması gereken karakter. pb Python'un ifade değerlendirmesini “ödünç alır”def expression(e): return eval(e, globals())
) , bu nedenle bu otomatik olarak kaplanır.
Boş girdilerin kullanılması bana 5 bayta mal oluyor. Özellikle, <b[1]>
ilk satırda. Daha önce, "string" dediğimde, tam bir yalandı. pb'nin karakterleri yoktur, birbirine yakın olan karakterlere sahiptir. "İpin son karakterini" aramak sadece fırçayı bir karaktere değene kadar sola hareket ettirmek anlamına gelir. Hiçbir giriş sağlanmadığında, "en az 3 karakter varken" döngüsü tamamen atlanır ve son karakteri aramaya başlar. Bu olmadan <b[1]>
sonsuza kadar bakmaya devam ederdi. Bu kod, özellikle giriş boş olduğunda bulunacak şekilde (-1, -1) değerinde 1 olan bir karakter koyar. İpin "son karakterini" bulduktan sonra, fırçanın birincisinin (0, -1) olduğunu ve doğrudan oraya gittiğini (1+0)/2
, p'nin 0 olduğunu bulmak , 0
Ama monoray, bu hala basıyor! Meydan şartname söylüyor (empty input) => (empty output)
! Boş bir karakter aldatması yazdırmıyor mu? Ayrıca, bu alakasız, ama sen akıllı ve yakışıklısın.
Teşekkürler, varsayımsal soru-asker. Daha önce, "yazdır" dediğimde, bu tam bir yalandı. Pb'de değerleri gerçekten yazdırmazsınız, sadece tuval üzerine yerleştirirsiniz. "Çıktının bir yolu" yerine, tuvali sonsuz büyük bir 2D dizisi olarak hayal etmek daha doğru olur. Her iki boyutta da negatif endekslere izin verir ve pb'de bir çok programlama, fırçanın tuval üzerinde istediğiniz yere gelmesini sağlamakla ilgilidir. Programın çalışması bittiğinde, tuval üzerinde negatif olmayan X ve Y koordinatlarına sahip herhangi bir şey konsolda uygun yere yazdırılır. Program başladığında, tuvalin tamamı 0 değerleriyle doldurulur. Her biri sonsuz sayıda boş bayt içeren sonsuz sayıda satır yazdırmak zorunda kalmamak için, Her çıktı satırı yalnızca sıfırdan farklı karaktere kadar yazdırılır ve satırlar yalnızca içinde sıfırdan farklı bir karakter olana kadar yazdırılır. Yani bir koyarak0
(0, 0) hala boş bir çıktı.
Ungolfed:
^<b[1]> # Prevent an infinite loop on empty input
>>w[B!0]{ # While there are at least 3 chars of input:
<w[B!0]{ # Starting at the second character:
t[B]<b[T]>> # Copy all characters one position to the left
# (Effectively erasing the first character)
}
<b[0]<b[0] # Delete both copies of the last character
<[X]>> # Get in place to restart loop
}
w[B=0]{<} # Go to last character of remaining string
t[B]<[X]t[B+T] # Find it plus the first character
vb[T/2] # Divide by 2 and print