Apakah emoji saya kering?

17

Ini emoji peliharaan saya, Billy:

-_-

Emoji tidak suka berada di tengah hujan, jadi Billy sedih ... Mari kita ambilkan payung untuk membuatnya merasa lebih baik!

  /\
 /  \
/    \

  -_-

Ini bagus, dia sepenuhnya tertutupi payungnya! Ini adalah contoh di mana hanya sebagian dari dirinya yang terlindungi:

  /\
 /  \
/    \

     -_-

Dalam hal ini, bagian 2 dan 3 tubuhnya terkena hujan.

Payung datang dalam berbagai bentuk dan ukuran, tetapi mereka selalu terdiri dari serangkaian tebasan menaik /diikuti oleh serangkaian backslash menurun \. Misalnya, ini semua payung yang valid:

  /\
 /  \
/    \

/\

    /\
   /  \
  /    \
 /      \
/        \

Dan ini bukan:

/   \

\/

  \
 / \
/   \

 0\
/  \

//\\
/  \

Anda perlu menentukan bagian mana dari emoji saya yang terkena hujan.

Klarifikasi

  • Program Anda (atau fungsi) akan mengambil string 2d sebagai input. Ini bisa dalam format apa pun yang paling nyaman atau alami untuk bahasa Anda. Array string, array array karakter, string dengan baris baru di dalamnya, dll.

  • Anda harus menampilkan bagian emoji mana yang terkena hujan. Ini bisa diindeks nol atau diindeks satu, selama Anda membuatnya jelas. Output bisa dalam format yang masuk akal. Jika seluruh emoji terlindung dari hujan, tidak menghasilkan apa-apa (atau array kosong).

  • Anda dapat mengasumsikan bahwa semua input akan memiliki payung valid, dan emoji yang sama: -_-. Emoji akan selalu berada di baris terakhir dari input, namun mungkin ada beberapa baris kosong antara payung dan emoji.

  • Segala sesuatu yang bukan bagian dari payung atau emoji akan menjadi karakter ruang atau baris baru.

  • Input akan diisi dengan spasi sehingga panjang setiap baris adalah sama.

Celah standar berlaku, dan jawaban tersingkat dalam byte menang!

Tes IO:

Semua kasus sampel akan menggunakan pengindeksan satu.

  /\
 /  \
/    \

  -_-

Outputs: []

----------------

   /\
  /  \

     -_-

Outputs: [2, 3]

----------------

    /\
   -_-

Outputs: [1]

----------------

     /\
    /  \
   /    \
  /      \
 /        \
/          \




               -_-

Outputs: [1, 2, 3]
DJMcMayhem
sumber
2
Bisakah kita mengeluarkan bagian-bagian emoji yang sedang hujan? yaitu ["_","-"].
R
Jika bahasa kami mendukung string, apakah kami masih dapat menerima array karakter 2D? Misalnya, Array dalam JavaScript memiliki fungsi berbeda yang tersedia untuknya daripada String.
Patrick Roberts
@ PatrickRoberts Ya, itu bisa diterima.
DJMcMayhem
@ EᴛᴇʀʟʏsᴛᴇʀʟʏIʀᴋ Tidak, Anda harus menampilkan angkanya.
DJMcMayhem
1
Saya pikir maksud Anda emoticon. Emoji kering adalah 🔥 (atau ☂️ kurasa)
NH.

Jawaban:

8

05AB1E , 18 17 15 byte

Kode:

|…-_-123:)ø€J€ï

Penjelasan:

|                  # Take all input as a list of strings.
 …-_-              # 3-char string, which results into "-_-".
     123:)         # Replace "-_-" with 123.
          ø        # Zip, resulting into the columns of the 2D array.
           €J      # Join each of them.
             ە    # For each, convert to integer. If this is not possible, it will ignore
                     the result.
                   # Implicitly output the array.

Menggunakan pengkodean CP-1252 . Cobalah online! (pastikan untuk mengisi semua garis dengan spasi dengan panjang yang sama ..

Adnan
sumber
5

JavaScript (ES6), 95 byte

a=>[...a[n=0]].map((_,i)=>a.map(s=>(c=s[i])>"-"&c<"_"?p=1:n+=!++c,p=0)|p<!c&&o.push(n),o=[])&&o

Input harus berupa array string, dengan setiap baris diisi dengan spasi untuk membentuk persegi. Output adalah array angka 1-diindeks.

Penjelasan

var solution =

a=>
  [...a[n=0]].map((_,i)=>  // n = current index of emoji, for each column i of input
    a.map(s=>              // for each line s
      (c=s[i])             // c = character in column
      >"-"&c<"_"?p=1       // p = 1 if column is protected from rain
      :n+=!++c,            // increment n if emoji character found, c = 1 if last line
                           // contained a space in the current column
      p=0
    )
    |p<!c&&o.push(n),      // if the emoji is not protected in the current column
    o=[]
  )
  &&o
<textarea id="input" rows="6" cols="40">   /\   
  /  \  
        
     -_-</textarea><br />
<button onclick="result.textContent=solution(input.value.split('\n'))">Go</button>
<pre id="result"></pre>

pengguna81655
sumber
4

JavaScript (ES6), 92 byte

a=>a.map(s=>s.replace(/\S/g,(c,i)=>c>'-'&c<'_'?u[i]=3:++n&u[i]||r.push(n)),n=0,u=[],r=[])&&r

Menerima larik garis yang acak-acakan dan mengembalikan hasil yang diindeks 1. Penjelasan:

a=>a.map(               Loop through all lines
 s=>s.replace(/\S/g,    Loop through all non-whitepsace
  (c,i)=>c>'-'&c<'_'    If it's part of the umbrella
   ?u[i]=3              Mark that column as dry
   :++n&                Add 1 to the emoji index
     u[i]||             If the column is not dry
      r.push(n)         Add the emoji index to the result
  ),n=0,u=[],r=[]       Initialise variables
 )&&r                   Return result
Neil
sumber
3

Java 8 lambda, 241 218 201 191 185 184 (atau 161) karakter

Karena kamu tahu, Jawa juga butuh emoji kering.

import java.util.*;f->{int e,i=e=-1,c,l=f.length-1;while(++e<f[l].length&&f[l][e]!=45);List p=new Stack();l:for(;++i<3;){for(char[]r:f)if((c=r[e+i])==47|c==92)continue l;p.add(i);}return p;}

Ini mengembalikan ArrayList a HashSet Stack yang berisi bagian-bagian emoji yang terkena hujan (pengindeksan dimulai pada 0). Semuanya terbuka:

import java.util.*;

public class Q82668 {
    static List isEmojiDryRevE(char[][] fieldToCheck) {
        int emojiStart, i = emojiStart = -1, j, rows = fieldToCheck.length - 1;

        while (++emojiStart < fieldToCheck[rows].length && fieldToCheck[rows][emojiStart] != 45)
            ;

        List parts = new Stack();
        emojiLoop: for (; ++i < 3;) {
            for (j = -1; ++j < rows;) {
                if (fieldToCheck[j][emojiStart + i] > 46) {
                    // umbrella part found
                    continue emojiLoop;
                }
            }
            // no umbrella part found
            parts.add(i);
        }
        return parts;
    }
}

Pembaruan

Saya melakukan beberapa golf dasar. Ini termasuk menempatkan deklarasi bersama-sama, bandingkan dengan nilai ascii untuk menyimpan beberapa karakter dan memperpendek loop.

Terima kasih kepada @ user902383 untuk menunjukkan kesalahan dump saya menggunakan ArrayLists bukan hanya Daftar. Saya mengganti ArrayLists / Lists dengan HashSets / Sets yang menyimpan lebih banyak karakter. Juga terima kasih atas tipnya untuk menggunakan loop foreach di loop batin! Melalui perubahan itu saya dapat membuat variabel untuk indeks baris grid terakhir yang lebih pendek. Keseluruhan 17 karakter telah disimpan!

@KevinCruijssen menyarankan untuk menghapus obat generik pada inisialisasi, saya melangkah lebih jauh: Hapus semua obat generik. Ini menyimpan 10 karakter lainnya.

Saya beralih kembali dari foreach loop ke for for. Ini memungkinkan untuk melewati membandingkan baris terakhir yang pada gilirannya memungkinkan saya untuk mempersingkat perbandingan nilai-nilai ascii. Dalam konteks ini hanya '/', '\' dan '_' memiliki nilai ascii lebih dari 46. Jika kita tidak memeriksa baris terakhir, kita dapat menggunakan a > 46 checksebagai gantinya untuk memeriksa nilai aktual.

Terima kasih lagi kepada @ user902383 karena menunjukkan kepada saya bahwa saya menggunakan lambda dan dapat menggunakan Daftar + Stack alih-alih Set + HashSet untuk mencukur karakter lain.


Versi pengembalian string

@ user902383 menunjukkan saya malah bisa membuat sebuah String dengan digit. Ini kedengarannya sangat curang, tetapi yang lain tampaknya menyelesaikannya dengan cara ini jadi di sini adalah versi yang lebih pendek menggunakan pengembalian String:

f->{int e,i=e=-1,c,r=f.length-1;while(++e<f[r].length&&f[r][e]!=45);String p="";l:for(;++i<3;){for(char[]o:f)if((c=o[e+i])==47|c ==92)continue l;p+=i;}return p;}

Tidak Disatukan:

public class Q82668 {
    public static String isEmojiDryRevD(char[][] fieldToCheck) {
        int emojiStart, i = emojiStart = -1, c, rows = fieldToCheck.length - 1;

        while (++emojiStart < fieldToCheck[rows].length && fieldToCheck[rows][emojiStart] != 45)
            ;

        String parts = "";
        emojiLoop: for (; ++i < 3;) {
            for (char[] row : fieldToCheck) {
                if ((c = row[emojiStart + i]) == 47 | c == 92) {
                    // umbrella part found
                    continue emojiLoop;
                }
            }
            // no umbrella part found
            parts += i;
        }
        return parts;
    }
}
Frozn
sumber
2
Anda melanggar aturan nomor 1 always program to an interface, jika Anda menggunakan Listbukannya ArrayListAnda dapat menyimpan 5 byte
user902383
1
Saya pikir inner for loop dapat digantikan oleh foreach loop yang seharusnya memberi Anda beberapa byte tambahan
user902383
1
Tidak sepenuhnya yakin, tetapi =new HashSet<>();kemungkinan besar bisa bermain golf =new HashSet();.
Kevin Cruijssen
1
@Frozn Mengapa itu tidak diizinkan? Saya tahu kompiler menghasilkan peringatan, yang sering terjadi selama kode-golf. Yang saya tidak yakin adalah apakah kode Anda masih berfungsi sama, belum mengujinya. Jika ya, daripada menghapus <>menghemat 2 byte. :)
Kevin Cruijssen
2
@Frozn Anda akan benar di java lama yang baik, tapi sekarang kami memiliki lambda, dan dalam notasi lambda Anda tidak menentukan tipe. maka Anda memiliki Set(3) HashSet(7)terhadap List(4) dan Stack(5).
user902383
3

V , 20 19 byte (tidak bersaing)

G^R123?/
f\GddHÍó

Alternatif, versi yang bersaing (21 byte):

G^R123?/
f\òjòddHÍó

Cobalah online! (Catatan, tryitonline.net menggunakan versi V. yang sedikit lama. Untuk mengimbanginya, ia menggunakan versi yang sedikit lebih lama ini)

Penjelasan:

G^          "Move to the first non-whitespace character on the last column
  R123<esc> "Replace the emojii with '123'

?/          "Move backwards to the last '/' character
  <C-v>     "Start a blockwise selection
       f\G  "Move the selection to the next '\', and then to the last line
d           "Delete the block selection
 dH         "Delete the umbrella

Ini saja menghasilkan hasil yang benar dalam 17 byte. Namun, itu juga menciptakan ruang kosong ekstra. Saya tidak keberatan, tapi saya tidak ingin memberi diri saya keuntungan yang tidak adil, jadi saya menambahkan dua byte:

Íó          "Remove all whitespace
DJMcMayhem
sumber
3

JavaScript (ES6), 117 112 byte

s=>s.map(r=>r.map((c,i)=>~'-_'[o='indexOf'](c)&&!s.some(a=>~'/\\'[o](a[i]))?i-r[o]('-'):-1)).pop().filter(n=>~n)

Menerima larik string array karakter yang acak-acakan , dan mengembalikan hasil yang diindeks 0.

s=>s.map(     // for each row
  r=>         // row
    r.map(    // for each character
      (c,i)=> // character, index
        ~'-_'[o='indexOf'](c) // if character is part of emoji
        &&                    // and
        !s.some(              // none of the rows have umbrella in this column
          a=>~'/\\'[o](a[i])
        )
        ? // then return 0-index of emoji
          i-r[o]('-')
        : // else return -1
          -1
  )
)
.pop()         // get last element of string array
.filter(n=>~n) // filter out -1s

Demo

f=s=>s.map(r=>r.map((c,i)=>~'-_'[x='indexOf'](c)&&!s.some(a=>~'/\\'[x](a[i]))?i-r[x]('-'):-1)).pop().filter(n=>~n)
i.oninput=()=>o.value=f(i.value.split`\n`.map(r=>r.split``))
i.oninput()
<textarea rows=6 cols=20 id=i>
   /\
  /  \

     -_-</textarea>
<br/>
<input readonly id=o>

Patrick Roberts
sumber
Saya suka komentar Anda!
sintax
2

Retina , 56 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

m`(?<!(?(2)!)^(?<-2>.)*\S(.*¶)+(.)*).(?<=([-_]+))|\D
$.3

Cobalah online!

Ini adalah tahap substitusi tunggal, di mana regex cocok dengan salah satu karakter emoji, asalkan ada karakter non-spasi (yaitu a /atau \) di suatu tempat di atas dalam posisi horizontal yang sama, dan kemudian kami menangkap jumlah karakter emoji hingga saat itu. titik. Pertandingan ini diganti dengan panjang tangkapan terakhir itu, yang memberi kami indeks karakter emoji yang tidak terselubung ini. Regex juga berisi |\Duntuk mencocokkan semua hal lain yang diganti dengan apa-apa, jadi kami menghapus semua karakter lainnya.

Martin Ender
sumber
Bisakah Anda menjelaskan lebih lanjut bagaimana tampilan regex ini di atas karakter emoji?
sintax
1
@sintax Ini menggunakan grup penyeimbang untuk menghitung karakter sebelumnya pada barisnya sendiri. Ini mengukur posisi horizontal. Kemudian setelah saya sudah cocok dengan /atau \, aku muncul dari kelompok itu lagi sembari menyamakan hal-hal sebelumnya yang , dan kemudian pastikan saya sudah benar-benar habis kelompok. Ini pada dasarnya memastikan bahwa posisi horizontal emoji dan karakter atap cocok.
Martin Ender
1

Pyth, 27 23 byte

Diindeks 0.

-m.xsd;.T:R"-_-"s`M3.zd

Cobalah online!

Penjelasan

-m.xsd;.T:R"-_-"s`M3.zd

                    .z   all lines of input, as a list
         :R"-_-"s`M3     replace "-_-" by "012" 
                         "012" is generated by s`M3
       .T                transpose, return all columns
                         The sample input becomes:
                           0
                           1
                          /2
                         / 
                         \ 
                         \
 m   d                   for each line:
  .xs                        attempt to convert to integer.
      ;                      if errors, replace to space
-                     d  remove all spaces

Sejarah

27 byte: sM:#"^ *\d"0.T:R"-_-"s`M3.z( Coba online! )

Biarawati Bocor
sumber
1

Matlab, 43 byte

@(x)find(sum((x(:,x(end,:)~=' '))~=' ')==1)

Kode ini menemukan posisi kolom karakter non-spasi di baris akhir input, menjumlahkan jumlah karakter non-spasi di kolom tersebut, dan menemukan di mana hanya ada satu karakter seperti itu (karakter emoji, tidak terlindung oleh payung!) . Kode ini hanya mengembalikan hasil yang tepat untuk payung yang terbentuk dengan baik (kode ini mengasumsikan karakter apa pun di atas emoji kami adalah bagian dari payung yang terbentuk dengan baik).

Berikut ini sedikit kode utilitas untuk menulis kasus pengujian dan memeriksa pekerjaan saya:

ws = @(x) repmat(' ',1,x);  %  for making strings of spaces
% for writing three-storey umbrellas over an emoji located left-edge at position x
thrht = @(x) strvcat([ws(3) '/\' ws(3); ws(2) '/  \' ws(2); ws(1) '/' ws(4) '\' ws(1); ws(8)], [ws(x-1) '-_-']);
twht = @(x) strvcat([ws(3) '/\' ws(3); ws(2) '/  \' ws(2); ws(8)], [ws(x-1) '-_-']);

Berlari x = thrht(7)memberi

x =

   /\    
  /  \   
 /    \  

      -_-

Atau x = twht(0) memberi

x =

   /\   
  /  \  

 -_-     
sintaks
sumber
0

APL, 31 byte

{(⍳3)∩,(~∨⌿⍵∊'/\')/+\+\'-_-'⍷⍵}

Ini mengambil matriks karakter sebagai input.

Tes:

      t1 t2 t3 t4
┌──────┬────────┬──────┬─────────────────┐
│  /\  │   /\   │    /\│     /\          │
│ /  \ │  /  \  │   -_-│    /  \         │
│/    \│        │      │   /    \        │
│      │     -_-│      │  /      \       │
│  -_- │        │      │ /        \      │
│      │        │      │/          \     │
│      │        │      │                 │
│      │        │      │                 │
│      │        │      │                 │
│      │        │      │                 │
│      │        │      │              -_-│
└──────┴────────┴──────┴─────────────────┘
      {(⍳3)∩,(~∨⌿⍵∊'/\')/+\+\'-_-'⍷⍵} ¨ t1 t2 t3 t4
┌┬───┬─┬─────┐
││2 3│1│1 2 3│
└┴───┴─┴─────┘

Penjelasan:

  • '-_-'⍷⍵: dalam matriks nol ukuran input, tandai posisi awal '-_-' dalam input dengan 1.
  • +\+\: Menjalankan jumlah di atas baris. Yang pertama merek 0 0 0 1 0 0 ...ke0 0 0 1 1 1 ... , yang kedua kemudian membuatnya menjadi 0 0 0 1 2 3 ....
  • ⍵∊'/\': tandai semua kemunculan '/' dan '\' pada input dengan 1s.
  • ∨⌿: or lebih dari kolom. Ini menandai 1 semua posisi pada baris terakhir yang dicakup oleh payung.
  • ~: not , karena kita membutuhkan yang sebaliknya
  • (...)/ ...: Pilih semua kolom yang tidak tertutup dari matriks penjumlahan yang berjalan dari sebelumnya
  • ,: Dapatkan daftar semua nilai dalam matriks yang dihasilkan.
  • (⍳3)∩: Persimpangan antara itu dan 1 2 3(ini menghilangkan 0s yang dipilih atau nilai yang lebih tinggi, yang akan menjadi spasi).
marinus
sumber
0

Python 2, 114 111 byte

def f(a):c=a.find("\n")+1;r=a.rfind;g=lambda i:([i],[])[r("\\")%c>=r("-")%c-2+i>=r("/")%c];print g(0)+g(1)+g(2)

Menggunakan pengindeksan berbasis 0.

Coba di sini .

Chuck Morris
sumber