# [Perl 6], <del>41 38</del> 37 bytes
_3 bytes saved thanks to @nwellnhof._
_1 byte saved thanks to Jo King._
<!-- language-all: lang-perl6 -->
{map {[+] ^∞Z*!<<.&[Z~~]},$_,.&[Z]}
[Try it online!][TIO-jrng8om7]
[Perl 6]: https://github.com/nxadm/rakudo-pkg
[TIO-jrng8om7]: https://tio.run/##RUxbCoMwEPzPKbZRilrxs0h90BN4gKgpWhQqaqWxHyL63VP0cL2IjYmYgdmZ2R22K171eWkGOJYQLGOTdTDGpxTo7/Ml1sH3nWNM5jmdbP1mrz6dFg@xdw59wXpDZyaMwLIBdOYJLfnOqR9twRz@zLCc@7PJ@YL1ppyyhgOJpE1aDBNC4h3WViDOSExtm9j0tgKlFAlGm0qqQiWAqqsUAXUlLnJdFV0eiYrhDrS7i7Lh2lz@ "Perl 6 – Try It Online"
##Explanation
It takes the input as a list of lists of characters and returns list of length 2 containing zero-based X and Y coordinates of the needle.
It works by applying the block `{[+] ^∞ Z* !<<.&[Z~~]}` on the input and on its transpose. `.&[Z~~]` goes through all columns of the argument and returns `True` if all the elements are the same, `False` otherwise. We then negate all the values (so we have a list with one bool per column, where the bool answers the question "Is the needle in that column?"), multiply them element-wise with a sequence 0,1,2,... (`True = 1` and `False = 0`) and sum the list, so the result of the whole block is the 0-based number of the column where the needle was found.
# Nwellnhof's better approach, [Perl 6], 34 bytes
<!-- language-all: lang-perl6 -->
{map *.first(:k,*.Set>1),.&[Z],$_}
[Try it online!][TIO-jrma1d0y]
[Perl 6]: https://github.com/nxadm/rakudo-pkg
[TIO-jrma1d0y]: https://tio.run/##RUxBCoMwELznFSGKGJFALyUoSl/gpTdrLVoiaNWKSQ8ivj2NiZiBmdnZHXZic3@VwwK9BiZyHaoJBqRpZy786BMG5M5EesEh8R75M3Rfm4wB/9VQMFVwOYYr5NUCXR5rb9SO9O3IOFGf/IC8v0OtFlxgo6aGEoNiLEYENwD0O@TsAIqZVudQhOOjUJYl0MwON7SFTgN0N2Ma9ppTQKmNVMXcxvQEOKfIjunelH8 "Perl 6 – Try It Online"
##Explanation
Generally the same approach, just more effective. It still uses a block on the array and its transpose, but now the block converts all _rows_ into`Sets` and checks for the number of elements. The `first` function then gives index (due to the `:k`) of the first row that contained more than 1 element. Because of that, the order of `$_` and `.&[Z]` needed to be swapped.