Sarı ahşapta iki yol ayrıldı (bölüm 1)


14

Bu bir serinin ilkidir, ikincisi sarı ahşapta iki yol ayrılmıştır (bölüm 2)

Bu meydan okumadan esinlenerek Robert Frost'un ünlü şiiri "Alınmamış Yol":

Sarı bir ağaçta iki yol ayrıldı,
Ve üzgünüm ben de seyahat edemedim
Ve bir gezgin olmak, uzun durdum
Ve olabildiğince bir aşağı baktı
Bir yerde çalılar bükülmüş nereye;

Sonra diğerini, adil olduğu kadar aldı,
Ve belki de daha iyi bir iddiaya sahip,
Çünkü o çimenli ve giyim istedim;
Oradaki geçiş
onları gerçekten aynı şekilde giymiş olsa da ,

Ve o sabah her ikisi de eşit olarak yatıyordu
Yapraklarda hiçbir adım siyah değildi.
İlkini bir gün daha sakladım!
Yine de yolun nasıl yol aldığını bilerek,
geri dönmem gerektiğinden şüphe ettim.

Bunu bir nefesle söyleyeceğim
Bir yerlerde yaşlar ve çağlar bundan dolayı:
İki yol bir ormanda saptı ve ben -
daha az seyahat edileni aldım,
Ve bu tüm farkı yarattı.

Son satırdan son satıra dikkat edin I took the one less traveled by,.

Asıl zorluğunuz

Aşağıdaki gibi bir biçimde girdi alacaksınız:

#     ##
 #   ##
  # ##
   #
   #
   #

ve daha ince bir yol bulmalısın.

Yol en alttan a ile başlar #. Her zaman en üst sırada biten diğer 2 yol, incelemeniz gereken yollar. En kalın olan yol en çok seyahat edilen yoldur ve bu nedenle istediğiniz şey değildir. Diğeri en az seyahat eden ve istediğiniz odur.

Çıktı

Programınız / fonksiyonunuz 2 farklı değerden birini (örn. 0 veya 1, doğru veya yanlış), yolun alınmayan her olası konumu için bir tane vermelidir. Örneğin, alınmayan yol alınan yolun solundaysa 0, aksi takdirde 1 çıktısını verebilir veya "sol" veya "sağ", doğru, yanlış vb. Dizesini çıktılayabilirsiniz.

Test senaryoları:

 ##    #
  ##  #
   ###
    #
    #
    #

Çıktı "sağ" olabilir.

 ##  #   
  ## #  
   ###
    ##
     #
     #
     #

Çıktı "sağ" olabilir.

 ##  #   
  ## #  
   ###
    ##
   # 
  #  
 #   

Çıktı "sağ" olabilir.

 ##   #  
  ## #  
   ###
    #
   # 
  #  
  #  

Çıktı "sağ" olabilir.

 #    ## 
  #  ## 
   ###
    #
   # 
  #  
  #  

Çıktı "sol" olabilir

 #    ## 
  #  ## 
   ###
    #
     #
     #
     #

Çıktı "sol" olabilir

notlar

  • Bu , bu yüzden bayttaki en kısa cevap kazanıyor
  • Standart boşluklar yasaktır
  • Çıktılarınızı "sol" ve "sağ" için belirtmelisiniz ve farklı olmalıdır
  • Giriş büyük bir dize olacaktır ve herhangi bir miktarda satır içerebilir
  • Geçerli girdi için endişelenmenize gerek yok.
  • Yol her zaman Y şeklindedir, bu yüzden sadece tepeye bakmanız gerekir.
  • Sorunuz mu var? Aşağıdaki yorum:

En düşük bayt sayısı kazanır!


1
Evet, her zaman # ve ## ve yatay kesit.
programmer5000

1
Ben değildim. Oldukça beğendim. İyi tanımlanmış, iyi hikayeler ve açık örnekler. Oldukça kolay bir şekilde yapılabilir ve bence belirsiz dilleri davet etme fikri sadece ekstra lezzet katıyor ve bazı ilginç cevapları teşvik edebilir.
ElPedro

1
IBM / Lotus Notes Formül Dili ve Ağı !! yanıtlar, belirsiz dilleri kolay sorulara davet etmenin ilginç sonuçlara yol açtığının kanıtıdır.
programmer5000

3
Sadece kendi kendime şunu söylüyordum: "Hey, bu Acc kolay olacak !! " diye düşündüğünüzde bir meydan okuma olduğunu basit biliyorsunuz ";)
DLosc

22
@ programmer5000: Ben aşağılıklardan biriyim. Bu meydan okumayı reddettim, çünkü bu bir bukalemun meydan okumasıdır (yolların ayrıştırılması veya başka bir şekilde ölçülmesi ile ilgili gibi görünüyor, ancak aslında sadece "boşluklara bölün, ilk bölümü al"), sadece teğetsel olarak çok fazla arka planla ilgili ve meydan okumayı daha da gizlemek; ve bu son derece kolay (normalde beni aşağı iten zorlukları yapan bir şey). Ayrıca tam olarak belirtilmemiş (örn. Girişler 1 ve 2 dışında genişliklere sahip olabilir mi?)

Yanıtlar:



18

JavaScript (ES6), 19 12 bayt

Düzenle:

Daha golf edilmiş bir versiyon

a=>a.trim[1]

#Sağ için ve sol için bir boşluk döndürür .

Orijinal:

a=>a.trim()[1]=='#'

açıklama

Kurtulmamış :

function(input) {
  return input.trim().charAt(1) === '#';
};

Bu işlevin yaptığı ilk şey, girişin başlangıcında ve sonunda beyaz boşluğu kaldırmaktır. Bu, ilk karakterin her zaman olduğu anlamına gelir #. Sonra oradan ikinci karakteri kontrol ediyorum (JavaScript 0'dan başlıyor) ve bir #karakter olup olmadığını görüyorum . Bu bir boole döndürür. Yol buysa rightöyle olacak trueo bırakılırsa, bu dönecektir false.

Nasıl Golf Yaptım

ES6'da kısaca ok işlevi adı verilen anonim bir işlev vardır . Bu, sarma işlevimi alıp şu şekilde çevirebileceğim anlamına geliyor:

input => ...;

Ok fonksiyonlarının kuralları nedeniyle, kodun geri kalanını döndürür. Oradan dönüştürülmüş charAt(1)için [1]olsa, daha kısa bir yol olduğu gibi önerilmez . Sonra aldım ===ve dönüştürdüm ==. Bu durumda farklı olsalar da önemli değil. Son olarak, yeniden adlandırılmış inputiçin ave tüm boşlukları kaldırıldı.

Sağ ve sol çıktı

Bulmaca aslında sağ ve sol çıktı almak için programa ihtiyaç duymasa da, diğer çıktılara bir örnek:

a=>a.trim()[1]=='#'?'right':'left'

Eklenen tek bölüm ?'right':'left'. Bu üçlü bir operatör , kısaltılmış bir if ifadesi yaratır , bu da (ungolfed) kodunun *:

function(input) {
  let output = input.trim().charAt(1) === '#';
  if(output) {
    return 'right';
  } else {
    return 'left'
  }
};

Misal

// Function assignment not counted in byte count
let f =
a=>a.trim()[1]=='#'
<textarea placeholder="Put path in here" id="path" rows="10" style="width:100%"></textarea>
<button onclick="document.getElementById('result').textContent = f(document.getElementById('path').value)">Submit</button>
<p id="result"></p>


3
Siteye Hoşgeldiniz! Güzel açıklama ve snippet, bu çok kapsamlı bir ilk cevap. :)
James

2
Teşekkürler. Bir süredir kod golf sörf yaptım ve nihayet bir yapmaya karar verdim. Diyelim ki StackOverflow bana sürtüyor.
David Archibald

1
Vay be, tamamen modası geçmiş!
programmer5000

1
Bu gerçekten harika bir yaklaşım. Bunu düşünmemişti.
ElPedro

1
@ Programmer5000 yanıt verir vermez onu düzenleyeceğim. Harika bir fikir, teşekkürler.
David Archibald

10

Pyth, 2 bayt

hc

#Sol ve ##sağ için çıkışlar .

Çevrimiçi deneyin

açıklama

hc
 cQ     Split the (implicit) input on whitespace.
h       Get the first part.

10

Acc !! , 30 bayt

Çünkü Acc yolu !! girişi alır, sadece bir giriş satırı girildikten sonra çıktıyı verecektir. Ancak girdiyi bir dosyaya bağlar veya bir dosyadan yönlendirirseniz, farkı fark etmemelisiniz.

Count i while 35-N {
}
Write N

Stdin'den girdi alır. Çıkışlar sol Yol az seyahat edilirse, ya #sağ yol ise daha az gitti. Çevrimiçi deneyin!

açıklama

Nstdin'den gelen bir karakterin her başvurulduğunda ASCII değerini okur. Biz döngü 35-Ndoğrudur; yani, 35-N != 0veya N != 35. Bu nedenle, döngü çıktığında, #satırdaki ilk karakteri okuduk . Bir sonraki karakter ile birlikte okunur Nve stdout'a geri yazılır Write.


Vaov! Yine başka bir karanlık dil ...
programmer5000

7
@ programmer5000 Belirsiz programlama dilleri istiyorsanız, doğru siteye geldiniz. ;)
DLosc

Nerede Acc çalıştırabilirim !!? GitHub bağlantısı, Tio veya başka bir bağlantı var mı?
programcı5000

@ programmer5000 Python 3 kaynak kodu başlıkta bağlandığım yazıda, ancak sizin için bir TIO bağlantısını birlikte çözüp çözemeyeceğimi göreceğim.
DLosc

@ programmer5000 Cevaba TIO bağlantısı eklendi.
DLosc

8

Retina, 5 bayt

Sağsa 1, 0solsa çıktı verir.

^ *##

Çevrimiçi deneyin


Olumlu bir sonuç için değerlerin ayrı olması gerekmiyorsa (5 bayt):

Sağda pozitif bir tamsayı, solda sıfır olur.

## +#

Çevrimiçi deneyin


1
Vaov! O nasıl çalışır? Cevabınızı açıklamak ister misiniz?
programmer5000

1
@ programmer5000 Sadece bir eşleşme için girişi normal ifadeye göre test eder.
mbomb007

6

IBM / Lotus Notes Formül Dili, 37 35 26 bayt

Düzenleme Her zaman @Likejoker karakterler ile 2 bayt daha ucuz olduğunu unutuyorum @Contains.

Düzenleme 2 Aslında ihtiyaç duymaz @ifsadece baskılar olarak 1veya 0formül sonuçlarına olmadığına bağlı olarak @Trueya @False.

@Like(@Left(a;"##");"%#%")

Hesaplanan alan formülü. Her şeyi ##sahada bulduğu ilkin soluna götürün ave içinde bir tane varsa sol #için çıkışlar 1, aksi takdirde 0sağ için çıkışlar .

resim açıklamasını buraya girin

resim açıklamasını buraya girin

@DavidArchibald sayesinde 22 bayt için bir çözüm. Davids çözümüne saygı duymama rağmen bunu ana cevabım olarak göndermeyeceğim.

@Left(@Trim(a);2)="##"

Bu 1sağa ve 0sola çıktı.


Vaov! Oldukça belirsiz bir dil! Daha iyi bir cevap yakında gelmezse kabul edilebilir ...
programmer5000

1
Eskiden genç (er) bir programcı olduğumda eski günlerde çok karanlık değildi ;-)
ElPedro

4

Pip , 8 6 bayt

a~`#+`

Girdiyi komut satırı bağımsız değişkeni olarak alır (gerçek bir komut satırından çalıştırıldığında yeni satırların tırnak içine alınması ve bu satırlardan kaçması gerekir). Çıkışlar #sol Yol az seyahat edilirse, ve ##sağ yol ise daha az gitti. Çevrimiçi deneyin!

açıklama

Pip'in yakın zamanda eklenen normal regex ilk maç operatörünü kullanır.

a         First cmdline arg
 ~        Regex match the first instance of...
  `#+`    ...one or more #s (i.e. a cross-section of the left-hand road)
          Print (implicit)

Basit normal ifade çözümü ( mbomb007'nin Retina cevabının bir limanı ) 9 bayttır:

`^ +##`Na

Bayt sayısındaki komut satırı bağımsız değişkenini saydınız mı?
programcı5000

@ programmer5000 Komut satırı bağımsız değişkeni ile girdi alma , varsayılan olarak izin verilen bir giriş yöntemidir (ve Pip'in normal şekilde girdiği yöntemdir). Bayt cezası , bu gönderimde kullanmadığım standart olmayan komut satırı bayrakları için geçerlidir . Yani bu özel durumda, bir, sözü olabilir değiştirmek aa qve yerine stdin'i girdi olsun.
DLosc

Ah. Anlamadım.
programmer5000

4

Çip , 7 bayt

AZ~S
at

Çevrimiçi deneyin!

0x0Sol ve 0x1sağ için çıkışlar . (TIO, stderr'deki -vikili değerleri görebilmeniz için bayrak içerir . ASCII'deki çıktıyı görmek e*fiçin ilk satırın sonuna eklenebilir.)

Chip, bir bayt akışı içindeki bireysel bitler üzerinde çalışır ve bu da bu özel problemde oldukça iyi olmasını sağlar.

Agirdi baytının en küçük anlamlı bitidir ve '#' bu bitin ayarlandığı tek girdi karakteridir. Bu bit ilk karşılaşıldığında, ilk satırın ilk '#' değerine ulaştık.

Z Bu sinyali bir döngü için geciktirir, böylece şimdi bir sonraki karaktere bakıyoruz.

tetkinleştirildi, yani bu döngü tamamlandıktan sonra yürütmeyi sonlandırmak anlamına gelir. İlk yolun genişliğinden daha fazla bakmamıza gerek yok.

~Ssonuncusu hariç tüm döngüler için çıktıyı bastırır. Bu olmasaydı, her döngüden bir çıktı alırdık.

akomşularının akım değerini (sadece Abu durumda) çıkış baytının en küçük anlamlı bitine koyar .

Bütün bunlar, 0x1eğer ilk '#' karakterini hemen başka bir '#' ile takip edersek, 0x0aksi takdirde alacağımız anlamına gelir .


4

C, 35 bayt

f(char*s){while(35^*s++);return*s;}

PragmaticProgrammer'ın cevabı ile aynı fikir : ilkini bulun #ve peşinden gelenleri sağlayın - #"sağ" ve <space>"sol" için.

C (boşluk), 16 bayt

Test vakalarına göre, sol yol her zaman sol kenardan tam olarak bir boşluk gibi görünüyor. Yani...

#define f(s)2[s]

Boşluk amaçlanmamıştır, bu test vakaları yanlıştır. Ama C cevabınız etkileyici!
programcı5000

3

Toplu, 46 bayt

@set/ps=
@for %%a in (%s%)do @echo %%a&exit/b

STDIN'den bir satır okur, boşluklara ayırır ve ilk kelimeyi yazdırır, böylece #sola ve ##sağa çıktılar . Alıntılanan komut satırı parametreleri dizisi kabul edilebilirse, 36 bayt için:

@for %%a in (%~1)do @echo %%a&exit/b

Boşluklara bölünecek ve ilk kelimesini yazdıracak şekilde ilk argümanın işaretini kaldırır.



3

Retina , 5 bayt

!1`#+

Çevrimiçi deneyin!

Alternatif bir 5 baytlık çözüm. #Sol ve ##sağ için yazdırır . Fikir, #s ( #+) ' nin tüm çalışmalarını eşleştirmek ve !sadece (bir ) ilkini basmaktır ( 1).


3

Haskell, 21 bayt

f n=snd$span(==' ')n!!1

veya noktasız bir tarzda:

(!!1).snd.span(' '==)

"#" sağ ve "" sol anlamına gelir

İşlev sadece bir dize alır, başlangıç ​​boşluklarını bırakır ve sonra ikinci karakteri alır (sol sıska ise boşluk ve sol kalınsa #)

EDIT: Laikoni ve nimi sayesinde üç bayt kurtardı!


Anonim işlevler de kabul edilebilir, bu yüzden (!!2).dropWhile(' '==)cevap olarak yeterlidir.
Laikoni

Bu var !!12 element için. Testi şu şekilde kısaltabilirsiniz <'!'. Pointfree sürümünde, yerine dropWhilegöre snd.span.
17'de nimi

2

Brainfuck, 32 bayt

+[>,>+++++[<------>-]<--[,.>>]<]

Ungolfed:

+[                       while 1
>,>+++++[<------>-]<--     3 if hash; 0 if space
[,.>>]                     print next char and break iff current char is hash
<]

#Sağ ve sol için yazdırır .

Çevrimiçi deneyin!


2

Perl 5 , 8 + 1 = 9 bayt

die$F[0]

Çevrimiçi deneyin!

İle koş -a(1 byte ceza).

Sol yol daha az seyahat edilirse veya sağ yol daha az seyahat edilirse çıktı (burada dosya adı komut dosyasının dosya adıdır) .# at filename line 1, <> line 1## at filename line 1, <> line 1

açıklama

-aSeçeneği otomatik giriş okur ve lider boşluk görmezden gelerek boşluk etrafında sütunlara böler. Bu nedenle, girdinin ilk referans noktası ihtiyacımız olan şeydir; bu kadar $F[0]. Ayrıca, programı istemediğimiz örtük bir döngüye sokar. Ancak, kullanımı, diebir dizeyi çıktılamamıza ve örtük döngüden aynı anda çıkmamıza izin verir (ve saybir dizeyi yazdırmanın daha olağan yolu).


Güzel yaratıcılık ve düşük bayt sayısı! Ne yazık ki, zaten 2 baytlık bir cevap var. Bu serinin üçüncü zorluğunu denemek ister misiniz ?
programcı5000

2
@ programmer5000: Perl'de 2 baytlık bir cevap olduğunu düşünmüyorum (ve aslında, bu şu anda golf dışı bir dilde en kısa cevaptır). Tipik olarak, her dilde / her yaklaşımda en iyi çözümü bulmayı amaçlıyoruz, aksi takdirde golf dilinden başka bir şey kullanmanın anlamı yoktur.

2

C 54 bayt

char*strchr();char c(char*s){return*(strchr(s,35)+1);}

C ++ 58 bayt

#include<cstring>
char c(char*s){return*(strchr(s,35)+1);}

OP belirtildiğinden, karakterleri kaydetmek için bir fonksiyon yazmayı seçtiğim bir "program / fonksiyon" olabilir. Ancak, yine de işlevi derlemek için gerekli olduğu gibi "#include" deyimi ve eşlik eden satır sonu karakter sayısı dahil.

Çıktı

" "Sola işaret etmek için boşluk karakteri "#", sağa işaret etmek için karma karakter döndürür .

açıklama

Strchr () işlevi belirli bir dizeyi yürür ve belirtilen karakterin ilk oluşumuna bir işaretçi döndürür. Bana 1 karakter kazandıran bir karakter yerine tamsayı ikinci argüman olarak kabul eden bir aşırı yük var. Örneğin '#' 35 ile değiştirilebilir. Daha sonra, karakteri hemen takip etmek için işlevden döndürülen işaretçiye bir tane eklerim ve dereference, sonra elde edilen karakter döndürür.

Not

Ben de golf (□ ° □ °) ╯︵ ┻━┻) çalışırken ben kodumu biçimlendirme Visual Studio otomatik olarak resmimi ifade etmek için bu fırsatı almak istiyorum.

Düzenleme: Ray sayesinde C ve C ++ ve bazı <3 karakterleri kaydedebilirsiniz bazı farklılıklar işaret.


C / C ++ bir dil değildir: C ve C ++ 'da farklı anlamlar ifade eden ifadeler vardır. Örneğin, C ++ 'da, bir işlevin boş bir parametre listesi varsa, hiçbir bağımsız değişken almaz. Oysa C de parametrelerin belirtilmemiş olduğu anlamına gelir. Dolayısıyla, bunun bir C programı olduğuna karar verirseniz, hala mükemmel bir şekilde yasal iken 6 bayt #include <string.h>\nile değiştirebilir char*strchr();ve kaydedebilirsiniz. (Herhangi bir nedenle C ++ 'ı tercih ederseniz, 1 bayt #include <string.h>ile değiştirebilir #include <cstring>ve kaydedebilirsiniz.)
Ray

İlginç, bunun farkında değildim. Cevabımı güncelledim, teşekkürler.
PragmaticProgrammer

1

JavaScript (ES6), 37 bayt

p=s=>/^ *#( |$)/.test(s.split("\n")[0])

Açıklama:

ptruedaha az gidilen yol solda ve yanlışsa geri dönen bir fonksiyondur . Bu, bu sitede ilk cevap, bu yüzden muhtemelen daha golf olabilir (belki regex.)

Girişin en üst satırını alıp normal ifadeyle eşleşip eşleşmediğini görerek çalışır /^ *#( |$)/(dizgenin başlangıcı, herhangi bir miktarda boşluk, a # ve dizenin boşluk veya bitişi).

Bu sadece insanlara format hakkında açıklama ve fikirler üretmektir. Daha da dövmek ve golf olabilir eminim. Mutlu golf!

p=s=>/^ *#[^#]/.test(s.split("\n")[0])
<textarea rows = "8" cols = "8" oninput = "console.log(p(this.value))"></textarea>


Sanırım bunun yerine bir yeriniz olabilir[^#]
user41805 28:17

Normal regex sorunu düzeltildi.
programmer5000

Daha kısa bir Javascript yanıtı verdim .
David Archibald


1

Excel, 17 bayt

=left(trim(A1),2)

Hücreye girdi olduğunu varsayar A1.

İade ##sağ ve için #( #sol için ve uzay).


1

Dyvil , 12 bayt

s=>s.trim[1]

Açıklama:

s=>          // lambda expression
   s.trim    // removes leading (and trailing) whitespace
         [1] // gets the second character

Kullanımı:

let f: String -> char = s=>s.trim[1]
print f('...')

Sol ve #sağ için (boşluk) döndürür .


1

Java 7, 166 66 63 52 43 bayt

int c(String s){return s.trim().charAt(1);}

35Sağ ve 32sol için çıkışlar .
Dayanarak @Clashsoft 'ın Dyvil cevap .

Açıklama:

int c(String s){   // Method with String parameter and integer return-type
  return s.trim()  //  Remove leading and trailing whitspaces
   .charAt(1);     //  and return the second character (as int value)
}                  // End of method

Test kodu:

class M{
  static int c(String s){return s.trim().charAt(1);}

  public static void main(String[] a){
    System.out.println(c(" ##    #\n  ##  #\n   ###\n    #\n    #\n    #"));
    System.out.println(c(" ##  #   \n  ## #  \n   ###\n    ##\n     #\n     #\n     #"));
    System.out.println(c(" ##  #   \n  ## #  \n   ###\n    ##\n   # \n  #  \n #   "));
    System.out.println(c(" ##   #  \n  ## #  \n   ###\n    #\n   # \n  #  \n  #  "));
    System.out.println(c(" #    ## \n  #  ## \n   ###\n    #\n   # \n  #  \n  #  "));
    System.out.println(c(" #    ## \n  #  ## \n   ###\n    #\n     #\n     #\n     #"));
  }
}

Burada deneyin.

Çıktı:

35
35
35
35
32
32

0

Befunge 98, 11 bayt

-!jv~'
@.~<

Çevrimiçi deneyin!

Her ikisi de tek bir boşlukla 32sola ve 35sağa yazdırır .

açıklama

-!jv      This is a no-op the first time through, but used later

    ~'    Pushes the ASCII value of the next character, and pushes 32
-!        Subtracts the 2, and nots. If the character was a space, the top will be 1
  jv      Goes to the second line if the character was not a space

  ~<      Pushes the next characer's ASCII value
 .        Prints it (32 for " " and 35 for "#")
@         Ends the program

Kullandığım bir numara, bir şey yapmasa da -!jvilkini koymaktı. Bu, hem alandan sonra kurtulmama hem de 'bazı dolgulardan tasarruf etmeme izin verdi . Bu son olarak, kod

~' -!jv
   @.~<

15 bayt için.


0

Ruby, 20 bayt

->r{r.strip[1]==' '}

Sol için true, sağ için false döndürür.

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.