絵文字は乾燥していますか?


17

これは私のペットの絵文字、ビリーです。

-_-

絵文字は雨の中にいるのが好きではないので、ビリーは悲しいです...気分を良くするために彼に傘を引きましょう!

  /\
 /  \
/    \

  -_-

これはいいです、彼は完全に彼の傘で覆われています!以下は、彼の一部だけがカバーされている例です。

  /\
 /  \
/    \

     -_-

この場合、彼の体のセクション2と3は雨にさらされています。

傘にはさまざまな形やサイズがありますが、常に一連の昇順のスラッシュと/それに続く一連の降順のバックスラッシュで構成されています\。たとえば、これらはすべて有効な傘です。

  /\
 /  \
/    \

/\

    /\
   /  \
  /    \
 /      \
/        \

これらは次のとおりではありません。

/   \

\/

  \
 / \
/   \

 0\
/  \

//\\
/  \

絵文字のどの部分が雨にさらされているかを判断する必要があります。

明確化

  • プログラム(または関数)は、入力として2D文字列を受け取ります。これは、あなたの言語にとって最も便利なまたは自然な形式であれば何でもかまいません。文字列の配列、文字の配列の配列、改行を含む文字列など。

  • 絵文字のどの部分が雨にさらされているかを出力する必要があります。これを明確にする限り、これはゼロインデックスまたは1インデックスにすることができます。出力は、適切な形式で作成できます。絵文字全体が雨から保護されている場合は、何も出力しません(または空の配列)。

  • すべての入力に有効な傘と同じ絵文字があると仮定できます:-_-。絵文字は常に入力の最後の行にありますが、傘と絵文字の間にいくつかの空の行がある場合があります。

  • 傘や絵文字の一部ではないものはすべて、スペース文字または改行になります。

  • 入力にはスペースが埋め込まれ、各行の長さが同じになります。

標準的な抜け穴が適用され、バイト単位の最短回答が勝ちます!

テストIO:

すべてのサンプルケースで1つのインデックスが使用されます。

  /\
 /  \
/    \

  -_-

Outputs: []

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

   /\
  /  \

     -_-

Outputs: [2, 3]

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

    /\
   -_-

Outputs: [1]

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

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




               -_-

Outputs: [1, 2, 3]

2
雨の中にある絵文字の部分を出力できますか?すなわち["_","-"]
Rɪᴋᴇʀ

言語が文字列をサポートしている場合でも、文字の2D配列を受け入れることができますか?たとえば、JavaScriptの配列には、文字列とは異なる使用可能な関数があります。
パトリックロバーツ

@PatrickRobertsはい、それは受け入れられます。
DJMcMayhem

@EᴀsᴛᴇʀʟʏIʀᴋいいえ、数字を出力する必要があります。
DJMcMayhem

1
あなたは絵文字を意味すると思います。乾いた絵文字は🔥(または☂️と思う)
NHです。

回答:


8

05AB1E18 17 15バイト

コード:

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

説明:

|                  # 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エンコードを使用します。オンラインでお試しください!すべての行に同じ長さのスペースを入れるようにしてください。


5

JavaScript(ES6)、95バイト

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

入力は文字列の配列で、各行はスペースで埋められて正方形を形成する必要があります。出力は、1から始まる番号の配列です。

説明

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バイト

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

不規則な行の配列を受け入れ、1インデックスの結果を返します。説明:

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

ジャワ8ラムダ、241 218 201 191 185 184(又は161)の文字

知っているので、Javaには乾燥した絵文字も必要です。

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

雨にさらされる絵文字の部分を含むArrayList、HashSet、Stackを返します(インデックス作成は0から始まります)。ラップされていないもの:

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

更新

基本的なゴルフをしました。これには、宣言をまとめて、ASCII値と比較して一部の文字を保存し、ループを短縮することが含まれます。

リストだけでなくArrayListsを使用してダンプの間違いを指摘してくれた@ user902383に感謝します。ArrayLists / Listsを、さらに文字を保存するHashSets / Setsに置き換えました。また、内側のループでforeachループを使用するヒントをありがとう!その変更により、最後のグリッド行のインデックス用の変数を作成することができます。全体で17文字が保存されました!

@KevinCruijssenは、初期化でジェネリックを削除することを提案しました。さらに一歩進めて、すべてのジェネリックを削除します。これにより、さらに10文字が節約されます。

foreachループからforループに切り替えました。これにより、最後の行の比較をスキップすることができ、その結果、ascii値の比較を短縮できます。このコンテキストでは、 '/'、 '\'、および '_'のアスキー値は46を超えます。最後の行をチェックしない場合、> 46 check代わりにaを使用して実際の値をチェックできます。

再びラムダを使用し、Set + HashSetの代わりにList + Stackを使用して別の文字を削除できることを示してくれた@ user902383に感謝します。


文字列を返すバージョン

@ user902383は、代わりに数字で文字列を作成することができると指摘しました。これは非常にチートに聞こえますが、他の人はこの方法でそれを解決するようですので、文字列の戻り値を使用した短いバージョンがあります:

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

ゴルフをしていない:

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
ルール番号1を破りalways program to an interfaceList代わりに使用するArrayListと5バイトを節約できます
-user902383

1
内部forループはforeachループで置き換えることができると思います
。foreach

1
完全=new HashSet<>();には定かではありませんが、おそらくにゴルフすることができ=new HashSet();ます。
ケビンCruijssen

1
@Froznなぜ許可されないのですか?コンパイラが警告を生成することは知っていますが、これはコードゴルフ中に頻繁に発生します。私が確信していないのは、コードがまだ同じように動作するかどうか、テストしていないことです。存在する場合、削除するよりも<>2バイト節約されます。:)
ケビンクルーイッセン

2
@Froznは古き良きJavaで正しいのですが、今ではラムダがあり、ラムダ表記ではタイプを指定しません。したがって、あなたは(4)と(5)Set(3) HashSet(7)に対して反対です。ListStack
user902383

3

V20 19バイト(非競合)

G^R123?/
f\GddHÍó

代替の競合バージョン(21バイト):

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

オンラインでお試しください!(注意、tryitonline.netは少し古いバージョンのVを使用します。これを補うために、この少し長いバージョンを使用します)

説明:

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

これだけでも17バイトで正しい結果が生成されます。ただし、余分な空白も作成されます。気にしませんが、自分に不公平な利点を与えたくないので、2バイト追加します。

Íó          "Remove all whitespace

3

JavaScript(ES6)、117 112バイト

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)

文字列の文字 配列の不規則配列を受け入れ、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

デモ

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>


あなたのコメントが好きです!
シンタックス

2

網膜、56バイト

バイトカウントはISO 8859-1エンコーディングを前提としています。

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

オンラインでお試しください!

これは単一の置換段階で、正規表現が絵文字文字の1つと一致します。ただし、同じ水平位置のどこかにスペース以外の文字(a /または\)があり、それまでの絵文字の数をキャプチャします。ポイント。この一致は、最後のキャプチャの長さに置き換えられ、この保護されていない絵文字のインデックスを提供します。正規表現には、|\D何も置換されない他のすべてと一致するaも含まれているため、他のすべての文字を削除します。


この正規表現が絵文字の上にどのように見えるかをもっと説明できますか?
シンタックス

1
@sintax バランシンググループを使用して、独自の行でその前にある文字をカウントします。これにより、水平位置が測定されます。私がマッチしましたその後の後/または\前のものに一致する一方で、私は再びそのグループから飛び出してることを確認してください、その後、私は完全にグループを消耗してきました。これにより、基本的に絵文字の水平位置と屋根の文字が一致するようになります。
マーティンエンダー

1

Pyth、27 23バイト

0インデックス付き。

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

オンラインでお試しください!

説明

-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

歴史

27バイト:sM:#"^ *\d"0.T:R"-_-"s`M3.zオンラインそれを試してみてください!


1

Matlab、43バイト

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

このコードは、入力の最終行で非スペース文字の列位置を見つけ、それらの列の非スペース文字の数を合計し、そのような文字(傘で保護されていない絵文字の文字!) 。このコードは、整形式の傘に対してのみ適切な結果を返します(絵文字の上の文字は整形式の傘の一部であると想定しています)。

テストケースを作成し、作業内容を確認するためのユーティリティコードを次に示します。

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

実行x = thrht(7)すると

x =

   /\    
  /  \   
 /    \  

      -_-

または x = twht(0) 与える

x =

   /\   
  /  \  

 -_-     

0

APL、31バイト

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

これは、入力として文字行列を取ります。

テスト:

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

説明:

  • '-_-'⍷⍵:入力のサイズをゼロにする行列で、入力の開始位置を1でマークし'-_-'ます。
  • +\+\:行で合計を実行しています。最初のものは0 0 0 1 0 0 ...になり0 0 0 1 1 1 ...、2番目のものはそれになり0 0 0 1 2 3 ...ます。
  • ⍵∊'/\':入力内のすべての「/」および「\」を1でマークします。
  • ∨⌿or列上。これは、傘で覆われている最後の行のすべての位置に1のマークを付けます。
  • ~not、我々は反対が必要だから
  • (... )/...:以前の実行中の合計マトリックスからすべてのカバーされていない列を選択します
  • ,:結果のマトリックス内のすべての値のリストを取得します。
  • (⍳3)∩:との交差点1 2 3(これは、選択された0以上の値(スペースになる)を取り除きます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.