ค้นหาเข็มในกองหญ้า


38

เมื่อกำหนดให้กองหญ้าแห้งขนาดสี่เหลี่ยมอย่างน้อย 2x2 ประกอบด้วยอักขระ ASCII ที่พิมพ์ได้เหมือนกันทั้งหมดให้เอาตำแหน่งออก (นับจากด้านบนซ้าย) ของเข็มซึ่งเป็นอักขระที่แตกต่างกัน

ตัวอย่างเช่นหากกองหญ้าต่อไปนี้เป็นอินพุต:

#####
###N#
#####
#####

ผลลัพธ์ควรเป็น3,1เมื่อทำดัชนีเป็นศูนย์ (สิ่งที่ฉันจะใช้ในการท้าทายนี้) หรือ4,2เมื่อทำดัชนีหนึ่งรายการ

กองหญ้าสามารถประกอบด้วยอักขระ ASCII ที่พิมพ์ได้:

^^^
^^^
^N^
^^^
^^^
^^^

เอาท์พุท: 1,2

และเข็มจะเป็นอักขระ ASCII ที่พิมพ์ได้อื่น ๆ :

jjjjjj
j@jjjj
jjjjjj

เอาท์พุต 1,1

เป็นไปได้ที่จะมีเข็มอยู่ที่มุม:

Z8
88

เอาท์พุต 0,0

88
8Z

เอาท์พุต 1,1

หรือมีเข็มที่ขอบ:

>>>>>>>>>>
>>>>>>>>>:
>>>>>>>>>>

เอาท์พุต 9,1

กฎและคำชี้แจง

  • เข้าและส่งออกจะได้รับโดยวิธีการที่สะดวกใดซึ่งหมายความว่าคุณสามารถป้อนข้อมูลเป็นรายการของตัวละครเป็นสตริงเดี่ยว ฯลฯ
  • คุณสามารถพิมพ์ผลลัพธ์ไปที่ STDOUT หรือส่งคืนเป็นผลลัพธ์ของฟังก์ชัน โปรดระบุในการส่งของคุณสิ่งที่สั่งซื้อออกเป็น (เช่นแนวนอนแล้วแนวตั้งตามที่ใช้ในความท้าทายหรือในทางกลับกัน)
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
  • คุณทำไม่ได้ได้รับเลือกอักขระที่จะใช้ นั่นคือความท้าทาย
  • กองหญ้ารับประกันว่าจะมีขนาดอย่างน้อย 2x2 ดังนั้นจึงไม่คลุมเครือซึ่งเป็นเข็มและหญ้าแห้ง
  • มีอินพุตเพียงเข็มเดียวเท่านั้นและมีขนาดเพียงหนึ่งตัวอักษร
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

กรณีทดสอบที่แนะนำ: 88\n8Z(แน่นอนว่ามีอักขระสองตัว)
Kevin Cruijssen

เราสามารถรับอินพุตเป็นอาร์เรย์หลายมิติได้หรือไม่? เช่น [['#', '#', '#', '#', '#'], ['#', '#', '#', 'N', '#'], ['#' , '#', '#', '#', '#'], ['#', '#', '#', '#', '#', '#']];
640KB

2
@gwaugh ชอบรายชื่อตัวละครหรือไม่? ใช่มันไม่เป็นไร (และเรียกอย่างชัดเจนว่าตกลง)
AdmBorkBork

3
เราสามารถรับอินพุตเป็นคู่ของสตริงโดยไม่ต้องขึ้นบรรทัดใหม่และความกว้าง (หรือความสูง) ของกองหญ้า? ie("########N###########", 5)
คนที่

3
@someone ใช่แม้ว่ามันจะไม่มีองค์ประชุมจริงแต่ฉันรู้สึกว่าควรได้รับอนุญาต
AdmBorkBork

คำตอบ:


17

R , 49 47 44 ไบต์

function(m,`?`=which)m==names(?table(m)<2)?T

ลองออนไลน์!

รับอินพุตเป็นเมทริกซ์ส่งคืนพิกัด 1 ดัชนี


4
การwhichมอบหมายนั้นราบรื่นน่าอับอาย
CriminallyVulgar

4
ฉันตื่นเต้นมากที่จะลองทำสิ่งนี้ใน R จากนั้นฉันก็เห็นสิ่งนี้และตัดสินใจที่จะร้องไห้ด้วยความกลัวแทน
Sumner18

9

Perl 6 ,41 38 37 ไบต์

บันทึก 3 ไบต์ด้วย @nwellnhof

บันทึก 1 ไบต์ขอบคุณ Jo King

{map {[+] ^∞Z*!<<.&[Z~~]},$_,.&[Z]}

ลองออนไลน์!

คำอธิบาย

ใช้อินพุตเป็นรายการของตัวละครและส่งกลับรายการความยาว 2 ที่มีพิกัด X และ Y เป็นศูนย์ของเข็ม

มันทำงานโดยใช้บล็อก{[+] ^∞ Z* !<<.&[Z~~]}ในการป้อนข้อมูลและในการแปลง .&[Z~~]ผ่านคอลัมน์ทั้งหมดของการโต้แย้งและส่งกลับTrueถ้าองค์ประกอบทั้งหมดเหมือนกันFalseมิฉะนั้น จากนั้นเราจะลบล้างค่าทั้งหมด (ดังนั้นเราจึงมีรายการที่มีบูลหนึ่งรายการต่อหนึ่งคอลัมน์ที่บูลตอบคำถาม "เข็มอยู่ในคอลัมน์นั้นหรือไม่?") แล้วคูณด้วยองค์ประกอบที่ชาญฉลาดด้วยลำดับ 0,1,2 .. ( True = 1และFalse = 0) และรวมรายการดังนั้นผลลัพธ์ของบล็อกทั้งหมดคือหมายเลข 0 ของคอลัมน์ที่พบเข็ม

วิธีที่ดีกว่าของ Nwellnhof Perl 6 , 34 bytes

{map *.first(:k,*.Set>1),.&[Z],$_}

ลองออนไลน์!

คำอธิบาย

โดยทั่วไปวิธีเดียวกันมีประสิทธิภาพมากกว่า มันยังคงใช้บล็อกบนอาเรย์และทรานซิสชั่น แต่ตอนนี้บล็อกจะแปลงแถวทั้งหมดเป็นSetsและตรวจสอบจำนวนองค์ประกอบ firstฟังก์ชั่นจากนั้นให้ดัชนี (เนื่องจาก:k) ของแถวแรกที่มีมากกว่า 1 องค์ประกอบ เนื่องจากว่าลำดับของ$_และ.&[Z]จำเป็นต้องสลับ


วิธีการที่ดี! 34 ไบต์ด้วยfirst(:k), และSet .&[Z]
nwellnhof

@nwellnhof ทำได้ดีมาก โดยทั่วไปคุณพบสิ่งที่ฉันต้องการค้นหา แต่ล้มเหลวในการทำเช่นนั้น :—) (ฉันก็ไม่รู้เหมือนกันว่าคุณสามารถเขียน.&[Z]ได้)
Ramillies

โดยทั่วไปแล้ว.&[op]ดูเหมือนจะไม่เทียบเท่า[op] $_แต่ใช้งานได้ด้วยZเหตุผลบางประการ
nwellnhof

@ โจกิ้งขอบคุณ!
Ramillies

9

Python 2 , 57 ไบต์

lambda m:[map(len,map(set,a)).index(2)for a in zip(*m),m]

ลองออนไลน์!


พอร์ตของสิ่งนี้ถึงPython 3สามารถเป็น62 ไบต์ :

lambda m:[[len(set(v))for v in a].index(2)for a in(zip(*m),m)]

รายการความเข้าใจ[len(set(v))for v in a]สั้นกว่าแผนที่คู่สองไบต์ในขณะนี้เนื่องจากจะต้องส่งไปยังรายการเช่นlist(map(len,map(set,a)))

ลองออนไลน์!


6

Brachylogขนาด 20 ไบต์

c≡ᵍ∋Ȯ&;I∋₎;J∋₎gȮ∧I;J

ลองออนไลน์!

เอาท์พุ[I,J]ทซึ่งIเป็นดัชนีแถวและJดัชนีคอลัมน์ทั้ง 0 ดัชนี

ค่อนข้างยาว แต่การได้รับดัชนีใน Brachylog นั้นเป็นเรื่องที่ละเอียดมาก

คำอธิบาย

c                       Concatenate the Input into a single string
 ≡ᵍ                     Group identical characters together
   ∋Ȯ                   Ȯ is a list of One element, which is the needle character
     &;I∋₎              Take the Ith row of the Input
          ;J∋₎          Take the Jth character of the Ith row
              gȮ        That character, when wrapped in a list, is Ȯ
                ∧I;J    The output is the list [I,J]

6

PHP ,99 85 ไบต์

การใช้สตริงโดยไม่ต้องขึ้นบรรทัดใหม่และความกว้าง (หรือความสูง) ('########N###########', 5) เป็นอินพุต

  • -5 ไบต์โดยการลบการเรียก chr (), props ไปที่ @Titus
  • -9 ไบต์โดยการป้อนข้อมูลเป็นฟังก์ชั่นสอง args ยังประกอบไปด้วย @Titus
function($a,$l){return[($p=strpos($a,array_flip(count_chars($a,1))[1]))%$l,$p/$l|0];}

ลองออนไลน์!

Ungolfed:

function need_hay( $a, $l ) {

    // identify the "needle" by counting the chars and 
    // looking for the char with exactly 1 occurrence
    // note: this is 1 byte shorter than using array_search()
    $n = array_flip( count_chars( $a, 1 ) )[1];

    // find the location in the input string
    $p = strpos( $a, $n );

    // row is location divided by row length, rounded down
    $r = floor( $p / $l );

    // column is remainder of location divided by row length
    $c = $p % $l;

    return array( $c, $r );

}

เอาท์พุท:

#####
###N#
#####
#####
[3,1]

^^^
^^^
^N^
^^^
^^^
^^^
[1,2]

jjjjjj
j@jjjj
jjjjjj
[1,1]

1
1) ไม่ต้องการchr: หากพารามิเตอร์ตัวที่สองสำหรับ strpos เป็นจำนวนเต็มมันจะถูกตีความว่าเป็นรหัส ASCII -> -5 ไบต์ 2) พารามิเตอร์ฟังก์ชันสองตัว$s,$wสามารถบันทึกอีก 9 ไบต์
ติตัส

@Titus ลบ chr () ที่ยอดเยี่ยม ขอบคุณ! parc func ก็เกิดขึ้นกับฉันเช่นกันฉันไม่ต้องการเรียกใช้ afql ของ req ของอินพุต ฉันจะชี้แจงด้วย OP
640KB

5

05AB1E , 9 6 ไบต์

รูปแบบการสลับอินพุต 3 ไบต์ที่บันทึกไว้

อินพุตถูกใช้เป็นสตริงและความยาวแถว
เอาท์พุทเป็นรายการแบบ zero-based[y, x]

D.mks‰

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

D           # duplicate the input string
 .m         # get the least frequent character
   k        # get its index in the string
    s       # swap the row length to the top of the stack
     ‰      # divmod the index of the least frequent char with the row length

แดงคุณชนะฉันไปแล้ว กำลังทำงานกับคำตอบ เพิ่งจบ 13-byter แต่คุณเป็นวิธีที่ดีกว่าดังนั้น +1 แทน :) ลืมเกี่ยวกับ.m..
Kevin Cruijssen

@KevinCruijssen: ใช่ ฉันไม่คิดว่าฉันเคยใช้ .mมาก่อน แต่ผมก็มีเหตุผลว่าผมเห็นมันในบางจุด :)
Emigna

5

Python 3 + NumPy , 75 66 ไบต์

-9 ไบต์ขอบคุณ@ ASCII-only

lambda x:where(x.view('i')-median(x.view('i')))
from numpy import*

ลองออนไลน์!

สิ่งนี้ถือว่าอินพุตเป็นอาร์เรย์ NumPy เอาท์พุทเป็นศูนย์ดัชนีและแนวตั้งแรกแล้วแนว

มันจะแปลงข้อมูลจากcharไปintแล้วคำนวณค่ามัธยฐานของอาร์เรย์ซึ่งจะเป็นตัวละครที่กองหญ้า เราลบมันออกจากอาร์เรย์ซึ่งทำให้เข็มเป็นองค์ประกอบที่ไม่ใช่ศูนย์เท่านั้น numpy.where()สุดท้ายกลับดัชนีขององค์ประกอบที่ว่าด้วย


1
เนื่องจากคุณรู้ว่าอินพุตจะเป็น ASCII (เช่นลงตัวเป็นไบต์) ทำไมไม่ใช้uint8หนึ่งไบต์ให้น้อยลง?
Draconis

1
ภาษาต้องเป็น "Python 3 + numpy" ที่นี่เนื่องจากไม่มีการรวม numpy กับการแจกแจง Python ปกติ
เฉพาะ ASCII เท่านั้น

@ Draconis ที่เป็นแผนของฉันจริง ๆ แต่มันแนะนำค่าศูนย์ระหว่างuint8รหัส ASCII ที่ถูกต้อง ฉันถือว่านี่เป็นเพราะ Python3 ใช้ Unicode เป็นรูปแบบอินพุตมาตรฐานสำหรับสตริง
hbaderts


1
ไม่เป็นไรเพราะมันไม่ได้ขึ้นอยู่กับการแก้ปัญหาของคุณเท่านั้น แต่ฉันก็ไม่ได้ใช้ numpy อยู่ดี นอกจากนี้ยังไม่สามารถหลีกเลี่ยงได้ว่าโซลูชันอาจคล้ายกันมากเนื่องจากโซลูชันทั้งหมดเป็นสาธารณะและนี่เป็นความท้าทายที่ค่อนข้างง่าย
ASCII เท่านั้น

4

เยลลี่ 5 ไบต์

เอาท์พุท[ความสูงความกว้าง] (ดัชนี 1)

ŒĠLÐṂ

ลองออนไลน์!

ŒĠLÐṂ – Monadic link / Full program. Takes a list of strings M as input.
ŒĠ    – Group the multidimensional indices by their values (treating M as a matrix).
  LÐṂ – And retrieve the shortest group of indices (those of the unique character).

เยลลี่ 5 ไบต์

ŒĠḊÐḟ

ลองออนไลน์!


4

เยลลี่ 4 ไบต์

บางทีนี่อาจเป็นเพียงความคิดเห็นของ Mr. Xcoder มันคล้ายกันมาก ...

ŒĠEƇ

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

ลองออนไลน์!

อย่างไร?

ŒĠEƇ - Link: matrix, M
ŒĠ   - multi-dimensional indices grouped by Value
     -  ...due to the 2*2 minimum size and one needle this will be a list of two lists one
     -     of which will have length one (the needle coordinates as a pair) and the other
     -     containing all other coordinates as pairs
   Ƈ - filter keeping those for which this is truthy:
  E  -   all equal?
     -   ... 1 for the list of length 1, 0 for the list of at least 3 non-equal coordinates

1
ทีนี้ดูเหมือนว่าเส้นเขตแดนเพราะมันฉลาด
Erik the Outgolfer

4

JavaScript (ES6), 55 ไบต์

(s)(w)sw[x,y]

s=>w=>[(i=s.indexOf(/(.)\1+(.)/.exec(s+s)[2]))%w,i/w|0]

ลองออนไลน์!


JavaScript (ES6),  65  64 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @Neil

[x,y]

m=>m.some((r,y)=>r.some((c,x)=>!m[p=[x,y],~y&1].includes(c)))&&p

ลองออนไลน์!

อย่างไร?

c(x,y)r[Y]Yy2×2Y=0yY=1Y


1
~y&1y&1^1ประหยัดกว่าไบต์
Neil

4

Java 8, 132 111 ไบต์

m->{int c=m[0][0],i=0,j;for(c=m[1][0]!=c?m[1][1]:c;;i++)for(j=m[i].length;j-->0;)if(m[i][j]!=c)return i+","+j;}

-8 ไบต์ (และอีก -13 โดยนัย) ขอบคุณ@dana @dana

อินพุตเป็นอักขระเมทริกซ์

ลองออนไลน์

คำอธิบาย:

m->{                    // Method with char-matrix parameter and String return-type
  int c=m[0][0],        //  Character to check, starting at the one at position 0,0
      i=0,j;            //  Index integers
  for(c=m[1][0]!=c?     //  If the second character does not equal the first:
         m[1][1]        //   Use the character at position 1,1 instead
        :c;             //  Else: keep the character the same
      ;i++)             //  Loop `i` from 0 indefinitely upwards:
    for(j=m[i].length;j-->0;)
                        //   Inner loop `j` in the range (amount_of_columns, 0]:
      if(m[i][j]!=c)    //    If the `i,j`'th character doesn't equal our character to check:
        return i+","+j;}//     Return `i,j` as result

1
124 - returnคำสั่งสุดท้ายไม่ควรโดน อาจมีวิธีที่ดีกว่าในการรักษาวงรอบนอกไว้
dana

@dana ขอบคุณ! สำหรับ: " อาจจะมีวิธีที่ดีกว่าในการรักษาวงนอกไป? " แน่นอนมี; แค่เอามันออกแล้วมันจะกลายเป็นวงไม่สิ้นสุด และจากนั้นreturn"";ไม่สามารถเข้าถึงและสามารถลบได้เช่นกัน : D -21 ไบต์ขอบคุณสำหรับคุณ
Kevin Cruijssen

น่าสนใจ ... ฉันลองลบเงื่อนไขลูปภายนอกและได้รับunreachable codeข้อผิดพลาด ไม่ทราบว่าการลบไฟล์สุดท้ายreturnเป็นการแก้ไข
ดาน่า

ตัวดำเนินการ -> ทำอะไรในลูปด้านในอย่างแน่นอน ฉันพยายามค้นหา java เอกสารสำหรับไวยากรณ์นั้น แต่ไม่พบอะไรเลย
KBusc

1
@KBusc มันเป็นสองผู้ประกอบการ: และi-- >:) ดูคำตอบ SO นี้สำหรับข้อมูลเพิ่มเติม ดังนั้นi > 0จะถูกดำเนินการก่อนตรวจสอบว่าiมีขนาดใหญ่กว่า 0 แล้วiลดลง 1 ด้วยi--ก่อนที่จะเข้าสู่ร่างกายของวง
Kevin Cruijssen

3

MATL , 12 8 ไบต์

tX:XM-&f

ลองออนไลน์!

ใช้modeฟังก์ชั่นเป็นเครื่องตรวจจับเสียงส่วนใหญ่ ส่งคืนดัชนีที่อิง 1

 t           % duplicate the input
  X:         % turn the copy into a linear array
    XM       % find the arithmetic mode of that (the 'haystack' character)
      -      % Subtract that from the original input
       &f    % find the position of the non-zero value in that result

ตัวละคร -4 ตัวขอบคุณ @LuisMendo


1
@LuisMendo ขอบคุณ ฉันไม่คิดว่าฉันรู้เกี่ยวกับเวอร์ชันเอาต์พุต 2 ของfindแม้แต่ใน MATLAB (สวัสดี btw!)
sundar - Reinstate Monica

3

ภาษา Wolfram 37 58 ไบต์

รายการก่อนหน้าของฉันไม่ถูกต้องจัดการกรณีที่ "อักขระแปลกออก" อยู่ที่มุมซ้ายบนของเมทริกซ์ สิ่งนี้ทำ

#~Position~Keys[TakeSmallest[Counts@Flatten@#,1]][[1]]&

Counts@Flatten@##วิธีการหลายรายการของตัวละครแต่ละตัวอยู่ในอาร์เรย์

TakeSmallest[...,1] ส่งกลับการนับที่น้อยที่สุดในรูปแบบของกฎการเชื่อมโยงเช่น <| "Z"->1|>

Keys...[[1]]ส่งคืน "คีย์" ไปยังรายการเดียวในการเชื่อมโยงซึ่งเป็นอักขระที่ใช้น้อยที่สุด ("Z" ในกรณีปัจจุบัน)

#~Position~...#ผลตอบแทนที่แล้วตำแหน่งของคีย์ในเมทริกซ์เดิม


3

Perl 5 -p00, 52 45 ไบต์

/^(.)(\1*
)*(\1*)|^/;$_=$&=~y/
//.$".length$3

45 ไบต์

52 ไบต์

อย่างไร

  • -p00: ชอบ-nแต่ยังพิมพ์โหมดย่อหน้า
  • /^(.)(\1* )*(\1*)|^/ : จับคู่อย่างใดอย่างหนึ่ง
    • ตั้งแต่เริ่มต้น$1: ตัวอักษรตัวแรก, $2: การทำซ้ำ (ไม่ได้ใช้) $3,: ตัวละครหน้า "เข็ม" ในบรรทัด$&ทั้งคู่
    • หรือสตริง null (ตำแหน่ง 0) ไม่มีการจับภาพ
  • $_= : เพื่อกำหนดตัวแปรอินพุต / อาร์กิวเมนต์เริ่มต้น
  • ดังนั้น$&=~y/ //จำนวนบรรทัดใหม่ของ$&
  • .$".: ต่อกันกับ$"(อักขระเว้นวรรคตามค่าเริ่มต้น) และต่อกัน
  • length$3 : ความยาวของ $3

3

R 42 ไบต์

function(m)which(ave(m,m,FUN=length)==1,T)

ลองออนไลน์!

อินพุต:เมทริกเมทริกm

เอาท์พุต: (row,col)เวกเตอร์ - ดัชนีเริ่มต้นที่1


1
เยี่ยมมากและยินดีต้อนรับสู่ PPCG! ผมเชื่อว่านี่คือ 42 ไบต์เนื่องจากf=สามารถละเว้นจากการนับไบต์ function(m)=แต่ไม่
BLT

@BLT ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้ แต่ต้องขอบคุณสำหรับหัวขึ้น :)
niko



2

Python 2 , 53 47 ไบต์

lambda s,w:divmod(s.find(min(s,key=s.count)),w)

ลองออนไลน์!

โทรเป็นf("########N###########", 5)(อนุญาตในความคิดเห็น ) (y, x)เอาท์พุท

Erik บันทึก 6 ไบต์แนะนำให้ทำการจัดเรียงเอาต์พุต + divmodใหม่อีกครั้ง ขอบคุณ!


คุณสามารถจัดลำดับเอาต์พุตใหม่เพื่อให้คุณสามารถใช้divmodบิวด์อิน
Erik the Outgolfer

2

PowerShell , 107 98 82 77 ไบต์

$l=@{}
$args|%{if($_-10){$l.$_+=$x++,+$y}else{$x=0;++$y}}
$l|% v*|? c*t -eq 2

ลองออนไลน์!

รับสตริงที่กระจายด้วย LFs ส่งคืนตำแหน่งที่ไม่มีดัชนี x, y คลี่:

$locations=@{}                      # make a hashtable. key=char, value=location array
$args|%{
    if($_-10){                      # if current char is not LF
        $locations.$_+=$x++,+$y     # add $x,$y to hashtable value and move $x to next pos
    }else{
        $x=0;++$y                   # move $x,$y to next line
    }
}
$locations|% Values|? Count -eq 2   # find and output location array with 2 elements (x,y)



1

เรติน่า 0.8.2 , 41 ไบต์

s`(?=(.)+\1)(.*?¶)*(.*)(?!\1|¶).+
$.3,$#2

ลองออนไลน์! 0 การจัดทำดัชนี คำอธิบาย:

s`

อนุญาตให้.จับคู่บรรทัดใหม่ ค่าใช้จ่ายนี้ 3 ไบต์ (ไบต์ที่ 3 เป็นค่า?ก่อนหน้า) แต่บันทึกได้ 6 ไบต์

(?=(.)+\1)

มองไปข้างหน้าสำหรับอักขระที่เหมือนกันสองตัว \1จากนั้นกลายเป็นหญ้าแห้ง

(.*?¶)*

นับจำนวนบรรทัดใหม่ต่อหน้าเข็ม

(.*)

จับหญ้าแห้งไปทางซ้ายของเข็ม

(?!\1|¶)

ตรวจสอบให้แน่ใจว่าเข็มไม่แห้งหรือขึ้นบรรทัดใหม่

.+

จับคู่หญ้าแห้งที่เหลือเพื่อให้ผลลัพธ์ถูกแทนที่

$.3,$#2

เอาท์พุทความกว้างของหญ้าแห้งด้านซ้ายและจำนวนบรรทัดใหม่


1

C # (Visual C # Interactive Compiler) , 82 ไบต์

x=>w=>{int y=x.IndexOf(x.GroupBy(c=>c).Last(g=>g.Count()<2).Key);return(y%w,y/w);}

ขอบคุณ dana สำหรับการโกนหนวดขนาด 6 ไบต์!

ลองออนไลน์!

โซลูชันเก่า 106 ไบต์

n=>m=>{var z=n.Distinct();int d=n.IndexOf(n.Count(c=>c==z.First())>1?z.Last():z.First());return(d%m,d/m);}

ทั้งสองรับอินพุตเป็นสตริงและจำนวนเต็มซึ่งระบุจำนวนคอลัมน์

ลองออนไลน์!


@dana ไม่เคยรู้เลยว่าEnumerable.Last()ยอมรับผู้แทนแล้วขอบคุณ
ศูนย์รวมแห่งความไม่รู้

1

Java 8, 104 Bytes

(x,w)->{int i=0,p=x.length;for(;i<p;i++)if(x[i]!=x[(i+1)%p]&&x[i]!=x[(i+2)%p])break;return i/w+","+i%w;}

อินพุตคืออาร์เรย์ของอักขระถ่านและจำนวนเต็มซึ่งระบุความกว้างของแถว

เอาท์พุทเป็นศูนย์แนวตั้งและแนวนอนแล้ว (เช่นหมายเลขแถวจากนั้นหมายเลขคอลัมน์)

คำอธิบาย:

(x,w)->{
    int i=0, p=x.length;
    for (;i<p;i++)          //iterate through characters in x
      if (x[i]!=x[(i+1)%p] && x[i]!=x[(i+2)%p])    //compare x[i] with the two subsequent characters in array, wrapping around if necessary
        break;
    return i/w+","+i%w;}  //return row number then column number, zero-based

1

Python 3 , 93 89 85 58 ไบต์

เขียนอินพุตใหม่เป็นconcatenated string, width:

lambda g,w:divmod(g.index({g.count(c):c for c in g}[1]),w)

ลองออนไลน์!


คำตอบเดิม:

def k(g):t=''.join(g);return divmod(t.index({t.count(c):c for c in t}[1]),len(g[0]))

แก้ไข: บันทึกไว้ 4 ไบต์โดยการสลับ linebreak / เยื้องสำหรับอัฒภาค บันทึกอีก 4 ไบต์โดยใช้divmod(ขอบคุณ @JonathanFrech)

ลองออนไลน์!

ฉันรู้ว่านี่อาจสั้นกว่านี้มาก แต่ฉันแค่อยากลองวิธีแก้ไขdictความเข้าใจนี้


1
การใช้divmodจะช่วยประหยัดห้าไบต์
Jonathan Frech

0

MATL 11 ไบต์

tX:YmyYk-&f

เอาต์พุตคือแถวจากนั้นคอลัมน์; 1-based

ลองออนไลน์!

คำอธิบาย

t    % Implicit input. Duplicate
X:   % Linearize into a column
Ym   % Compute mean (characters are converted to ASCII codes)
y    % Duplicate from below: pushes input again
Yk   % Closest value: gives the input value that is closest to the mean
-    % Subtract, element-wise. Gives non-zero for the value farthest from the mean
&f   % Two-output find: gives row and column indices of nonzeros. Implicit display

0

Pyth, 15 14 12 ไบต์

.Dxz-zh.-z{z

รับอินพุตเป็นความยาวของแถวและอินพุตที่ไม่มีบรรทัดและเอาต์พุตเป็น [แถว, คอลัมน์]
ลองที่นี่

คำอธิบาย

.Dxz-zh.-z{z
       .-z{z    Subtract one of each character from the input.
      h         Take the first.
    -z          Remove all instances from the input.
  xz            Find the remaining character in the input.
.D          Q   Take the result divmod the (implicit) length of the row.

วิธีการแบบเก่า

mxJmt{kdeSJ.TB

ลองที่นี่

คำอธิบาย

mxJmt{kdeSJ.TB
           .TBQ   Take the (implicit) input and its transpose...
m      d          ... and for each...
   mt{k           ... deduplicate each row...
 xJ     eSJ       ... and find the index of the largest.     

0

ถ่าน 40 ไบต์

≔§⎇⌕θ§θ¹ηθ⁰ζSθW⁼№θζLθ«⊞υωSθ»I⌕Eθ⁼ιζ⁰,ILυ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ฉันต้องทำอะไรผิดเพราะมันเกือบจะนานเท่ากับคำตอบของ Retina คำอธิบาย:

≔§⎇⌕θ§θ¹ηθ⁰ζ

ตรวจสอบว่าอักขระตัวที่สองในสตริงแรกเป็นอักขระตัวแรกหรือไม่และใช้อักขระตัวแรกของสตริงตัวแรกถ้าไม่เช่นนั้นอักขระตัวแรกของสตริงที่สองถ้าไม่ใช่ นี่คือฟาง

SθW⁼№θζLθ«⊞υωSθ»

ให้อ่านสตริงจนกระทั่งสตริงที่มีหญ้าแห้งน้อยกว่าความยาวของมัน

I⌕Eθ⁼ιζ⁰,ILυ

เอาท์พุทตำแหน่งขององค์ประกอบที่ไม่ตรงกันและจากนั้นจำนวนของสตริงที่อ่านก่อนหน้านี้


0

MATLAB, 68 22 ไบต์

[r,c]=find(v~=v(1));if size(r,1)>1 disp([1,1]);else disp([r,c]);end;

หากฉันสามารถยกเว้นกรณีใดกรณีหนึ่งเช่น[1,1]ในโซลูชันนี้ฉันสามารถบันทึกหลายไบต์ได้

โซลูชั่นที่อัปเดต :

@(v)find(v-mode(v(:)))

ขอบคุณ @sundar ที่ช่วยเหลือฉันด้วยปัญหากรณีพิเศษและประหยัด 42 ไบต์! นอกจากนี้ขอขอบคุณ @Luis_Mendo สำหรับคำแนะนำและช่วยฉันอีก 2 ไบต์!


ฉันคิดว่าคุณสามารถกำจัดของการตรวจสอบสำหรับ[1,1]กรณีโดยใช้แทนmode(v(:)) v(1)
sundar - Reinstate Monica

คุณจำเป็นต้องล้อมโค้ดของคุณเพื่อให้เป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น vคุณจะไม่สามารถสรุปได้ว่าการป้อนข้อมูลที่อยู่ในตัวแปร นอกจากนี้คุณอาจแทนที่~=ด้วย-และลบรอบสุดท้าย;
Luis Mendo

0

โรดา , 81 ไบต์

f a{i=indexOf;l=i("
",a)+1;chars a|sort|count|[[_2,_1]]|min|i _[1],a|[_%l,_1//l]}

ลองออนไลน์!

รับอินพุตเป็นสตริงที่มีบรรทัดที่ขึ้นบรรทัดใหม่ ส่งคืนกระแสข้อมูลที่มีดัชนีแนวนอนและแนวตั้ง 0 ดัชนี

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