Emojim kuru mu?


17

Bu benim evcil hayvan emojim, Billy:

-_-

Emojiler yağmurda olmaktan hoşlanmıyor, bu yüzden Billy üzgün ... Daha iyi hissetmesi için ona bir şemsiye çizelim!

  /\
 /  \
/    \

  -_-

Bu iyi, tamamen şemsiyesi ile kaplı! İşte sadece bir kısmının ele alındığı bir örnek:

  /\
 /  \
/    \

     -_-

Bu durumda, vücudunun 2 ve 3 bölümleri yağmura maruz kalır.

Şemsiyeler birçok şekil ve boyutta gelir, ancak her zaman bir dizi artan eğik çizgi ve /ardından bir dizi azalan ters eğik çizgi oluşur \. Örneğin, bunların hepsi geçerli şemsiyelerdir:

  /\
 /  \
/    \

/\

    /\
   /  \
  /    \
 /      \
/        \

Ve bunlar değil:

/   \

\/

  \
 / \
/   \

 0\
/  \

//\\
/  \

Emojimin hangi bölümlerinin yağmura maruz kaldığını belirlemelisin.

Açıklamalar

  • Programınız (veya fonksiyonunuz) giriş olarak 2d dizgisini alacaktır. Bu, dilinize en uygun veya doğal olan herhangi bir biçimde olabilir. Dizeler dizisi, karakter dizileri dizisi, içinde yeni satırlar olan bir dize vb.

  • Emojinin hangi bölümlerinin yağmura maruz kaldığını çıkarmalısınız. Bunu netleştirdiğiniz sürece sıfır indeksli veya tek indeksli olabilir. Çıktı herhangi bir makul biçimde olabilir. Tüm emoji yağmurdan korunuyorsa, hiçbir şey (veya boş bir dizi) çıkmayın.

  • Tüm girişler geçerli bir şemsiye ve aynı emoji'yi sahip olacağını varsayabiliriz: -_-. Emoji her zaman girişin son satırında olacaktır, ancak bunlar şemsiye ve emoji arasında birkaç boş satır olabilir.

  • Şemsiyenin veya emojinin bir parçası olmayan her şey bir boşluk karakteri veya yeni satır olacaktır.

  • Giriş, her satırın uzunluğu aynı olacak şekilde boşluklarla doldurulur.

Standart boşluklar uygulanır ve bayt cinsinden en kısa cevap kazanır!

Test G / Ç:

Tüm örnek vakalar tek dizinleme kullanır.

  /\
 /  \
/    \

  -_-

Outputs: []

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

   /\
  /  \

     -_-

Outputs: [2, 3]

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

    /\
   -_-

Outputs: [1]

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

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




               -_-

Outputs: [1, 2, 3]

2
Emojinin yağmurdaki kısımlarını çıkarabilir miyiz? yani ["_","-"].
Rɪᴋᴇʀ

Dilimiz dizeleri destekliyorsa, yine de 2D karakter dizisini kabul edebilir miyiz? Örneğin, JavaScript'teki Dizi'nin Dize'den farklı işlevleri vardır.
Patrick Roberts

@PatrickRoberts Evet, bu kabul edilebilir.
DJMcMayhem

@ EᴀsᴛᴇʀʟʏIʀᴋ Hayır, sayıları çıkarmalısınız.
DJMcMayhem

1
Sanırım ifade demek istiyorsun. Kuru emoji 🔥 (veya sanırım NH️)
NH

Yanıtlar:


8

05AB1E , 18 17 15 bayt

Kod:

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

Açıklama:

|                  # 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.

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! ( boşlukları olan tüm satırları aynı uzunlukta doldurduğunuzdan emin olun .


5

JavaScript (ES6), 95 bayt

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

Girdi, her satır bir kare oluşturmak için boşluklarla doldurulmuş bir dizeler dizisi olmalıdır. Çıktı, 1 dizinli sayı dizisidir.

açıklama

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>


4

JavaScript (ES6), 92 bayt

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

Düzensiz bir çizgi dizisini kabul eder ve 1 dizinli bir sonuç döndürür. Açıklama:

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

3

Java 8 lambda, 241 218 201 191 185 184 (veya 161) karakterleri

Çünkü biliyorsunuz, Java'nın kuru emojilere de ihtiyacı var.

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;}

Bir ArrayList'e , emojinin yağmura maruz kalan kısımlarını içeren bir HashSet Yığını döndürür (indeksleme 0'dan başlar). Her şey paketlenmemiş:

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;
    }
}

Güncellemeler

Bazı temel golf yaptım. Bu, bildirimleri bir araya getirmeyi, bazı karakterleri kaydetmek ve döngüleri kısaltmak için ascii değerleriyle karşılaştırmayı içerir.

@ User902383, sadece Listeler yerine ArrayLists kullanarak döküm hatamı işaret ettiği için teşekkürler. ArrayLists / List'leri, daha fazla karakter kaydeden HashSets / Sets ile değiştirdim. Ayrıca ucu iç döngüde bir foreach döngü kullanmak için teşekkürler! Bu değişiklik sayesinde son ızgara sırasının dizini için biraz daha kısaltan bir değişken oluşturabiliyorum. Toplam 17 karakter kaydedildi!

@KevinCruijssen, başlangıçta jenerik ilaçları çıkarmayı önerdi, bir adım daha ileri gittim: Tüm jenerikleri çıkar. Bu 10 karakter daha kaydeder.

Foreach döngüsünden for döngüsüne geri döndüm. Bu, ascii değerlerinin karşılaştırmasını kısaltmamı sağlayan son satırı karşılaştırmayı atlamayı mümkün kılar. Bu bağlamda, yalnızca '/', '\' ve '_' değerlerinin 46'dan büyük bir ascii değeri vardır. Son satırı > 46 checkkontrol etmezsek, gerçek değeri kontrol etmek için bir yerine kullanabiliriz .

@ User902383'e bir lambda kullandığımı ve başka bir karakteri tıraş etmek için Set + HashSet yerine List + Stack kullanabileceğimi gösterdiğiniz için tekrar teşekkürler.


Dize döndüren sürüm

@ user902383 bunun yerine sadece rakamlarla bir String oluşturabileceğime dikkat çekti. Bu çok ucuz görünüyor, ancak diğerleri bu şekilde çözüyor gibi görünüyor, bu yüzden bir String dönüşü kullanan daha kısa bir sürüm:

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;}

Ungolfed:

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;
    }
}

2
kural numarası 1'i always program to an interfaceListArrayList
kırdınız

1
Döngü için iç size ek bayt birkaç vermelidir foreach döngü ile değiştirilebilir düşünüyorum
user902383

1
Tamamen emin değilim, ama =new HashSet<>();büyük olasılıkla golf olabilir =new HashSet();.
Kevin Cruijssen

1
@Frozn Neden izin verilmiyor? Derleyicinin kod golfü sırasında çok fazla uyarı verdiğini biliyorum. Ne emin değilim eğer kod hala aynı çalışıyorsa, test etmedim. Eğer öyleyse, kaldırmak daha <>2 bayt kaydeder. :)
Kevin Cruijssen

2
@Frozn iyi eski Java'da haklısın, ama şimdi lambda var ve lambda notasyonunda tip belirtmiyorsun. dolayısıyla (4) ve (5) 'e Set(3) HashSet(7)karşısınız . ListStack
user902383

3

V , 20 19 bayt (rakip değil)

G^R123?/
f\GddHÍó

Alternatif, rakip sürüm (21 bayt):

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

Çevrimiçi deneyin! (Not, tryitonline.net, V'nin biraz eski bir sürümünü kullanır. Bunu telafi etmek için bu biraz daha uzun bir sürümü kullanır)

Açıklama:

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

Bu tek başına 17 baytta doğru sonucu verir. Ancak, bazı ekstra boşluklar da yaratır. Umurumda değil, ama kendime haksız bir avantaj sağlamak istemiyorum, bu yüzden iki bayt ekliyorum:

Íó          "Remove all whitespace

3

JavaScript (ES6), 117 112 bayt

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)

Karakter dizilerinin düzensiz dizelerini kabul eder ve 0 dizinli sonuçlar döndürür.

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

gösteri

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>


Yorumlarınızı beğendim!
sintax

2

Retina , 56 bayt

Bayt sayımı ISO 8859-1 kodlamasını varsayar.

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

Çevrimiçi deneyin!

Bu, regex'in emoji karakterlerinden biriyle eşleştiği tek bir ikame aşamasıdır, ancak aynı yatay konumda yukarıda bir yerde boşluk olmayan bir karakter (yani a /veya \) olması ve ardından buna kadar emoji karakterlerinin sayısını yakalamamız gerekir. nokta. Bu eşleşme, bu çekilmemiş emoji karakterinin dizinini veren son yakalamanın uzunluğu ile değiştirilir. Normal ifade |\D, hiçbir şeyle değiştirilmeyen her şeyi eşleştirmek için bir de içerir , bu nedenle diğer tüm karakterleri kaldırırız.


Bu normal ifadenin emoji karakterlerinin üzerinde nasıl göründüğünü daha fazla açıklayabilir misiniz?
sintax

1
@sintax Kendisinden önceki karakterleri saymak için dengeleme gruplarını kullanır . Bu yatay konumunu ölçer. Sonra /ya da\ önceki şeyler eşleştirip, tekrar o gruptan haşhaş ediyorum o emin olun sonra ve tamamen grup tükenmiş ettik. Bu temel olarak emojinin yatay konumunun ve çatı karakterinin eşleşmesini sağlar.
Martin Ender

1

Pyth, 27 23 bayt

0 endeksli.

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

Çevrimiçi deneyin!

açıklama

-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

Tarih

27 bayt: sM:#"^ *\d"0.T:R"-_-"s`M3.z ( Çevrimiçi deneyin! )


1

Matlab, 43 bayt

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

Bu kod, girdinin son satırında boşluk olmayan karakterlerin sütun konumlarını bulur, bu sütunlardaki boşluk olmayan karakterlerin sayısını toplar ve böyle bir karakterin (emoji karakteri, şemsiyeyle korunmayan!) Nerede olduğunu bulur. . Bu kod sadece iyi biçimlendirilmiş şemsiyeler için uygun sonuçları döndürür (emojimizin üstündeki herhangi bir karakterin iyi biçimlendirilmiş bir şemsiyenin parçası olduğunu varsayar).

İşte test senaryoları yazmak ve işimi kontrol etmek için biraz yardımcı kod:

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) '-_-']);

Koşu x = thrht(7)verir

x =

   /\    
  /  \   
 /    \  

      -_-

Veya x = twht(0) verir

x =

   /\   
  /  \  

 -_-     

0

APL, 31 bayt

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

Bu, girdi olarak bir karakter matrisi alır.

Testler:

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

Açıklama:

  • '-_-'⍷⍵: girişin boyutunu sıfırlar matrisinde, başlangıcın başlangıcını işaretleyin '-_-' 1 ile işaretleyin.
  • +\+\: Satırlar üzerinde hareketli toplam. İlki yapar 0 0 0 1 0 0 ...içine 0 0 0 1 1 1 ...ikincisi sonra içine yapar,0 0 0 1 2 3 ... .
  • ⍵∊'/\': girişteki tüm '/' ve '\' örneklerini 1s ile işaretleyin.
  • ∨⌿: or sütunlar üzerinden. Bu şemsiyenin kapladığı son sıradaki tüm 1 konumuyla işaretlenir.
  • ~: not , çünkü tam tersine ihtiyacımız var
  • (...)/ ...: Önceden çalışan toplamlar matrisinden ortaya çıkarılan tüm sütunları seçin
  • ,: Ortaya çıkan matristeki tüm değerlerin bir listesini alın.
  • (⍳3)∩: 1 2 3Bu ile arasındaki kavşak (bu, boşluklar olan seçili 0'lardan veya daha yüksek değerlerden kurtulur).

0

Python 2, 114111 bayt

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)

0 tabanlı indeksleme kullanır.

Burada deneyin .

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.