Odd'em out: chữ cái


11

Mục tiêu

Viết chương trình hoặc hàm (hoặc tương đương) sắp xếp và trả về chữ cái lẻ trong ma trận có kích thước ngẫu nhiên.

Chi tiết

Bạn sẽ được thông qua một ma trận (dưới dạng một chuỗi) dưới dạng đầu vào của các kích thước ngẫu nhiên như thế này.

bbbbbbbbbbb
bbbbbdbbbbb
bbbbbbbbbbb
bbbbbbbbbbb
bbbbbbbbbbb

Công việc của bạn là tìm chữ cái không khớp với phần còn lại (trong trường hợp này, nó được dtìm thấy ở dòng 2, col 6) và trả lại chữ cái đó làm đầu ra. Ma trận sẽ bao gồm các chữ cái A-Z, a-zdòng mới ( \n, chỉ ở cuối các hàng) và có kích thước nằm trong khoảng từ 5x5 đến 10x10 (25-100 chữ cái).

Tiêu chuẩn áp dụng. Đây là một thử thách golf mã; mục nhập với mã ít byte nhất sẽ thắng.

Đầu vào

Đầu vào sẽ được chuyển qua đầu vào tiêu chuẩn dưới dạng một chuỗi nếu đó là một chương trình hoặc là một đối số nếu một hàm (hoặc tương tự).

Đầu ra

Một nhân vật duy nhất là "kỳ quặc" trong ma trận hay None , nil, NUL, hoặc chuỗi "None"nếu không có "kỳ quặc" nhân vật.

Thêm ví dụ

AAAAAAA
AAAAAAA
AAAAAAA
AAAIAAA
AAAAAAA

Câu trả lời: I

vvqvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv

Câu trả lời: q

puuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu

Câu trả lời: p

Máy phát điện

Dưới đây là một trình tạo ma trận ngẫu nhiên được viết bằng Python mà bạn có thể sử dụng để kiểm tra chương trình của mình. Lưu ý: Có một cơ hội nhỏ rằng nó có thể phạm sai lầm và không đặt trong một lá thư kỳ lạ.


1
Đây là bản dịch nghĩa đen của mã Python của bạn sang JS.
Arnauld

1
@juniorRubyist "xóa phần thưởng" không giống như "làm cho phần thưởng bắt buộc". Bằng cách chuyển phần tùy chọn cho đến nay thành các yêu cầu của thử thách, bạn đã vô hiệu hóa một phần lớn các câu trả lời hiện có.
Martin Ender

Câu trả lời:



6

J , 12 10 7 byte

-.}./.~

Hãy thử trực tuyến!

    /.~        Group identical items together
  }.           Remove one item from each group
-.             Remove the rest from the input

Phiên bản 10 byte

-._1 1{\:~

tiếng rít ...

       \:~        Sort down
  _1 1{           Take the last character (which is a newline) and the second one.
-.                Remove those from the input

2
@ FrownyFrog Đây là một cách thông minh để tìm ra nhân vật kỳ quặc
Galen Ivanov

không thể quyết định những gì tôi thích hơn: cái móc đáng yêu này hay trò đùa rồng của bạn ...
Jonah

4

Brachylog , 8 4 byte

oḅ∋≠

Hãy thử trực tuyến!

Giải trình

Tôi chưa sử dụng Brachylog trước đây, vì vậy điều này có thể không tối ưu.

oḅ∋≠  Input is a string.
o     Sort the input.
 ḅ    Split it into blocks of equal elements.
  ∋   There is a block
   ≠  whose elements are all different.
      That block is the output.

Việc sử dụng ∋≠sau để có được kết quả của độ dài 1 là rất thông minh. Bạn chắc chắn nên đăng nó trong câu hỏi mẹo Brachylog .
Gây tử vong vào

@Firthize Cảm ơn, tôi đã thêm tiền boa.
Zgarb

3

K (oK) , 7 6 byte

Giải pháp

*<#:'=

Hãy thử trực tuyến!

Thí dụ:

*<#:'="vvqvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"q"

Giải trình:

Tìm thấy một cách tiếp cận ngắn hơn một chút: Đánh giá từ phải sang trái:

*<#:'= / the solution
     = / group matching items together
  #:'  / count (#:) each (')
 <     / sort ascending
*      / take the first one

Ghi chú:

Trong khi tôi hy vọng khía cạnh phần thưởng của thử thách này sẽ bị loại bỏ, giải pháp này sẽ trả về ký tự dòng mới \nnếu không có ký tự lẻ:

*<#:'="vvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"\n"

3

Prolog (SWI) , 46 byte

p(L):-select(X,L,Y),\+member(X,Y),writef([X]).

Hãy thử trực tuyến!

Hoặc nếu đầu ra đúng tiêu chuẩn từ các truy vấn prolog không ổn:

Prolog (SWI) , 48 byte

Z*L:-select(X,L,Y),\+member(X,Y),char_code(Z,X).

Hãy thử trực tuyến!

Giải trình

Find the first element X in the input  
that when removed, results in output  
that does not contain X

then depending on the version above either:  
print X as a character  
or  
return X as an atom

3

C (gcc) , 93 92 90 66 62 byte

Ngắn hơn nhiều như một chức năng

t;f(char*p){for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Hãy thử trực tuyến!

mã kiểm tra

main()
{
    char s[99];
    for(;gets(s);)f(s);
}

phiên bản cũ là một chương trình

C 86 byte

char*p;s[9];main(t){for(;p=gets(s);)for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Xuất ra ký tự lẻ, hoặc không có gì. chạy như thế này;

C:\eng\golf>python matrix_gen.py | a.exe
X
C:\eng\golf>python matrix_gen.py | a.exe
G
C:\eng\golf>python matrix_gen.py | a.exe
x
C:\eng\golf>python matrix_gen.py | a.exe

C:\eng\golf>python matrix_gen.py | a.exe
J

Tôi không biết rằng việc đưa gets()trình điều khiển thử nghiệm là khá công bằng vì nó đang vệ sinh đầu vào bằng cách xóa ký tự \ n cho bạn. Đó là thực hiện một số công việc để chức năng của bạn không hoạt động trên đầu vào ban đầu.
Michael Dorgan

@MichaelDorgan Nó hoạt động với đầu vào đường ống từ tập lệnh python cũng như đầu vào trên TIO. Những người khác chỉ đơn giản là mã hóa đầu vào dường như không đúng với tinh thần của thách thức.
cleblanc

3

05AB1E ,  4  2 byte

Đã lưu 2 byte nhờ Adnan

.m

Hãy thử trực tuyến!

Giải trình

.m   # push a list of the least frequent character(s) in input

Bạn có cần xóa các dòng mới, vì chúng tôi đảm bảo đầu vào sẽ dài ít nhất 5 dòng?
Xù xì

@Shaggy: Không tôi không có. Đó là để xử lý 2x2ma trận. Tôi đã bỏ lỡ phần về 5x5và lên. Cảm ơn!
Emigna

Nó có phải trả lại nilnếu nó không có "số lẻ" không?
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Phần đó là tùy chọn khi câu trả lời này được đăng. Tôi đoán rằng sự thay đổi đó làm mất hiệu lực hầu hết các câu trả lời ngay bây giờ ...
Martin Ender


2

Husk , 2 byte

◄=

Hãy thử trực tuyến!

Đây là một hàm lấy một chuỗi làm đầu vào và trả về một ký tự. Nó lấy tối thiểu của chuỗi đầu vào khi so sánh các ký tự cho đẳng thức (nghĩa là nó trả về ký tự bằng số lượng ký tự khác ít nhất).


2

C, 94 byte

Trả về bằng con trỏ. Nếu không, trở về \0.

Điều này sẽ gây rò rỉ bộ nhớ. Giả sử intlà 4 byte.

*t;f(c,p,i)char*c,*p;{t=calloc(64,8);for(*p=-1;*c;c++)t[*c]--;for(i=0;++i<128;)!~t[i]?*p=i:0;}

Hãy thử trực tuyến!



@Shaggy Trên thực tế, tôi không biết cách diễn giải quy tắc đó, vì tôi thấy một số người dùng (khác) biết rõ ràng về quy tắc đó nhưng vẫn đăng câu trả lời như vậy.
dùng202729

2
@ user202729, chỉ vì những người khác làm điều đó không có nghĩa là nó đúng;) Nếu bạn phát hiện ra những giải pháp như vậy, tốt nhất hãy chỉ ra cho họ.
Xù xì

@Shaggy Vâng, tôi đã chỉ rõ quy tắc nhưng người dùng đó nói "quy tắc nói rõ ràng rằng quy tắc này là hợp lệ". Tôi không biết phải nói gì. | Trong trường hợp này, hàm yêu cầu mảng tbằng 0 trước khi gọi mỗi lần không phải lần đầu tiên.
dùng202729

@Shaggy Cảm ơn, đã sửa.
Colera Su


2

Bash , 15 20 byte

fold -1|sort|uniq -u

Hãy thử trực tuyến!

Giải thích: fold s đầu vào cho 1ký tự trên mỗi dòng, sorts nó thành các nhóm chữ cái phù hợp, sau đó chỉ in các dòng là unique.

Cảm ơn @Nahuel Fouilleul vì đã nắm bắt và giúp khắc phục vấn đề với phương pháp này.


không hoạt động nếu nhân vật kỳ lạ là nhân vật thứ hai hoặc bán thân
Nahuel Fouilleul

@NahuelFouilleul Bắt tốt ... Tôi không chắc chắn cách khắc phục điều đó vào lúc này, nhưng tôi sẽ sửa hoặc xóa sau trừ khi bạn có cách khắc phục được đề xuất.
Justin Mariner

nó có thể được sửa chữa đơn giản |sort|nhưng có thể có một giải pháp tốt hơn
Nahuel Fouilleul

cũng tìm thấy một giải pháp với grep nhưng lâu hơngrep -oP '^(.)((?=(?!\1).){2}|.*\K(?!\1).)'
Nahuel Fouilleul

@NahuelFouilleul Tôi sẽ sortsửa chữa, cảm ơn. Bạn luôn có thể đăng câu trả lời grep đó thành của riêng bạn nếu bạn muốn.
Justin Mariner



1

Matlab, 25 byte

a=input('');a(a~=mode(a))

Đầu vào "a" trong đó "a" không phải là chế độ của "a". Đầu ra mảng trống không có lẻ.


1

Haskell, 33 * 0,75 = 24,75 byte

f s=[c|[c]<-(`filter`s).(==)<$>s]

Trả về một danh sách trống nếu không có ký tự lẻ.

Hãy thử trực tuyến!

Đối với mỗi char ctrong ma trận (được đưa ra dưới dạng một chuỗi s), tạo một chuỗi gồm tất cả các ký tự trong sđó bằng cvà giữ các chuỗi có độ dài 1.


1

JavaScript (ES6), 37 byte

Trả về nullnếu không có thư lẻ.

s=>s.match(`[^
${s.match(/(.)\1/)}]`)

Các trường hợp thử nghiệm


1

Japt , 6 byte

Đưa đầu vào dưới dạng một chuỗi nhiều dòng và xuất ra một chuỗi ký tự đơn hoặc một chuỗi trống nếu không có giải pháp.

k@èX É

Thử nó


Giải trình

Xóa các ký tự trả về truey ( k) khi truyền qua hàm ( @) đếm ( è) các lần xuất hiện của phần tử hiện tại ( X) trong đầu vào và trừ 1 ( É).



1

Thạch , 4 byte

ċ@ÐṂ

Hãy thử trực tuyến!

Trả về \n(một dòng mới) trong trường hợp không có ký tự lẻ. Rõ ràng \nkhông phải là một nhân vật có thể in được.

Thật trùng hợp, đây chính xác là thuật toán tương tự như câu trả lời của Mr.Xcoder Python. (Tôi nghĩ ra nó một cách độc lập)

Giải trình:

  ÐṂ    Ṃinimum value by...
ċ@      ċount. (the `@` switch the left and right arguments of `ċ`)

Điều đó hoạt động vì trong một m×nma trận:

  • Nếu tồn tại ký tự lẻ: Có m-1dòng mới, 1 ký tự lẻ và m×n-1ký tự bình thường, và 1 < m-1 < m×n-1bởi vì 5 ≤ m, n ≤ 10.
  • Nếu không tồn tại ký tự lẻ: Có m-1dòng mới và m×nký tự bình thường, và m-1 < m×n.


1

C (gcc) , 91 86 82 79 71 byte

f(char*s){for(;*++s==10?s+=2:0,*s;)if(*s^s[-1])return*s^s[1]?*s:s[-1];}

Hãy thử trực tuyến!

  • Cảm ơn Gastropner cho xor và? thủ thuật (-3 byte)
  • Làm lại phiên bản so sánh để sửa lỗi và sử dụng phép thuật Gastropner từ các bình luận.

Giải trình:

So sánh char hiện tại và trước đó trong khi bỏ qua các dòng mới. Nếu khác, so sánh với char tiếp theo. Điều này cho chúng tôi biết nếu chúng tôi trả lại char hiện tại hoặc trước đó. Hàm trả về giá trị char "lẻ" nếu nó tồn tại hoặc 0 nếu mảng không lẻ. Chúng tôi tránh xa với kiểm tra char "tiếp theo" bởi vì luôn có một dòng mới trước \0char. Nếu không có char lẻ, về bản chất chúng ta sẽ trả về \ 0 từ vòng lặp for.


Cũ hơn, mã xor quyến rũ hơn Giải thích:

Tạo mặt nạ xor đang chạy của 3 giá trị chuỗi tiếp theo. Nếu tất cả đều giống nhau, thì giá trị sẽ bằng với bất kỳ trong số ba. Nếu chúng khác nhau, thì 2 cái giống nhau sẽ triệt tiêu lẫn nhau để lại cái duy nhất.

Phải yếu tố / n trước xor hoặc nó trở nên lộn xộn. Ngoài ra phải kiểm tra 2 ký tự cho bất đẳng thức trong trường hợp s [0] là giá trị lẻ. Chi phí này thêm | | kiểm tra.

v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^‌​*s++||v^*s)break;}}

79 với một vài điều chỉnh. Lợi nhuận giảm không đồng ý với trình biên dịch của tôi, vì vậy chỉ được thử nghiệm trên TIO:v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^*s++||v^*s)break;}}
gastropner

Đối với những thứ nhảm nhí tôi đang viết, TIO là thứ tôi gắn bó. Cảm ơn!
Michael Dorgan

Sắp xếp lại một số biểu thức cho phép -2 khác cho 77: v;f(char*s){while(s[2]==10?s+=3:0,v=*s^s[1]^s[2],s[3])if(v^*s++||v^*s)break;} Tuy nhiên, con ngựa chiến thắng của bạn là một con khác, nếu bạn v;f(char*s){for(v=-1;*++s==10?s+=2,v--:0,*s;v=0)if(*s^s[-1])return s[v];}
mân mê

Vâng, nhưng xor có vẻ rất gợi cảm. :)
Michael Dorgan

Đề xuất s+=*++s-10?0:2thay vì*++s==10?s+=2:0
trần mèo


0

Alice , 16 * 75% = 12 byte

/-.nDo&
\i..*N@/

Hãy thử trực tuyến!

Đầu ra Jabberwockynếu không có ký tự trùng lặp.

Giải trình

/...@
\.../

Đây là một khung cho các chương trình tuyến tính hoạt động hoàn toàn trong Ordinal (chế độ xử lý chuỗi). Mã thực tế được thực thi theo cách ngoằn ngoèo và mở ra:

i..DN&-o

i   Read all input.
..  Make two copies.
D   Deduplicate one copy, giving only the two letters and a linefeed.
N   Multiset difference. Removes one copy of each letter and one linefeed.
    Therefore it drops the unique letter.
&-  Fold substring removal over this new string. This essentially removes
    all copies of the repeated letter and all linefeeds from the input,
    leaving only the unique letter.
.   Duplicate.
n   Logical NOT. Turns empty strings into "Jabberwocky" and everything else
    into an empty string.
*   Concatenate to the previous result.
o   Print the unique letter or "Jabberwocky".

Thay vì &-, chúng ta cũng có thể sử dụng ey(chuyển ngữ thành một chuỗi trống). Ngoài ra, bằng cách chi tiêu thêm một ký tự cho thao tác ngăn xếp, chúng tôi cũng có thể sao chép đầu vào cho phép chúng tôi loại bỏ các ký tự không mong muốn N, nhưng nó vẫn có cùng số byte:

i.D.QXN.n*o@

Alice , 13 byte

/N.-D@
\i&.o/

Hãy thử trực tuyến!

Đây là giải pháp không có tiền thưởng, đơn giản là nó thiếu .n*.



0

APL + THẮNG, 16 byte

(1=+/a∘.=a)/a←,⎕

Lời nhắc cho đầu vào màn hình và xuất ra chữ cái lẻ hoặc không có gì nếu không có chữ cái lẻ


a/⍨1=+/a∘.=a←,⎕cho một byte
Uriel

@Uriel Cảm ơn nhưng tôi sợ nhà điều hành không có sẵn trong APL + WIN phiên bản 5 cũ của tôi :(
Graham

0

PowerShell , 39 byte

([char[]]"$args"|group|sort c*)[0].Name

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng một chuỗi với các dòng mới (như được chỉ định trong thử thách), chuyển đổi nó thành một char-array. Chúng tôi sau đó Group-Objectcác nhân vật, để các nhân vật được nhóm lại với nhau theo tên của họ, sau đó sortdựa trên count. Điều này đảm bảo rằng nhân vật cô đơn là đầu tiên, vì vậy chúng tôi lấy [0]chỉ mục và xuất ra nó .Name.

Nếu dòng mới được chấp nhận cho "không có gì" thì điều này đủ điều kiện nhận thưởng.


Tôi đã hy vọng sort c*)[0]có thể rút ngắn, nhưng những gì tôi nghĩ ra là cùng số byte , ? c* -eq 1).
root

có thể được rút ngắn bằng cách loại bỏ các dấu ngoặc kép xung quanh $args. Ngoài ra, chính xác hơn là làm ([char[]]$args|group|? c* -eq 1).Namevì nó sẽ trở lại chính xác nullkhi không có ký tự lẻ (thay vì dòng mới). Tuy nhiên về mặt byte, điều này vẫn không mang lại cho bạn dưới 37.
cogumel0

@ cogumel0 Không chạy mà không có dấu ngoặc kép.
root

@root bạn đúng rồi. Tuy nhiên để vượt qua một trong những yêu cầu (Một nhân vật duy nhất là "kỳ quặc" trong ma trận hay None, nil, NUL, hoặc chuỗi "None"nếu không có "kỳ quặc" nhân vật.) Nó nên vẫn được thay đổi. Newline không phải là một phần của câu trả lời chấp nhận được.
cogumel0

@ cogumel0 Ah, thử thách đã thay đổi kể từ khi tôi đăng câu trả lời của mình. "Không / không / bất cứ điều gì" được sử dụng chỉ là một phần thưởng chứ không phải là bắt buộc. Tôi sẽ giữ câu trả lời của mình như hiện tại.
admBorkBork

0

Perl 6 ,  27  24 -25% = 18 byte

*.comb.Bag.min(*.value).key

Kiểm tra nó

{%(.comb.Bag.invert){1}}

Kiểm tra nó

Điều này sẽ trả về một giá trị không xác định khi được cung cấp một đầu vào không có ký tự lẻ.

Mở rộng:

{  # bare block lambda with implicit parameter 「$_」

  %(        # coerce into a Hash

    .comb   # split the input into graphemes (implicit method call on 「$_」)
    .Bag    # turn into a weighted Set
    .invert # invert that (swap keys for values) returns a sequence

  ){ 1 }    # get the character that only occurs once
}

0

Brainfuck, 125 byte

,[----------[>],]<[->+<]<<[[->->+<<]>[>[->-<<<+>>]>[,<<,>>]<<<[->+<]>[->+<]<]>[-<<+>>]>[-<+>]<<<<]>>>>[<]<++++++++++.

Dùng thử trực tuyến

In chữ cái của ma trận nếu không có số lẻ


0

Java 8, 85 byte

Đây là một lambda từ Stringđến String(ví dụ Function<String, String>). Nó thực chất là một bản sao của giải pháp của Luca , nhưng tôi đã phân loại chuỗi sắp xếp một chút.

s->new String(s.chars().sorted().toArray(),0,s.length()).replaceAll("(.)\\1+|\\n","")

Dùng thử trực tuyến

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.