Jimmy ipe asılabilir mi?


18

Orijinal babası tarafından başka bir Jimmy meydan okuması. Bu diğer güzel zorluklara bakın .


Hepinizin bildiği gibi, son zamanlarda platformlarda Jimmy ile ilgili zorluklar görüyoruz. Şimdi, Jimmy daha önce de bahsettiğim gibi bir akrobat ve kolunda başka numaralar var.

Bu hilelerden biri halatlarla asılı. İşte Jimmy'nin asabileceği bir ip örneği:

            ||
            ||
            ||
            ||
            ||
            ||

Jimmy bir ipe asıldığında şöyle görünür:

            ||
            ||
           /o\
            ||
            ||
            ||

Halatın soluna veya sağına asılabilir, bu yüzden:

            ||
            ||
            ||
            /o\
            ||
            ||

de geçerlidir. Ama sadece bir vücut parçası tarafından asılamaz, bu yüzden böyle bir şey:

            ||
            ||
            ||
          /o\|
            ||
            ||

geçersizdir. Bir vücut parçası tarafından asılırken, ipin diğer yarısının görünür olduğunu unutmayın, çünkü Jimmy onu örtmez.

Ayrıca, Jimmy ipin altına asmayı sevmez - onu korkutur - bu yüzden:

            ||
            ||
            ||
            ||
            ||
            /o\

geçersizdir.

Meydan okuma

Yukarıdaki gibi bir Jimmy durumunun girişini alın ve Jimmy'nin ipte asılı olup olmayacağını doğru veya sahte bir değerle çıktılayın.

Ayrıntılar

  • Girdi alan bir program yazın. Bu, bir işlev veya herhangi bir uygun giriş yöntemiyle olabilir.

    1. Giriş, bir Jimmy'nin sahnesi ve yukarıda örneklendiği gibi bir ip olmalıdır.
  • Program, Jimmy'nin ipe asılıp takılmayacağına veya ipten düşüp düşmeyeceğine bağlı olarak, konsola doğru veya yanlış bir değer vermelidir.

  • Jimmy'nin ipe asılabilmesi için kriterler:

    1. Vücudunun iki kısmı ipin üstünde.

    2. Halatın dibinde değil.

    3. Havada yüzmüyor.

  • Halatın düz, ||segmentlerden oluştuğunu ve bir karakterden daha uzun olacağını varsayabilirsiniz .

  • Bir ipin tamamını ve bir tekil Jimmy'nin sahnenizde mevcut olacağını varsayabilirsiniz, daha fazla ve daha az değil.

  • Halatın alt kısmında son satır olmayacağını varsayabilirsiniz.

  • Halattan önce ve sonra herhangi bir miktarda ön veya arka boşluğu örtmelisiniz.

Test senaryoları

           ||
           ||
           ||                 TRUTHY
           /o\
           ||
           ||


            ||
            ||
          /o\|                FALSY
            ||
            ||


        ||
       /o\                    TRUTHY
        ||


            ||
           /o\                FALSY


         /o\
          ||                  TRUTHY


            ||
            ||
       /o\  ||                FALSY
            ||
            ||

puanlama

Bu , bu yüzden byte en düşük puan yaklaşık bir hafta sonra kazanır.

Liderler Sıralaması

Aşağıdaki widget / snippet'i genişleterek bu gönderinin lider tablosunu görüntüleyebilirsiniz. Yayınınızın sıralamaya dahil edilebilmesi # header textiçin aşağıdaki bilgileri içeren bir başlığa ( ) ihtiyacınız vardır :

  • Dilin adı (virgül ,veya tire ile bitirin -) ve ardından ...

  • Başlığınızda görünen son sayı olarak bayt sayısı.

Örneğin JavaScript (ES6), 72 bytes, geçerlidir, ancak Fortran, 143 bytes (8-bit)geçersizdir, çünkü bayt sayısı başlıktaki son sayı değildir (cevabınız 8 bayt olarak tanınacaktır - bundan yararlanmayın).

<!-- Run the snippet to see the leaderboard. Report any bugs to @ozewski on Github. -->    <iframe src="https://ozewski.github.io/ppcg-leaderboard/?id=187759" width="100%" height="100%" style="border:none;">Oops, your browser is too old to view this content! Please upgrade to a newer version of your browser that supports HTML5.</iframe><style>html,body{margin:0;padding:0;height:100%;overflow:hidden}</style>


1
Halat her zaman ondan önce aynı sayıda boşluğa sahip olacak mı yoksa bu değişebilir mi?
mprogrammer

@Maxwell Bu değişebilir.
connectyourcharger

Girdiyi, her satırın ayrı bir dize olduğu veya tek bir dize olması gereken liste gibi bir şey olarak alabilir miyiz?
mprogrammer

19
Jimmy gerçekten bir tatil yapmalı
Luis Mendo

7
@LuisMendo Jimmy yaptığı işe adamıştır!
connectyourcharger

Yanıtlar:


13

Japt , 5 bayt

Ben düşünüyorum bu doğru; Ben 16 saat boyunca düz çalışıyorum ve kendi adımı zorlukla biliyorum, bu yüzden değilse şaşırmazdım!

Õø|io

Dene

Õø|io     :Implicit input
Õ         :Transpose
 ø        :Contains?
  |io     :  "|" prepended with "o"

2
16 saat? Şimdi bu özveri!
connectyourcharger

2
Bekle, 5 bayt yazmak 16 saat sürdü? ;-)
Cullub

Bir mola gerekiyor gibi görünüyor (aynı tavsiye küçük Jimmy için geçerli!).
ihavenoidea

@ connectyourcharger, hayır, bu benim hayatım! Adanmışlık bir ara vermeden yapardı. Bunu ben yaptım!
Shaggy

1
@ihavenoidea, Pfft! Öldüğümde uyuyacağım!
Shaggy

22

Python 2 veya 3 ,  33  30 bayt

-3 sayesinde Maxwell

lambda l:'o'in map(max,l[:-1])

Satır listesini kabul eden adsız bir işlev

Çevrimiçi deneyin!

Nasıl?

Jimmy'nin gizlediği ipin alt kısmı olmayan bir kısmı olmalı.

lambda l:'o'in map(max,l[:-1])
lambda l:                      # a function taking l (the lines as strings)
                       l[:-1]  # strip off the last line
               map(max,      ) # maximum of each line (where '|'>'o'>'\'>'/'>' ')
         'o'in                 # was 'o' one of them? (hence Jimmy obscured all the rope)

Üç bayt kaydet:lambda l:'o'in map(max,l[:-1])
mprogrammer

Oh, çok zeki - teşekkürler!
Jonathan Allan

Bu ASCII değerlerinin çok akıllıca kullanılmasıdır. Güzel.
Monica'nın Davası Fonu

16

Python 2, 28 bayt

lambda x:"o', '|"in`zip(*x)`

Çevrimiçi deneyin!

O nasıl çalışır? Girdiyi dizeler listesi olarak alır ve zip dizeye katılır. "|" Varsa Jimmy ipte kalır. altında, bu kod tüm satırları birleştirir ve önce "o" ve ardından "|" olup olmadığını kontrol eder.

Açıklamalı kod:

lambda x: # Creates an anonymous function that takes one argument
  "o', '|" # If this substring is in the zip object, then Jimmy's "o" is above a "|"
    in
    `    # Back quotes change the object into its string representation
    zip(*x)` # Joins the lines together

(Eski Cevap) Python 2 veya 3, 39 bayt

lambda x:1-all("|"in i for i in x[:-1])

Girdiyi dizelerin bir listesi olarak alan, her dize farklı bir çizgidir.

Xnor sayesinde -11 bayt! Jonathan Allan sayesinde -2 bayt!

Çevrimiçi deneyin! (Daha fazla test vakası denemek istiyorsanız, giriş kutusundaki her satır kümesinden sonra bir "." Koyun.)

Bu nasıl çalışıyor? Eğer Jimmy tamamen ip üzerindeyse, o satırda herhangi bir "|" karakter. Bu nedenle, her satırı kontrol edebiliriz ve "|" sonra Jimmy'nin ipte kalabileceğini biliyoruz. Ancak, Jimmy ipin altına asamaz; bu nedenle, son satırı çekimize dahil etmiyoruz. Eğer son çizgi halatın sadece başka bir parçasıysa, önemli olmayacak, çünkü hala geçerli bir satır daha yukarıda bulacağız, ancak son satır Jimmy olanı ise, o zaman bir çizgi bulamaz "|" olmadan her yerde ve False dönecektir.


Çizginin "/" olup olmadığını kontrol etmeden yapabilir misiniz?
xnor

@xnor Yup! -11 bayt
mprogrammer

1
Böyle bir çift kaydedin:lambda x:1-all("|"in i for i in x[:-1])
Jonathan Allan

1
Ah, sen daha hızlıydın :)
Daniil Tutubalin

1
@KlaymenDK İşlev x yerine x [: - 1] üzerinden yinelenir. x [: - 1] listenin son öğe dışındaki tüm öğeleridir, çünkü Python'da negatif indeksler kullanabilirsiniz. Bu nedenle, Jimmy ipin altındaysa, (doğru) bir yanlış sonuç verir.
mprogrammer

8

Jöle ,  9 7  6 bayt

Ṗ<”|ṀẠ

Satır listesini kabul eden monadik bir Bağlantı

Çevrimiçi deneyin!

Nasıl?

Jimmy'nin gizlediği ipin alt kısmı olmayan bir kısmı olmalı.

Ṗ<”|ṀẠ - Main Link: list of lines of characters
Ṗ      - remove last line
  ”|   - pipe character
 <     - less than? (vectorises) - Note that all other characters are
    Ṁ  - maximum
     Ạ - all?

1
Jimmies ile ilgili bu zorlukları yazarken çok garip hissediyorum. Aynı ipten asılı birden fazla Jimmi hayal ettiğinizde sizi garip hissettirmeye başlar.
connectyourcharger

1
@connectyourcharger Öngörü mü?
negatif yedi

@negativeseven Muhtemelen. Jimmy yayınlarının tümünü dizine eklemek için zaten bir meta topluluk wiki'sini düşündüm.
connectyourcharger

1
Dokuz bayt ve bir kez daha, birisinin nasıl ölebileceğini öğreniyoruz.
IMustBeSomeone

1
" Note that all other characters are [less than '|']"?
Outgolfer Erik


5

brainfuck, 79 64 bayt

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

Çevrimiçi deneyin!

0x01 baytını doğruluk için verir ve hiçbir şey için yanlıştır.

Z: 0
A: input
B: 0
C: has no | been found on this line?

>>+<<                       initialize C to 1
,[                          loop over each char

  ----------                set A to 0 if input was \n
  [<]>>                     move to C if input was \n; B otherwise
  [                         if input was \n and C is true
    .-                      output 1
  ]

  +                         this will reinitialize C to 1 if input was \n
                            but also clobber B with 1 if it wasn't
                            now we have { 0   0   0  (1)} if input was \n;
                                        { 0   _  (1)  _ } otherwise
  <[>-]                     clear own cell if the one to the left is positive
                            this yields { 0   0  (0)  1 } and
                                        { 0   _  (0)  _ } as desired

  +[---------<-->]          set A to 0 if input was |
  <[<]>>                    move to C if input was |; B otherwise
  [-]                       zero out current cell: clears C if input was |
  <[>]<                     realign pointer onto A

,]                          break on end of input


4

05AB1E , 5 bayt

Çü%àθ

Çevrimiçi deneyin!

Ç         # convert the input to a 2D array of codepoints
 ü%       # pairwise modulo (vectorized)
   à      # maximum (*not* vectorized, returns a single number)
    θ     # tail (last digit)

Girişte görünebilen tek karakter, \o/ |ilgili kod noktaları 92, 111, 47, 32, 124'tür (girişi bir satır dizisi olarak almayı seçtiğimiz için yeni satır yoktur). Bu sayılardan ikisini modüle ederek olası sonuçlar 0, 13, 15, 17, 19, 28, 30, 32, 45, 47, 92, 111'dir. 111 bunların en büyüğü ve aynı zamanda 1 ile biten tek , bu nedenle kod yalnızca 111 listede varsa doğruluk verir (05AB1E'de yalnızca 1 doğrudur). 111, 111 ( o)% 124 ( |) şeklindedir ve bu nedenle yalnızca girişte oyukarıda a varsa oluşur |.


1
Çift modulo ile çok güzel.
Kevin Cruijssen



2

JavaScript, 39 33 bayt

@Daniil Tutubalin 2 bayt golf için teşekkürler

x=>!!x.match(/^( *)\/[^|]*\n/m)

Bu, sol kolunun ortaya çıktığı ve ipin hiçbirinin göstermediği çizgi olmayan herhangi bir çizgiyle eşleşir.

Çevrimiçi deneyin!


Halatın
dibindeyse

It should fail if he is at the bottom, right? Because Jimmy falls if he is at the bottom fo the rope
mprogrammer

I mean that when I put him at the bottom of the rope your function for some reason returned 1
fəˈnɛtɪk

Hm, nevermind then.
mprogrammer

1
What about /^ *.o. *\n/?
tsh

2

///, 53 50 bytes

/~/\/\~/\/o\\/1~1 /1~ 1/1~|1~/1|~/|~/1.~/ ~/.~/
~.

Try it online!

Because there is no other way to take input in ///, it is hard-coded:

/~/\/\~/\/o\\/1~1 /1~ 1/1~|1~/1|~/|~/1.~/ ~/.~/
~<INPUT HERE>.

Explanation:

The general approach is to replace Jimmy with a unary 1, then remove him from all situations where he is in danger. If he survives, he is outputted. If he doesn't, then nothing is. The ~ in the code are a replacement for //, which allow the code to be shortened by 3 bytes here. They are omitted from the explanation.

/{/\//
/}/\/\//

          {The top two lines allow me to leave comments without disturbing the code.}

/\/o\\/1/ {Replace Jimmy with a 1.}
/1 /1/    {Get rid of any spaces in front of Jimmy. This moves Jimmy towards the rope from the left.}
/ 1/1/    {Get rid of any spaces after Jimmy. This moves Jimmy towards the rope from the right.}

/|1//     {If Jimmy is touching the rope, remove him and the rope.}
/1|//     {This is based on the observation that in all cases where Jimmy is safe, there is no visible rope on his line.}


/|//      {Remove any remaining rope. If Jimmy was touching a rope, it's already too late for him.}
/1.//     {This handles the case where Jimmy is at the bottom of the rope (hence the period at the end).}


/ //      {The remaining lines clean up the output.}
/.//
/
//

           ||
           ||
           ||
           /o\
           ||.

Try it online!


2

Ruby 2.5.5, 22 bytes

->x{x.pop;!x.all? /\|/}

Expects an array of lines. Requires a minimum of version 2.5.5 because this is when Array#all?(pattern) was added.

Because of the constraints that the input will always be a valid scene of Jimmy and a rope, it boils down to whether any of the lines prior to the last line have the rope obscured.




1

Retina, 9 bytes

m`^[^|]+^

Try it online!

Now, I've never programmed in Retina before, but as far as I can tell this works. It is a regular expression that finds a string containing (1) the beginning of the input, (2) no "|" characters, and (3) a newline.

People more familiar with either regular expressions or Retina are encouraged to offer suggestions. -2 bytes thanks to Neil!


Two alternatives: 1) Remove the \n because a new line is not a | and so that will match anyway, and the final ^ suffices to ensure that you actually matched a newline. 2) Use a pilcrow instead of \n and remove the trailing ^ (because that's always true after a newline in multiline mode).
Neil


1

Befunge-98 (PyFunge), 26 24 bytes

]~:a-!#v_' `+
^_-3q#$<
@

Try it online!

Exits with return code 3 if \n is encountered and the last line contained 3 non-space characters, otherwise exits with return code 0 on EOF. Thus, this relies on the last line not containing a trailing newline.

Dissected

]~                     :a-!#v_                ' `+
 Read character,      Branch downwards if   Increment counter on 
 branch up (and        equal to 10 ('\n')   the stack if greater
 loop around) if                            than 32 (' ') and
 end of stream                              implicitly loop

^_-3q#$<                    <
 Return with code 3
 if counter is equal to 3,
 otherwise reset counter
 and return to beginning

@
 Return with exit
 code 0

1

05AB1E (legacy), 6 bytes

ζJ„o|å

Port of @Shaggy's Japt answer.

Input as a list of lines.

Try it online.

Explanation:

ζ       # Zip/transpose the (implicit) strings in the input-list, with space as filler
        # (NOTE: zip/transpose doesn't work on string-list in the new version of 05AB1E,
        #  which is why we use the legacy version)
 J      # Join these zipped/transposed lines together to a single string
  o  # And check if it contains the string "o|"
        # (after which the result is output implicitly)


1

Elm 0.19, 68 bytes

f r=List.any(not<<String.contains"|")(List.take((List.length r)-1)r)

Takes input as a list of lines. Disregarding the last line, it checks whether there are any with no '|' in them – implying the rope is fully covered by Jimmy.

Verify all test cases here.




0

Pyret, 79 bytes

{(l):all2({(r,n):string-char-at(n,string-index-of(r,"o") == "|")},l,link(0,l))}

Expects an array of lines as strings. Makes a copy in link(0,l) where all rows shifted down by one. Goes through each row r and n where n is the row below r. Checks that if Jimmy's body "o" is at some position, then the row below it has a pipe there (i.e. Jimmy's hanging on the rope and isn't at the bottom).

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.