Zıplama ve Koşma


18

Matthew bulmaca çözmeyi sever. Birini çözmeyi başardığında mutlu bir şekilde atlar. Son zamanlarda bunu bir meteor yağmuru düşmek istemediği yerde kraterler ve delikler açtığı için gerçekten yapması gerekiyor .

Size Matthew'un geçmek istediği bir manzara parçası verilir, umarım sonunda sağlıklı gelirsiniz. Toprak metre cinsinden verilir, her sayaç normal toprak veya bir deliktir. Koşarken adım başına bir metreyi geçmeyi başarır; alternatif adım başına dört metreyi geçen atlamadır. Matthew ilk zemin metresinin en solunda başlar ve son metreye ulaşmak ister (bunun ötesinde değil - sadece manzarada verilen son metrenin ötesinde sonsuz bir delik hayal edin).

Giriş

Giriş, standart girişte bir satır sonu ile sonlanan tek bir satır olarak verilir. Çizgi , sırasıyla bir zemin veya delik ölçeri temsil eden tire ( -) veya alt çizgiden ( _) oluşur . Bir örnek girdi şunlar olabilir:

----__--___---

Verilen manzara en az bir ve en fazla 30 metre uzunluğundadır ve her zaman toprakla başlar.

Çıktı

Çıktı standart çıktıda verilir ve Matthew'e run ( R) veya jump ( J) gibi bir dizi hareket komutunu temsil eder . Yukarıda belirtildiği gibi, bir koşma komutu, Matthew'un bir metre koşmasına neden olurken, atlama onu tam olarak dört metre ileri taşır. Yukarıda verilen örnek için aşağıdaki hareket mümkündür:

RRJRJRR

yaklaşık olarak aşağıdaki gibi görünür:

RRJRJRR hareketinin gösterimi

Manzara boyunca güvenli bir yol yoksa, tek bir ünlem işareti ( !) yazdırılmalıdır.

Örnek girişler

--------
----__--___---
-_______
-_-_-_-_-_-
-

Örnek çıktılar

JRRR
RRJRJRR
!
!

(hareket gerekmediğinden son çıktı boştur, ancak sanırım Markdown bunu ayrıştıramıyor)

Not

Yalnızca tek bir olası yol gereklidir, bu nedenle program çıktısının tam olarak örnek çıktılara uyması gerekmez. Varsa bir çözüm verildiği ve her hareket komutu toprağa hareket ettiği ve son metreye en sonunda ulaşıldığı sürece, çıkış geçerlidir.

Standart hatadaki ek çıktı yoksayılır.

Kazanma koşulu

Golf alışıldığı gibi en kısa kod kazanır. Beraberlik durumunda, önceki çözüm kazanır.

Test senaryoları

Özdeş test senaryoları içeren iki test komut dosyası vardır:

Her iki durumda da çağırma: <test script> <my program> [arguments]örn. ./test ruby jumprun.rbVeya ./test.ps1 ./jumprun.exe.

Başka bir not

Bu görev 2011-W24 boyunca üniversitemde düzenlenen bir golf yarışmasının bir parçasıydı. Yarışmacılarımızın puanları ve dilleri şöyleydi:

  • 104 - Haskell
  • 131 - Haskell
  • 154 - C
  • 170 - C
  • 275 - VB.NET
  • 286 - Ortak Lisp

Kendi çözümlerimiz

  •   92 - Yakut
  • 124 - PowerShell

@Joey Test.sh'i bash 3.2.48 altında ./test.sh perl jump.pl- ile çalıştırmaya çalışırken bir hata alıyorum./test.sh: line 42: syntax error near unexpected token 'done'
swilliams

@Joey Önbelleğimi temizledim, yeniden indirdim ve şimdi harika çalışıyor. Teşekkürler.
swilliams

Çözümlere baktığımızda, görünüşe göre çok önemsizdi. Özür.
Joey

1
Geriye koşmanın / zıplamanın yasak olduğuna inanıyorum? Eğer olsaydı, - - - çözülebilir gibi manzaralar yapardı .
Keith Randall

Keith: Görevi değiştirmek için biraz geç, sanırım.
Joey

Yanıtlar:


7

Perl, 53 karakter

s/-...(?=(-|-...)*-$)/J/g;y/-/R/;/_/?$_="!":s/.$//

Bunu ile çalıştırın perl -p jumpnrun.pl. Ben 3 karakter saydım -parasındaki uzunluk farkı muhayyerlikleri perl jumpnrun.plve perl -p jumpnrun.pl.

Perl'de o kadar akıcı değilim, bu yüzden bunun daha da kısaltılabileceğinden eminim. Bu, Howard'ın çözümüne benzer bir normal ifade kullanır .


3

Ruby, 93 90 79 70 karakter

Bir regex çözümünün oldukça ince ve kompakt olacağını düşündüm (eşleştiricinin işi yapmasına izin ver). Ne yazık ki tüm kenar durumlarda ve özel tedaviler bu kadar uzun yaptı - en azından 100 ;-) dokunmadım.

puts gets.gsub(/-...(?=(-|-...)*-$)/,?J).tr(?-,?R)=~/^([JR]*)R$/?$1:?!

Sağlanan komut dosyasının tüm test senaryolarını geçer.

Önceki komut dosyasına kıyasla birkaç karakter kaydetti (şimdi tek bir çağrı gsubyeterlidir).

Düzenleme 1: Değiştirildi puts z!=?-??!:''için z!=?-&&$><<?!test komut dosyası sonra test durumu 1 için hiçbir çıkış izin verdi.

Düzenleme 2: Önceki sürüm

z=gets.chop
z.chars{z.sub!(/^(-|-...)((-|-...)*-)$/){$><<($1==?-??R:?J);$2}}
z!=?-&&$><<?!

Benim asıl fikrim, karakterleri, böyle bir geriye dönük ve ileriye dönük bir strateji kullanarak değiştirmekti: Desen oldu ^(?<=[RJ]*)(-|-...)(?=(-|-...)*-$)ve sonra '-' yerine 'R' ve aksi takdirde 'J' ile değiştirirdim. Ne yazık ki Ruby, değişken uzunluklu geriye bakıma izin vermez ve ilk bölüm için başka bir yakalama grubu kodu daha da uzattı.

Sonra yinelemeli yaklaşımı yaptım: bir adım ya da atlama ile başlayabilir ^(-|-...)ve son platforma kadar bir dizi başka adım ya da atlayışım (-|-...)*-$varsa, karşılık gelen harfi yazdırabilir, ilk dört karakteri kaldırabilir ve yeniden başlayabilirim. Açık, ifadenin içindeki seçenekleri değiştirerek RJ'ye karşı JR önceliğini bile ayarlayabilir (şu anda RJ'yi tercih etmektedir).

Düzenleme 3: Tek altyazıyı bölme

puts (z=gets.chop.gsub(/(-...|-)(?=(-|-...)*-$)/){$1==?-??R:?J})=~/_/??!:z.chop

ikiye

puts (z=gets.chop.gsub(/-...(?=(-|-...)*-$)/,?J).tr(?-,?R))=~/_/??!:z.chop

birkaç karakter daha verdi. Sonunda bu satır sonu sorunundan kurtulmayı başardım ama bir maliyetle: arıza tespiti biraz daha fazla karaktere mal oldu.


Son satırı olarak değiştirerek 3 karakter kaydedebilirsiniz z!=?-&&$><<?!. Bunun dışında harika bir çözüm +1!
Ventero

@Ventero Ben "-" ;-)
Howard için

Hmm, PowerShell betiğimin küçük bir hatası var gibi görünüyor. Görünüşe göre Test 2 için giriş kabul etmiyor ve Test 1 için kabul etmiyor. Bu ... en azından garip. Düzeltmeye çalışacağım.
Joey

Tamam, test komut dosyası sabitlenmeli ve test 1 için artık gerçekten boş bir sonucu reddetmemelidir. Tamam, şimdi düzeltilmelidir.
Joey

@Joey Danke. Rahibe sind es 90 ;-)
Howard

1

Perl - 71 60

$_=<>;y/-/R/;s/R...(?=(R(...)?)*R$)/J/g;print/_/?"!":s/.$//r

Şimdi tüm test kılıflarını geçiyor. :) Görünüşe göre son karakteri çok erken çıkarıyordum ... ve orijinal regex'imin yarısı tamamen gereksizdi.

$ _ = $ ARGV [0]; y / - / R /; s / (R ... (? = R)) (R * (? = R)) / J $ 2 / g; doğrayın; yazdır / /? "!": $ , $ /

Yine bir başka regex çözümü, 5 testcasını postadan geçiriyor.

Bunun yerine -Eve sayyerine tek astar olarak çalışarak kısaltılabilir print, ancak perl girdiyi bir anahtar olarak yorumlamaya çalışır ... ( Unrecognized switch: -_-_-_-_-_-)


Soru, girdinin stdin'de verildiğini belirtir. Çözümünüzü kullanmak yerine stdin'den okumak için değiştirdiğinizde $ARGV, test komut dosyalarından 108 testcasta hala başarısız olur.
Ventero

@Ventero Oh ayy ... Sanırım neden bunu yaptığını biliyorum, yakında bir düzeltme yapacağım ... tüm test kılıflarından geçmediğim için aldım ...> _>
swilliams

Komut dosyalarının amacı, insanların spesifikasyonun geçerliliğini ve bağlılığını kolayca kontrol etmelerine izin vermekti :-)
Joey

@Joey Sorun, Ventero yorumunu gönderene kadar 'test komut dosyasını' bir şekilde 'referans uygulaması' ile karıştırmayı başarabilmemdi :) ... komut dosyası şimdi neredeyse düzeltildi, ancak şu anda sadece 20 başarısız, tüm yanlış negatifler
swilliams

1

Python - 89 93 97 93 karakterler

Çünkü.

import re;i=re.sub('...(?<!---)-','J',input()[1:]);print('!'if'_'in i else re.sub('-','R',i))

Şu anda yalnızca on test vakası başarısız oluyor (birden fazla geçerli çözümün olduğu durumlar dikkate alınarak). Daha sonra tamamen düzeltirim.


Çalışan normal ifadelerden birini ödünç alarak,

import re;i=re.sub('-...(?=(-|-...)*-$)','J',input());print('!'if'_'in i else re.sub('-','R',i))

96 karakter ile.


1
Test vakalarının sadece 728'ini geçer. Aslında test senaryolarını bir nedenden dolayı buraya koydum.
Joey

@Joey: Görünüşe göre girişteki önde gelen karakteri kesmeyi unuttum. Aptal bana. Şimdi düzeltildi.
JAB

Yine de sadece 766/849 test senaryosunu geçiyor.
Ventero

1

Haskell, 90 karakter:

İlk çözümüm - uzun, ancak dinamik programlama kullanarak doğrusal zamanda çalışıyor. :) 150 karakter :

x!y="!"
q '-'=max
q c=(!)
s i=r where r=zipWith3 q i(0&'R')$3&'J';n&c="":replicate n"!"++map(c#)r
c#"!"="!"
c#s=c:s
main=interact$reverse.last.s.init

İkinci çözüm - çok daha yavaş (üstel zaman), ama çok daha kısa: 90 karakter

s"-\n"=""
s('-':t)=max('R'#s t)$'J'#s(drop 3 t)
s _="!"
c#"!"="!"
c#s=c:s
main=interact s
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.