Mezura Dizesi


15

Motivasyon : Bazen bir ipte nerede olduğunuzu bilmeniz gerekir. Bir dizenin herhangi bir bölümüne bakabilmek ve tam olarak nerede olduğunuzu olabildiğince bilmek istersiniz.

Zorluk : Belirli bir uzunlukta bir mezura dizesi çıktısı almak için bir program yazın . Bir mezura dizesi kendi uzunluğunu mümkün olduğunca sık tanımlar.

Kurallar :

  1. Bant ölçüm dizesinin toplam uzunluğu için programınızın bir pozitif tamsayı parametresi alması gerekir
  2. Çıktıda, her basamak bitişik dize için, bu rakam doğru şimdiye kadar çıktı uzunluğunu rapor olmalıdır - kapsayıcı !
    1. Uzunluklar, dizenin başlangıcından her sayının sonuna kadar ölçülür
  3. Dizeye mümkün olduğunca fazla uzunluk numarası eklenmelidir
  4. Belirsizlikten kaçının. Ayırıcılar / sınırlayıcılar sayıların yan yana gelmesini önlemek için kullanılabilir, yani 12oniki bir değil iki diyor.
  5. Dize, sonuna kadar toplam uzunluğunu her zaman doğru bir şekilde rapor etmelidir.
  6. Uzunlukları doğru tutmak için birden fazla ayırıcıya ihtiyacınız olabilir, örneğin, burada uzunluk 4'ün örnek bir mezura dizesi: 1--4

Reçetesiz / kapsamlı örnekler:

  • mezura uzunluğu 1 uzunluğu: 1
  • mezura uzunluğu 2 uzunluğu: -2
  • mezura uzunluğu 3 uzunluğu: 1-3
  • 4 uzunluğunda şerit metre dizesi: 1--4veya -2-4(her ikisi de olabildiğince sık, yani iki kez rapor edin ve doğru toplam uzunlukla bitirin)
  • mezura uzunluğu 10 uzunluğu: 1-3-5-7-10
  • şerit ölçü dizesi 11: 1-3-5-7--11veya 1-3-5--8-11veya 1-3--6-8-11veya 1--4-6-8-11veya -2-4-6-8-11(hepsi mümkün olduğunca çok uzunluk numarasına sahiptir ve toplam dize uzunluğu ile bitirir)

Dizedeki her hane başka bir rakama bitişik değildir, dize tamamen tirelardan oluşur ve dizede -olabildiğince çok uzunluk işaretine sahip olmanız gerekir?
Rɪᴋᴇʀ

0 tabanlı indeksleme kullanabilir miyiz?
Rɪᴋᴇʀ

@EasterlyIrk Kural 3, dizeye sığması gereken en fazla sayıdır.
Post Rock Garf Hunter


@EasterlyIrk motivasyona uymayan ve kural 3 ve 5'i ihlal etmediği için tüm tire işaretlerine sahip olamazsınız. Endeksleme yoktur. Sadece uzunluklar. Yani hayır, bir uzunluktaki bir mezura dizisi olamaz 0.
Tom Viner

Yanıtlar:


12

Python, 50 48 47 46 bayt

f=lambda x:x*"1"if x<2else f(x-len(`-x`))+`-x`

açıklama

Oldukça basit özyinelemeli lambda çözümü

Temel durumlarımız 1 ve 0'dır, "1"*xaksi takdirde -xile birlikte dize alırız `-x`ve işlevi len(`-x`)daha az çağırma sonucunu önleriz .


1
Dizeleri dizeleyerek kaydedebilir misiniz -x?
Martin Ender

@MartinEnder Tamam Çalıştım. Bahşiş için teşekkürler! Bunu daha önce farketmediğim için biraz aptal hissediyorum.
Post Rock Garf Hunter

5

Mathematica, 67 57 bayt

Martin Ender'e 10 bayt attığı için teşekkürler!

""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&

Adsız işlev, negatif olmayan bir tamsayı bağımsız değişkeni alıp bir dize döndürüyor. Hemen hemen bariz özyinelemeli algoritma: dizginin başında a ile başlayan giriş numarası ile sonlandığından emin olun "-"ve sonra işlevi kullanarak tekrar çağırın #0.

Ancak algoritmanın uygulanmasında golf eğlencesi var. ifadenin th argümanını ""["1"][[#]]belirtir : 0 argümanı kafa ve 1. argüman görünür bir şekilde yapılır , bu da özyinelemenin temel vakalarını sağlar. Eğer 1 ', aşar ve ardından bir hata mesajı atar ve bir unevaluated fonksiyonu olarak kalır. Ama sonra , değerlendirilmemiş herhangi bir işlevi alan ve onu bir sonraki ifadeye dönüştüren, yani orijinal işleve özyineli çağrı olan bir kuraldır.#""["1"]"""1"#""["1"][[#]]/._@__:>

Orijinal gönderim:

If[#<2,""["1"][[#]],#0[#-1-IntegerLength@#]<>"-"<>IntegerString@#]&

2
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&tek kaçınarak bayt kaydeder Ifve kaçınarak bayt bir demet IntegerStringve "-"<>.
Martin Ender

1
Aman tanrım, _@__şeytani sihir
Greg Martin

3

JavaScript (ES6), 49 bayt

f=(n,s='',t=''+-n)=>n>1?f(n-t.length,t+s):n?n+s:s
<input type=number oninput=o.value=f(this.value)><br><textarea id=o></textarea>


1
Sanırım tanımlamanız gerekiyorf
Tom Viner

@TomViner Bunu hep yapıyorum. (En azından doğru bayt sayım vardı.)
Neil


1

Perl 6 , 43 bayt

{[R~](-$_,{$_+.comb}...^*>-1).&{S/^\-1/1/}}

Açıklama:

{                                         }  # A lambda.
                    ...                      # Generate a sequence...
      -$_                                    #   starting from the negated lambda argument,
         ,{        }                         #   continuing iteratively using the formula:
           $_+.comb                          #     Last element plus length of last element.
                        *>-1                 #   until we hit 0 or higher,
                       ^                         end-point not inclusive.
 [R~](                      )                # Reverse and concatenate the number sequence.
                             .&{         }   # Apply to this the transformation:
                                S/^\-1/1/    #   Remove the sign from a leading "-1".

Örneğin, girdi 10 için, diziyi (-10, -7, -5, -3, -1)ve bundan dizeyi -1-3-5-7-10ve bundan son dizeyi oluşturur 1-3-5-7-10.

Çevrimiçi deneyin .

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.