อิโมจิของฉันแห้งหรือไม่


17

นี่คืออีโมจิสัตว์เลี้ยงของฉันบิลลี่:

-_-

อิโมจิไม่ชอบอยู่กลางสายฝนดังนั้นบิลลี่จึงเศร้า ... มาวาดร่มกันเพื่อทำให้เขารู้สึกดีขึ้น!

  /\
 /  \
/    \

  -_-

นี่เป็นสิ่งที่ดีเขาได้รับร่มของเขาทั้งหมด! นี่คือตัวอย่างที่ครอบคลุมเพียงบางส่วนของเขา:

  /\
 /  \
/    \

     -_-

ในกรณีนี้ส่วนที่ 2 และ 3 ของร่างกายของเขาถูกฝน

ร่มมาในหลายรูปร่างและขนาด แต่พวกเขากำลังทำเสมอขึ้นมาจากชุดของทับน้อยไปหามาก/ตามมาด้วยชุดของ \backslashes ตัวอย่างเช่นสิ่งเหล่านี้เป็นร่มที่ถูกต้องทั้งหมด:

  /\
 /  \
/    \

/\

    /\
   /  \
  /    \
 /      \
/        \

และนี่ไม่ใช่:

/   \

\/

  \
 / \
/   \

 0\
/  \

//\\
/  \

คุณต้องพิจารณาว่าอิโมจิของฉันส่วนใดที่อยู่ท่ามกลางสายฝน

ชี้แจง

  • โปรแกรม (หรือฟังก์ชั่น) ของคุณจะรับสาย 2d เป็นอินพุต สิ่งนี้สามารถอยู่ในรูปแบบใดก็ได้ที่สะดวกที่สุดหรือเป็นธรรมชาติกับภาษาของคุณ อาร์เรย์ของสตริงอาร์เรย์ของอักขระสตริงที่มีการขึ้นบรรทัดใหม่เป็นต้น

  • คุณต้องแสดงผลส่วนของอีโมจิที่เผชิญกับฝน สิ่งนี้สามารถทำดัชนีได้เป็นศูนย์หรือหนึ่งดัชนีตราบใดที่คุณทำให้ชัดเจน เอาต์พุตสามารถอยู่ในรูปแบบที่สมเหตุสมผล หากอิโมจิทั้งหมดได้รับการปกป้องจากสายฝนไม่มีอะไรส่งออก (หรืออาร์เรย์ที่ว่างเปล่า)

  • -_-คุณสามารถสรุปได้ว่าปัจจัยการผลิตทั้งหมดจะมีร่มที่ถูกต้องและอีโมจิเดียวกัน อีโมจิจะอยู่ในบรรทัดสุดท้ายของอินพุตอย่างไรก็ตามอาจมีบรรทัดว่างหลายบรรทัดระหว่างร่มและอิโมจิ

  • ทุกอย่างที่ไม่ได้เป็นส่วนหนึ่งของร่มหรืออีโมจิจะเป็นตัวละครเว้นวรรคหรือขึ้นบรรทัดใหม่

  • อินพุตจะถูกเสริมด้วยช่องว่างเพื่อให้ความยาวของแต่ละบรรทัดเท่ากัน

ช่องโหว่มาตรฐานใช้และคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!

ทดสอบ IO:

กรณีตัวอย่างทั้งหมดจะใช้การจัดทำดัชนีแบบหนึ่ง

  /\
 /  \
/    \

  -_-

Outputs: []

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

   /\
  /  \

     -_-

Outputs: [2, 3]

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

    /\
   -_-

Outputs: [1]

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

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




               -_-

Outputs: [1, 2, 3]

2
เราสามารถเอาส่วนของอีโมจิที่อยู่ในสายฝนออกมาได้ไหม ["_","-"]กล่าวคือ
Rɪᴋᴇʀ

หากภาษาของเรารองรับสตริงเราจะยังสามารถรับอักขระอาร์เรย์ 2 มิติได้หรือไม่ ตัวอย่างเช่น Array in JavaScript มีฟังก์ชั่นที่แตกต่างจาก String
Patrick Roberts

@PatrickRoberts ใช่มันเป็นที่ยอมรับ
DJMcMayhem

@ ใช่ฉันไม่คุณควรเอาท์พุทตัวเลข
DJMcMayhem

1
ฉันคิดว่าคุณหมายถึงอิโมติคอน อิโมจิแบบแห้งจะเป็น🔥 (หรือ☂️ฉันคิดว่า)
NH

คำตอบ:


8

05AB1E , 18 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

Java 8 lambda, 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 a HashSet a 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 เพื่อบันทึกอักขระบางตัวและทำให้ลูปสั้นลง

ขอบคุณ @ user902383 ที่ชี้ให้เห็นข้อผิดพลาดในการถ่ายโอนข้อมูลของฉันโดยใช้ ArrayLists แทนที่จะเป็นแค่รายการ ฉันแทนที่ ArrayLists / Lists ด้วย HashSets / Sets ซึ่งช่วยประหยัดอักขระได้มากขึ้น นอกจากนี้ขอขอบคุณสำหรับเคล็ดลับของเขาที่จะใช้วงหน้า foreach ในวงด้านใน! จากการเปลี่ยนแปลงนั้นฉันสามารถสร้างตัวแปรสำหรับดัชนีของแถวกริดสุดท้ายซึ่งสั้นลงอีกเล็กน้อย บันทึกตัวละครทั้ง 17 ตัวแล้ว!

@KevinCruijssen แนะนำให้ลบ generics ในการเริ่มต้นฉันไปหนึ่งขั้นตอนต่อไป: ลบ generics ทั้งหมด สิ่งนี้จะบันทึกอีก 10 อักขระ

ฉันเปลี่ยนกลับจาก foreach loop เป็น for for loop มันทำให้เป็นไปได้ที่จะข้ามการเปรียบเทียบบรรทัดสุดท้ายซึ่งในทางกลับกันทำให้ฉันสามารถย่อการเปรียบเทียบค่า ascii ให้สั้นลง ในบริบทนี้เพียง '/', '\' และ '_' มีค่า ascii มากกว่า 46 หากเราไม่ตรวจสอบบรรทัดสุดท้ายเราสามารถใช้> 46 checkแทนเพื่อตรวจสอบค่าจริง

ขอขอบคุณอีกครั้งที่ @ user902383 สำหรับการแสดงให้ฉันเห็นว่าฉันใช้แลมบ์ดาและสามารถใช้ List + Stack แทน Set + HashSet เพื่อกำจัดอักขระอื่น


สตริงที่ส่งคืนเวอร์ชัน

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

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
คุณแตกกฎหมายเลข 1 always program to an interfaceถ้าคุณใช้ListแทนคุณArrayListสามารถบันทึก 5 ไบต์
user902383

1
ฉันคิดว่า Inner for loop สามารถถูกแทนที่ด้วย foreach loop ซึ่งควรเพิ่มจำนวนไบต์ให้คุณอีกสองเท่า
user902383

1
ไม่แน่ใจทั้งหมด แต่=new HashSet<>();มีโอกาสมากที่สุดที่จะเล่นกอล์ฟ=new HashSet();ได้
Kevin Cruijssen

1
@ Frozn ทำไมถึงไม่อนุญาต ฉันรู้ว่าคอมไพเลอร์สร้างคำเตือนซึ่งเกิดขึ้นมากในระหว่างการเล่นกอล์ฟ สิ่งที่ฉันไม่แน่ใจคือถ้ารหัสของคุณยังคงทำงานเหมือนเดิมไม่ได้ทำการทดสอบ ถ้าเป็นเช่นนั้นจะเป็นการลบการ<>ประหยัด 2 ไบต์ :)
Kevin Cruijssen

2
@ Frozn คุณจะถูกต้องใน java เก่าดี แต่ตอนนี้เรามีแลมบ์ดาและในสัญกรณ์แลมบ์ดาคุณไม่ได้ระบุประเภท ดังนั้นคุณมีSet(3) HashSet(7)ต่อList(4) และStack(5)
user902383

3

V , 20 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 ไบต์ อย่างไรก็ตามมันยังสร้างพื้นที่ว่างเพิ่มเติม ฉันไม่รังเกียจ แต่ฉันไม่ต้องการให้ตัวเองได้เปรียบอย่างไม่เป็นธรรมดังนั้นฉันจึงเพิ่มสองไบต์:

Íó          "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)

ยอมรับอาร์เรย์ ragged ของสตริง อาเรย์ของอักขระและส่งคืนผลลัพธ์ที่จัดทำดัชนี 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>


ฉันชอบความคิดเห็นของคุณ!
sintax

2

เรติน่า 56 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

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

ลองออนไลน์!

นี่คือขั้นตอนการทดแทนเดียวซึ่ง regex จับคู่หนึ่งในตัวละครอิโมจิโดยมีตัวละครที่ไม่ใช่ช่องว่าง (เช่น a /หรือ\) ที่ใดที่หนึ่งข้างต้นในตำแหน่งแนวนอนเดียวกันจากนั้นเราจะจับตัวอักษรอิโมจิจำนวนมากถึง จุด. การจับคู่นี้จะถูกแทนที่ด้วยความยาวของการจับครั้งสุดท้ายซึ่งทำให้เรามีดัชนีของตัวละครอิโมจิที่ไม่ถูกป้องกัน regex ยังมีการ|\Dจับคู่ทุกอย่างที่จะถูกแทนที่ด้วยไม่มีอะไรเลยดังนั้นเราจึงลบตัวละครอื่น ๆ ทั้งหมด


คุณช่วยอธิบายเพิ่มเติมได้ไหมว่า regex นี้ดูเหนือตัวอักษรอิโมจิอย่างไร
sintax

1
@sintax มันใช้กลุ่มที่สมดุลในการนับตัวละครก่อนหน้าในบรรทัดของตัวเอง สิ่งนี้วัดตำแหน่งแนวนอน แล้วหลังจากที่ผมเคยตรงกัน/หรือ\ฉัน popping จากกลุ่มนั้นอีกครั้งในขณะที่ตรงกับสิ่งที่ก่อนหน้านั้นแล้วให้แน่ใจว่าฉันได้หมดลงอย่างสมบูรณ์กลุ่ม สิ่งนี้ทำให้แน่ใจได้ว่าตำแหน่งแนวนอนของอิโมจิและตัวละครหลังคาตรงกัน
Martin Ender

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)

รหัสนี้จะค้นหาตำแหน่งคอลัมน์ของอักขระที่ไม่ใช่ช่องว่างในแถวสุดท้ายของอินพุตรวมจำนวนอักขระที่ไม่ใช่ช่องว่างในคอลัมน์เหล่านั้นและพบว่ามีอักขระดังกล่าวเพียงตัวเดียวเท่านั้น (อักขระของ emoji ยกเลิกการป้องกันโดยร่ม!) . รหัสนี้จะให้ผลลัพธ์ที่เหมาะสมสำหรับร่มที่มีรูปแบบที่ดีเท่านั้น (ซึ่งถือว่าตัวละครที่อยู่เหนืออิโมจิของเรานั้นเป็นส่วนหนึ่งของร่มที่มีรูปแบบที่ดี)

นี่คือรหัสยูทิลิตี้เล็กน้อยสำหรับการเขียนกรณีทดสอบและตรวจสอบงานของฉัน:

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 ...คนที่สองก็เข้า0 0 0 1 2 3 ...มา
  • ⍵∊'/\': ทำเครื่องหมายการเกิดขึ้นทั้งหมดของ '/' และ '\' ในอินพุตด้วย 1s
  • ∨⌿: orเหนือคอลัมน์ เครื่องหมายนี้มี 1 ตำแหน่งทั้งหมดในแถวสุดท้ายที่อยู่ภายใต้ร่ม
  • ~: notเพราะเราต้องการสิ่งที่ตรงกันข้าม
  • (... )/... : เลือกคอลัมน์ที่ไม่ได้เปิดทั้งหมดจากเมทริกซ์ผลรวมจากก่อนหน้า
  • ,: รับรายการค่าทั้งหมดในเมทริกซ์ที่ได้
  • (⍳3)∩: จุดตัดระหว่างนั้นกับ1 2 3(สิ่งนี้จะกำจัด 0s ใด ๆ หรือค่าที่สูงกว่าซึ่งจะเป็นการเว้นวรรค)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.