Bisakah Jimmy bertahan di tali?

18

Satu lagi tantangan Jimmy oleh ayah asalnya. Lihat tantangan-tantangan indah lainnya .


Seperti yang Anda semua tahu, baru-baru ini kami telah melihat tantangan terkait dengan Jimmy di platform. Sekarang, Jimmy adalah seorang akrobat seperti yang saya sebutkan sebelumnya, dan dia punya trik-trik lain.

Salah satu trik ini tergantung pada tali. Berikut ini contoh tali yang bisa digantung oleh Jimmy:

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

Ketika Jimmy tergantung pada seutas tali, terlihat seperti ini:

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

Dia dapat menggantung di sebelah kiri atau kanan tali, jadi ini:

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

juga valid. Tetapi ia tidak dapat digantung hanya oleh satu bagian tubuh, jadi hal seperti ini:

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

tidak valid. Perhatikan bahwa ketika ia digantung oleh satu bagian tubuh, separuh tali yang lain terlihat karena Jimmy tidak menutupinya.

Juga, Jimmy tidak suka menggantung di bagian bawah tali - itu membuatnya takut - jadi ini:

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

tidak valid.

Tantangan

Ambil input dari situasi Jimmy seperti yang di atas, dan hasilkan apakah Jimmy akan bertahan atau tidak melalui nilai yang benar atau salah.

Spesifikasinya

  • Tulis program yang membutuhkan input. Ini bisa melalui fungsi atau metode input lain yang sesuai.

    1. Input harus berupa adegan dari satu Jimmy dan tali seperti yang dicontohkan di atas.
  • Program harus menampilkan nilai yang benar atau salah ke konsol berdasarkan pada apakah Jimmy dapat berpegangan pada tali atau apakah ia akan jatuh dari tali, masing-masing.

  • Kriteria untuk Jimmy bisa bertahan:

    1. Dua bagian tubuhnya ada di tali.

    2. Dia tidak berada di bawah tali.

    3. Dia tidak mengambang di udara.

  • Anda dapat mengasumsikan talinya akan lurus, terdiri dari ||bagian - bagian, dan tingginya akan lebih dari satu karakter.

  • Anda dapat mengasumsikan satu tali utuh dan satu Jimmy tunggal akan hadir dalam adegan Anda, tidak lebih dan tidak kurang.

  • Anda dapat mengasumsikan tidak akan ada garis baru di bagian bawah tali.

  • Anda harus menutupi sejumlah ruang depan atau belakang sebelum dan sesudah tali.

Uji kasus

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


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


        ||
       /o\                    TRUTHY
        ||


            ||
           /o\                FALSY


         /o\
          ||                  TRUTHY


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

Mencetak gol

Ini adalah , jadi skor terendah dalam byte menang setelah sekitar satu minggu.

Papan peringkat

Anda dapat melihat papan peringkat untuk posting ini dengan memperluas widget / snippet di bawah ini. Agar posting Anda dimasukkan dalam peringkat, Anda perlu tajuk ( # header text) dengan info berikut:

  • Nama bahasa (akhiri dengan tanda koma ,atau tanda hubung -), diikuti oleh ...

  • Jumlah byte, sebagai angka terakhir yang muncul di header Anda.

Misalnya, JavaScript (ES6), 72 bytesvalid, tetapi Fortran, 143 bytes (8-bit)tidak valid karena jumlah byte bukan angka terakhir di header (jawaban Anda akan dikenali sebagai 8 byte - jangan manfaatkan ini).

<!-- 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>

hubungkan charger Anda
sumber
1
Apakah tali selalu memiliki jumlah ruang yang sama sebelumnya, atau dapatkah itu bervariasi?
mprogrammer
@ Maxwell Itu bisa bervariasi.
connectyourcharger
Bisakah kita mengambil input sebagai sesuatu seperti daftar, di mana setiap baris adalah string yang terpisah, atau apakah itu harus menjadi satu string tunggal?
mprogrammer
19
Jimmy harus benar-benar berlibur
Luis Mendo
7
@LuisMendo Jimmy didedikasikan untuk apa yang dia lakukan!
connectyourcharger

Jawaban:

13

Japt , 5 byte

Saya pikir ini benar; Saya telah bekerja selama 16 jam terus menerus dan nyaris tidak tahu nama saya sendiri sehingga saya tidak akan terkejut jika tidak!

Õø|io

Cobalah

Õø|io     :Implicit input
Õ         :Transpose
 ø        :Contains?
  |io     :  "|" prepended with "o"
Shaggy
sumber
2
16 jam? Nah, itu dedikasi!
connectyourcharger
2
Tunggu, jadi Anda butuh 16 jam untuk menuliskan 5 byte? ;-)
Cullub
Sepertinya Anda butuh istirahat (saran yang sama berlaku untuk Jimmy kecil!).
ihavenoidea
@connectyourcharger Anda, tidak, itu hidup saya! Dedikasi akan melakukannya tanpa istirahat. Yang saya lakukan!
Shaggy
1
@ihavenoidea, Pfft! Aku akan tidur saat aku mati!
Shaggy
22

Python 2 atau 3 ,  33  30 byte

-3 Terima kasih kepada Maxwell

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

Fungsi yang tidak disebutkan namanya menerima daftar garis

Cobalah online!

Bagaimana?

Perlu ada bagian tali yang dikaburkan oleh Jimmy yang bukan bagian bawah.

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)
Jonathan Allan
sumber
Hemat tiga byte:lambda l:'o'in map(max,l[:-1])
mprogrammer
Oh, sangat cerdik - terima kasih!
Jonathan Allan
Itu adalah penggunaan nilai ASCII yang sangat pintar. Bagus.
Dana Gugatan Monica
16

Python 2, 28 byte

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

Cobalah online!

Bagaimana cara kerjanya? Dibutuhkan input sebagai daftar string, dan zip bergabung dengan string. Jimmy tetap di tali jika ada "|" di bawah "o", jadi kode ini bergabung dengan semua baris dan memeriksa apakah ada "o" diikuti oleh "|".

Kode beranotasi:

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

(Jawaban Lama) Python 2 atau 3, 39 byte

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

Fungsi yang mengambil input sebagai daftar string, masing-masing string menjadi garis yang berbeda.

-11 byte terima kasih kepada xnor! -2 byte terima kasih kepada Jonathan Allan!

Cobalah online! (Jika Anda ingin mencoba lebih banyak kasus uji, cukup beri tanda "." Setelah setiap rangkaian baris di kotak input.)

Bagaimana cara kerjanya? Nah, jika Jimmy sepenuhnya di atas tali, maka garis itu tidak akan memiliki "|" karakter. Oleh karena itu, kita dapat memeriksa setiap baris, dan jika kita menemukannya tanpa "|" karakter, maka kita tahu bahwa Jimmy dapat tetap di tali. Namun, Jimmy tidak bisa bertahan di bagian bawah tali; oleh karena itu, kami tidak memasukkan baris terakhir dalam cek kami. Jika baris terakhir hanyalah bagian lain dari tali, maka tidak masalah, karena kita masih akan menemukan baris yang valid lebih tinggi, tetapi jika baris terakhir adalah dengan Jimmy, maka tidak akan menemukan garis tanpa "|" di mana saja, dan akan mengembalikan False.

mprogrammer
sumber
Bisakah Anda melakukannya tanpa tanda bahwa saluran tersebut memiliki tanda "/"?
xnor
@xnor Yup! -11 byte
mprogrammer
1
Simpan pasangan seperti ini:lambda x:1-all("|"in i for i in x[:-1])
Jonathan Allan
1
Aduh, kamu lebih cepat :)
Daniil Tutubalin
1
@KlaymenDK Fungsi ini dijalankan melalui x [: - 1], bukan x. x [: - 1] adalah semua elemen dalam daftar kecuali elemen terakhir, karena dalam Python Anda dapat menggunakan indeks negatif. Oleh karena itu, itu (dengan benar) mengembalikan hasil yang salah jika Jimmy berada di bagian bawah tali.
mprogrammer
8

Jelly ,  9 7  6 byte

Ṗ<”|ṀẠ

Tautan monadik yang menerima daftar garis

Cobalah online!

Bagaimana?

Perlu ada bagian tali yang dikaburkan oleh Jimmy yang bukan bagian bawah.

Ṗ<”|ṀẠ - Main Link: list of lines of characters
Ṗ      - remove last line
  ”|   - pipe character
 <     - less than? (vectorises) - Note that all other characters are
    Ṁ  - maximum
     Ạ - all?
Jonathan Allan
sumber
1
Saya merasa sangat aneh menulis tantangan ini tentang Jimmies. Itu mulai membuat Anda merasa aneh begitu Anda membayangkan beberapa Jimmies menggantung di tali yang sama.
connectyourcharger
1
@connectyourcharger Anda Foreshadowing?
negatif tujuh
@negativeseven Mungkin. Saya telah mempertimbangkan wiki komunitas meta untuk mengindeks semua posting Jimmy.
Hubungkan chargerAnda
1
Sembilan byte, dan sekali lagi, kami masih mencari tahu bagaimana seseorang bisa mati.
IMustBeSomeone
1
" Note that all other characters are [less than '|']"?
Erik the Outgolfer
5

brainfuck, 79 64 byte

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

Cobalah online!

Menghasilkan byte 0x01 untuk truey dan tidak ada untuk falsy.

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
Gagang pintu
sumber
5

Grime , 5 byte

\o/\|

Cobalah online!

Alat yang tepat untuk pekerjaan itu.

\o        # match an "o"
  /       # above
   \|     # a "|"
Grimmy
sumber
4

05AB1E , 5 byte

Çü%àθ

Cobalah online!

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

Satu-satunya karakter yang dapat muncul dalam input adalah \o/ |, dengan masing-masing codepoints 92, 111, 47, 32, 124 (tidak ada baris baru, karena kami memilih untuk mengambil input sebagai larik garis). Hasil yang mungkin dengan memodulasi dua angka-angka ini adalah 0, 13, 15, 17, 19, 28, 30, 32, 45, 47, 92, 111. 111 adalah yang terbesar di antara mereka, dan juga satu-satunya yang berakhir dengan 1 , jadi kode akan menampilkan kebenaran jika dan hanya jika 111 ada dalam daftar (hanya 1 yang benar di 05AB1E). 111 adalah 111 ( o)% 124 ( |), dan hanya terjadi jika ada di oatas |dalam input.

Grimmy
sumber
1
Sangat bagus dengan modulo berpasangan.
Kevin Cruijssen
3

APL (Dyalog Unicode) , 8 byte SBCS

Fungsi awalan diam-diam anonim, mengambil matriks karakter sebagai argumen.

1'o|'⍷⍉

Cobalah online!

 mengubah urutan

'o|'⍷ topeng untuk di mana-mana osegera diikuti oleh|

1∊ Apakah salah satu anggotanya?

Adám
sumber
3

APL Dyalog Diperpanjang, 14 13 11 9 byte

3∊¯1+/⍤↓<

Cobalah online!

dzaima
sumber
-2:3∊¯1+/⍤↓<
Adám
2

JavaScript, 39 33 byte

Terima kasih @Daniil Tutubalin untuk bermain golf 2 byte

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

Ini cocok dengan garis mana pun yang bukan garis di mana lengan kirinya muncul dan tidak ada tali yang muncul.

Cobalah online!

fəˈnɛtɪk
sumber
Tampaknya gagal jika dia berada di bagian bawah tali
fəˈnɛtɪk
Itu harus gagal jika dia di bawah, kan? Karena Jimmy jatuh jika dia berada di bawah tali
mprogrammer
Maksud saya, ketika saya meletakkannya di bagian bawah tali, fungsi Anda untuk beberapa alasan dikembalikan 1
fəˈnɛtɪk
Hm, lupakan saja.
mprogrammer
1
Bagaimana dengan /^ *.o. *\n/?
tsh
2

/// , 53 50 byte

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

Cobalah online!

Karena tidak ada cara lain untuk mengambil input di ///, kode-keras:

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

Penjelasan:

Pendekatan umum adalah untuk menggantikan Jimmy dengan 1 unary, lalu singkirkan dia dari semua situasi di mana dia dalam bahaya. Jika dia selamat, dia dikeluarkan. Jika tidak, maka tidak ada. The ~dalam kode adalah pengganti //, yang memungkinkan kode yang akan disingkat dengan 3 byte sini. Mereka dihilangkan dari penjelasan.

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

          {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\
           ||.

Cobalah online!

Kamerad SparklePony
sumber
2

Ruby 2.5.5, 22 byte

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

Mengharapkan array garis. Membutuhkan minimal versi 2.5.5 karena ini adalah saatArray#all?(pattern) ditambahkan.

Karena kendala bahwa input akan selalu menjadi adegan yang valid dari Jimmy dan seutas tali, maka intinya adalah apakah salah satu garis sebelum garis terakhir memiliki tali yang dikaburkan.

DaveMongoose
sumber
2

Kotlin , 93 84 byte

fun j(a:List<String>){print(a.count{!it.contains("|")}==1&&!a.last().contains("o"))}

Cobalah online!

Quinn
sumber
1

Retina , 9 byte

m`^[^|]+^

Cobalah online!

Sekarang, saya belum pernah memprogram di Retina sebelumnya, tetapi sejauh yang saya tahu ini bisa berhasil. Ini adalah ekspresi reguler yang menemukan string berisi (1) awal input, (2) no "|" karakter, dan (3) baris baru.

Orang yang lebih terbiasa dengan ekspresi reguler atau Retina didorong untuk menawarkan saran. -2 byte terima kasih kepada Neil!

mprogrammer
sumber
Dua alternatif: 1) Hapus \nkarena baris baru bukan |dan sehingga akan tetap cocok, dan yang terakhir ^cukup untuk memastikan bahwa Anda benar-benar cocok dengan baris baru. 2) Gunakan pilcrow sebagai ganti \ndan hapus trailing ^(karena itu selalu benar setelah baris baru dalam mode multiline).
Neil
1

Befunge-98 (PyFunge) , 26 24 byte

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

Cobalah online!

Keluar dengan kode kembali 3 jika \n ditemui dan baris terakhir berisi 3 karakter non-spasi, jika tidak keluar dengan kode pengembalian 0 pada EOF. Dengan demikian, ini bergantung pada baris terakhir yang tidak mengandung baris baru.

Dibedah

]~                     :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
negatif tujuh
sumber
1

05AB1E (warisan) , 6 byte

ζJ„o|å

Port of @Shaggy 's Japt answer .

Masukan sebagai daftar baris.

Cobalah online.

Penjelasan:

ζ       # 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)
Kevin Cruijssen
sumber
1

Elm 0,19, 68 byte

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

Mengambil input sebagai daftar baris. Mengabaikan baris terakhir, ia memeriksa apakah ada yang tidak'|' di dalamnya - menyiratkan tali sepenuhnya ditutupi oleh Jimmy.

Verifikasi semua kasus uji di sini .

Ketidakseimbangan
sumber
0

Pyth , 9 byte

sPm!sqR\|

Suite uji!

Tuan Xcoder
sumber
0

Pyret, 79 byte

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

Mengharapkan array garis sebagai string. Membuat salinan di link(0,l)mana semua baris digeser ke bawah oleh satu. Melewati setiap baris rdan di nmana n adalah baris di bawah r. Periksa apakah tubuh Jimmy "o"berada pada posisi tertentu, maka baris di bawahnya memiliki pipa di sana (mis. Jimmy tergantung di tali dan tidak di bagian bawah).

MLavrentyev
sumber