Tekrarlamayı Yorumla!


11

Bu zorluk, Tekrar ile ilgili iki kişilik bir seride ilktir. İkincisi yakında hazır olacak.

Tekrarlama (Sadece uydurduğu bir şey) olarak adlandırılan bir dille, sonsuz dize orada oluşur 12345678901234567890...ile, 1234567890sonsuza tekrarlayarak.

Çıktı sayıları için aşağıdaki sözdizimi kullanılabilir:

  • +-*/: Bu, operatörü yinelenen basamak dizesine ekler.
    • Örnekler:
      • +-> 1+2= 3( arasına bir ve +ekler )+12
      • +*-> 1+2*3= 1+6= 7(Şu anda iki operatör kullanılması dışında yukarıdakiyle aynı)
      • /-> 1/2= 0(Tekrarlama tamsayı bölmesini kullanır)
      • //-> 1/2/3= 0/3= 0(Tekrarlama, birden fazla çıkarma ve bölümle "sol ilişkilendirme" kullanır)
    • Her operatör, aksi belirtilmedikçe solunda bir basamak olacak şekilde yerleştirilir c(aşağıya bakınız).
  • c: Dizedeki bir sonraki basamakla birleştirilir.
    • Örnekler:
      • c+-> 12+3= 15( c"devam eder" 1ve bunu oluşturmak için bir sonraki basamakla 2birleştirir 12)
      • +c-> 1+23=24
      • ccc -> 1234
  • (): Sayıları işlemek için parantez.
    • Örnekler:
      • (c+)*-> (12+3)*4= 15*4= 60(Tekrarlama işlem sırasını kullanır)
      • (c+)/c-> (12+3)/45= 15/45=0
      • (cc+c)/-> (123+45)/6= 168/6=28
  • s: Bir numara atla (numarayı sonsuz dizeden kaldırır).
    • s+-> 2+3= 5( satlar 1)
    • csc-> 124(ilk cconcats 1ve 2, satlama 3ve son cconcats 12için 4)
    • +s+-> 7(ilk +ekler 1ve 2yapmak 3, satlar 3ve son +ekler 3için 4yapmak 7)
    • cs*(++)-> 12*(4+5+6)= 12*15=180

Yukarıdaki örneklerde, sonsuz dizgide yalnızca sınırlı miktarda rakam kullanılır. Kullanılan basamak sayısı eşittir number of operators, concats and skips + 1.

Göreviniz, bir Tekrarlama kodu dizisi verildiğinde, sonucu çıktı olarak almaktır.

Giriş ve çıkış örnekleri:

++ -> 6
- -> -1
(-)* -> -3
cscc -> 1245
(cc+c)/ -> 28
cc+c/ -> 130
cs*(++) -> 180

Bu kod golf, bayt çok kısa kod kazanır!

Özellikleri:

  • Sonucun asla yukarı çıkmayacağı garantilidir 2^31-1.
  • Ayrıca, girişin yalnızca simgelerden oluşacağı garanti edilir +-*/cs().
  • Boş bir program çıkacaktır 1.

Peki ya ~s? Bizi asılı bırakma.
Robert Fraser

@RobertFraser Whoops, bu bir hataydı - c aslında ~ idi, ama görünüşe göre bunu tam olarak düzeltmedim.
clismique

1
@TonHospel Ooh, orada iyi bir noktaya değindin. "S" sembolü, ilişkili olduğu sayıyı sonsuz dizeden tamamen kaldırır, bu nedenle her iki senaryo için de bir evettir.
clismique

2
Kişisel özellikleri ancak diyor s+olduğunu 2+3ilk örneği olarak. Ve hala sbeni rahatsız ediyor. Nasıl +s()+genişlediğini merak ediyorum . Eğer 1+(2)+4daha (önce gelirse, 2ama görünüşte hala atlanmadan sönce gelirse , değil . Ancak sonuç o zaman (321+(3)+4s+s+
a'nın

1
scolduğu 23ve s+bir 1+3? Does satlamak 1şimdi ya 2? Tüm örnekler işlenenlerdeki ilk işlemi kullanır 1ve 2... öyle scolmalıdır 13.
Titus

Yanıtlar:


4

JavaScript (ES6), 110 bayt

s=>eval((" "+s)[R='replace'](/[^\)](?!\()/g,x=>x+i++%10,i=1)[R](/c| (\ds)+|s\d/g,"")[R](/\d+\/\d+/g,"($&|0)"))

Çok basit, ancak tamsayı bölümü 25 bayt ekler. Bazı nedenlerden dolayı, JS'deki normal ifade bir dizenin başlangıcıyla ve ilk karakteri eşleştiremez, böylece birkaç bayt ekler.

Nasıl çalışır

  1. Girişe boşluk bırakın.
  2. A'dan )hemen önce olmayan her karaktere (hariç ) sonraki basamağı ekleyin (.
  3. Her birini c, sbaşında bir rakam + ( 1s2-> 2) ve her birini sbir rakam ( 3s4-> 3) çıkarın .
  4. Her bölme işlemini bölmeye ( 1/2-> (1/2|0)) dönüştürün.
  5. Değerlendirin ve geri dönün.

Tamam ... programınızı bir hata var ... ss+getiri 6bunun karşılığında seni rahatlatacaksa, 7(iki s'ın atlama 1ve 2böylece, +ekler 3ve 4).
clismique

@ Qwerp-Derp Teşekkürler, düzeltildi.
ETHproductions

Gibi bir şey /^|,|$/gbaşlangıçta yalnızca bir kez eşleşir çünkü her iki eşleşme de aynı dizine sahip olacaktır. $eşleşmenin olası diğer eşlemelerden daha büyük bir dizine sahip olması nedeniyle aynı sorunla karşılaşmaz.
Neil

0

Toplu, 332 bayt

@echo off
set s=
set e=
set d=
set r=
set/ps=
:d
set/ad=-~d%%10
:l
if "%s%"=="" goto g
set c=%s:~0,1%
set s=%s:~1%
if %c%==( set e=%e%(&goto l
if %c%==) set r=%r%)&goto l
if %c%==s goto d
if %c%==c set c=
if "%r%"=="" set/ar=d,d=-~d%%10
set e=%e%%r%%c%
set/ar=d
goto d
:g
if "%r%"=="" set/ar=d
cmd/cset/a%e%%r%

Davranışı sbunu çok garip hale getirir. (Belki csiçin değerlendirmelidir 13ve -shiç -2?) Değişkenler:

  • s girdi dizesi (hiçbir şey girmezseniz set / p değişkeni değiştirmediği için açıkça boş bırakılır)
  • enormal tamsayı aritmetiğinde kısmi ifade ( set/abir biçimi olarak geçebiliriz eval)
  • d sonsuz basamak dizisinden sonraki basamak
  • ren son operatörün sağ tarafı. Bunu derhal birleştiremeyiz çünkü (önce gelmesi gerekiyor, ancak artmaması için saklamamız sgerekiyor. Neyse ki, bu işlem )biraz daha kolay hale getirir .
  • c geçerli karakter.
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.