Heterograms, Palindromes, oh my!


28

(Thử thách đầu tiên, xin vui lòng cho tôi biết nếu có bất kỳ vấn đề nào với nó.)

Một heterogram là một từ mà không có chữ cái nào trong bảng chữ cái xuất hiện nhiều hơn một lần và palindrom là một cụm từ giống nhau và ngược lại.

Thách thức ở đây là viết một đoạn mã lấy một từ (chỉ các chữ cái) làm đầu vào, và đưa ra liệu đó có phải là một chữ dị (sự thật / giả). Điều hấp dẫn là chương trình phải là một bảng màu - đọc tương tự ngược và xuôi. Viết hoa không quan trọng ở đây, vì vậy, để heterogram có hiệu lực, chẳng hạn, nó không thể có cả q và Q. Không có nhận xét nào được cho phép và bạn không thể đặt các chuỗi có chứa mã của bạn (hoặc một phần quan trọng trong mã của bạn) để cố gắng làm cho phần palindrom dễ dàng: P

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng. Chúc may mắn!

EDIT: Parens, ngoặc hoặc các ký hiệu khác có dạng trái và phải phải được đảo ngược một cách khủng khiếp cho phần palindrom. Vì vậy (helloolleh) là một palindrom, nhưng (helloolleh (không phải. Rõ ràng đây được gọi là một palindrom tiện lợi.

EDIT 2: Bạn sẽ không nhận được bất kỳ đầu vào trống, đầu vào có nhiều từ hoặc đầu vào với các ký tự không phải là chữ cái. Vì vậy, đừng lo lắng về điều đó :)


Các dấu ngoặc được coi là tương đương với độ nhạt màu? Đó là, là (hellolleh)một palindrom hợp lệ? Tương tự cho [], {}<>(khi thích hợp).
Glen O

Vâng. Xin lỗi, tôi nên đã giải thích rằng.
một spaghetto

Những gì về dòng mới, sẽ asdsađược coi là bằng asd\nsa?
wendelbsilva

Không, chúng sẽ không tương đương.
một spaghetto

5
Tôi tin rằng nó được gọi là một palindrom thuận tiện .
lirtosiast

Câu trả lời:


9

Pyth - 11 byte

(Trailing và hàng đầu không gian cần thiết và tính).

 z.{ z }.z 

Phòng thử nghiệm .

<space>        Suppress print
 z             Input (for palindromness)
.{             Unique - actually does testing
  z            Input
<space>        Suppress print
  }            In operator
   .z          Cached input list
   <space>     At end of program makes empty tuple

Câu trả lời Pyth của Mike chuyển thành chữ thường trước khi thực hiện. {, Bạn có chắc bạn cũng không cần phải làm điều đó?
Sparr

18

Bình thường, 17 byte

 Z.{rzZ.q.Zzr}.Z 

Hãy thử trực tuyến tại đây.

Không gian hàng đầu là cần thiết. Tôi đã đếm nó và dấu cách trong số byte.

Đây là sự cố:

     z            z is initialized to the input
    r Z           Z is initialized to 0, and r(string)0 converts the string to lowercase
  .{              .{ is pyth's builtin uniqueness test
       .q         .q terminates the program
         .Zzr}    This is just the program mirrored
              .Z  . requires a number to immediately follow it
                  If left blank the parser would throw an error
 Z                This is just mirrored from the end
                  The leading space suppresses the automatic printing of this 0
                  The trailing space mirrors the leading space

3
Jeez, và tôi đã lo lắng rằng điều này sẽ quá khó ... Làm tốt lắm!
một spaghetto

2
Bạn có một .qý kiến ​​của bạn, nhưng một .wtrong chương trình của bạn.
James Webster

@JamesWebster Cảm ơn bạn đã chỉ ra điều đó. Nó phải là .q
Mike Bufardeci

16

Con trăn 3, 125

Vấn đề chính là làm cho mã ngược lại có thể phân tích được. Sau đó, chúng ta có thể để nó lỗi từ các định danh không xác định.

w=[str.lower][0]((input)())
(print)((max)((map)(w.count,w))<2)
(2>((w,tnuoc.w)(pam))(xam))(tnirp)
(()(tupni))[0][rewol.rts]=w

Điểm rất nhỏ, nhưng từ quy tắc bạn nên thay đổi thứ hai <thành a >!
Jarmex

12

Perl, 43 byte

print+m:^(?!.*(.).*\1|1/*.(.)*.!?)^:m+tnirp

Ví dụ sử dụng:

echo "abcde" | perl -n entry.pl

Ồ, thật tuyệt với. Công việc tốt!
một spaghetto

6

> <> , 137 131 byte

Khi tôi thấy thử thách này, tôi nghĩ> <> cuối cùng có thể là một lựa chọn tốt về ngôn ngữ vì sử dụng nó, bạn hầu như có thể bỏ qua các palindromes; thật đơn giản để đảm bảo con trỏ chỉ ở đúng nơi cần thiết. Trong khi điều này là đúng,> <> không may làm cho việc chơi golf trở nên khó chịu (hoặc chỉ nói chung là chơi golf). Tôi hy vọng sẽ sử dụng một số thủ thuật kỳ lạ mà tôi nghĩ ra để bù đắp cho điều này, nhưng đây là một câu trả lời "nhanh chóng" (không thực sự, cả khôn ngoan theo chương trình và sáng tạo). Bạn có thể thử nó trực tuyến ở đây .

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
  ;n1<^  -*48<   .00~<  ;n-10<01-n;  >~00.   >84*-  ^>1n;
<.0e&$v?=@:}:&v?)1:-1lv?("Z":<v?)0:i

Trả về 1 cho true và -1 cho false (tôi có thể thay đổi thành 0 nhưng độ dài sẽ không thay đổi)

Như mọi khi, hãy cho tôi biết nếu điều này không hiệu quả và nếu bạn có bất kỳ ý tưởng nào về cách đánh golf xuống. Tôi đã thử nghiệm nó với một vài trường hợp thử nghiệm, nhưng luôn có thể có một ngoại lệ.

Đây là một phiên bản khác, một phiên bản mà tôi nghĩ là thông minh hơn một chút, nhưng than ôi là hơn mười byte. Giá trị Truthy / falsey lần này là 1 và lỗi ( something smells fishy...):

>i:0(?v>:"Z")?vl: 2(?v&{:@$:@=01-*2.
 < ;n1<^  -*48<f6+0.0<
 &1-:1)e*1.1*e(1:-1& 
>0.0+6f>84*-  ^>1n; > 
.2*-10=@:$@:}&v?)2 :lv?("Z":<v?)0:i<

Giải trình:

Đây là mã không có phần được thêm vào để biến nó thành một bảng màu. Cách này không sử dụng các thủ thuật "thông minh hơn" mà tôi đã cố sử dụng cho phiên bản thay thế, vì vậy sẽ dễ giải thích hơn một chút (nếu có ai quan tâm đến lời giải thích cho "thủ thuật", tôi rất vui lòng đưa ra một mẹo , Tuy nhiên).

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
  ;n1<^  -*48<   .00~<  ;n-10<

Dòng 1:

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
i:0(?v                                 #Pushes input and directs down if negative
      >:"Z")?v                         #Directs down if input is greater than "Z"
                                       #(reduces lowercase input to uppercase)
              l                        #Pushes length

                                       #Main loop begins
               1-:1(?v                 #Decrements top, and then directs down if less than 1
                      &                #Pushes top of stack onto register (length minus 1)
                       :{              #Duplicates top, shifts stack to the left
                         :@            #Duplicates top, shifts top three values of the stack to the right

                           =?v         #If top two values are equal, directs down
                              $        #Swaps top two values of the stack
                               &       #Pushes register onto stack
                                e0.    #Jumps back to the "1" after "?vl"
                                       #Main loop ends

                                   >   #Makes sure when the pointer jumps back to i it goes the right way

Đây là cách :{:@=?v$hoạt động hoán đổi ( ) phức tạp - Tôi sẽ sử dụng trường hợp thử nghiệm của ngăn xếp này: [5,1,8,1]trong đó ký tự cuối cùng là trên cùng.

:{Đỉnh của ngăn xếp được nhân đôi: [5,1,8,1,1]và ngăn xếp dịch chuyển sang trái:[1,8,1,1,5]

:@Đỉnh được nhân đôi : [1,8,1,1,5,5], sau đó ba giá trị trên cùng được dịch sang phải:[1,8,1,5,1,5]

=?v Không cần thiết cho phần giải thích này

$Giá trị hàng đầu được hoán đổi một lần nữa cho năng suất [1,8,1,5], mà nếu bạn lưu ý, là ngăn xếp ban đầu được dịch chuyển một lần (như thể {đó là lệnh duy nhất).


Vì vậy, những gì nó làm bằng tiếng Anh ("Cảm ơn Chúa, anh ấy thực sự giải thích mọi thứ") là kiểm tra toàn bộ ngăn xếp so với giá trị hàng đầu và di chuyển đến một điểm trong dòng thứ hai nếu bất kỳ giá trị nào bằng với đỉnh. Việc kiểm tra này được thực hiện tương ứng với số lượng giá trị trong ngăn xếp ( l - 1trong đó lđộ dài của ngăn xếp) để tất cả các giá trị được kiểm tra đối với nhau.

Dòng 2:

  ;n1<^  -*48<   .00~<  ;n-10<
   n1<                          #If input is less than 0 (i.e. there is none), print 1
  ;                             #and terminate

             <                  #If redirected because input is greater than "Z"
         -*48                   #Push 32, subtract (reducing lowercase to uppercase, numerically)
      ^                         #And move back to the portion that tests if input 
                                #is uppercase (which it will pass now)

                     <          #If counter is less than 1 (for main loop)
                 .00~           #Pop the counter and jump to the beginning (i)

                             <  #If any two values in the stack are equal
                          -10   #Push -1 (subtract 1 from 0)
                        ;n      #Print and terminate

Vui mừng khi thấy một> <> câu trả lời :)
một spaghetto

1
Ngoài ra, ><>là một palindrom chính nó (chỉ không phải là một thuận tiện)
Jo King

5

PHP, 126 byte

Bạn cần chạy lệnh này với lệnh short_tagsini đã tắt trong 5.4 hoặc cao hơn.

Golf đầu tiên bao giờ hết. Hai bản sao, bản đầu tiên in cả đống rác với kết quả sai lệch / trung thực:

<?=var_dump(max(array_count_values(str_split(end($argv))))<2)?><?(2>((((vgra$)dne)tilps_rts)seulav_tnuoc_yarra)xam)pmud_rav=?>

Phiên bản này sẽ không in bất kỳ biệt ngữ nào (162 byte):

<?=var_dump(max(array_count_values(str_split(end($argv))))<2);__halt_compiler()?><?()relipmoc_tlah__;(2>((((vgra$)dne)tilps_rts)seulav_tnuoc_yarra)xam)pmud_rav=?>

Chạy từ dòng lệnh với

php -f golf.php heterogram

Có lẽ có thể chơi gôn xa hơn một chút


Thông minh, mặc dù đẩy giới hạn của tính hợp lệ. Có lẽ đối với các môn thể thao nghĩ về một giải pháp với ý kiến
Martijn

Thay vì ?><?, bạn có thể sử dụng //\\. Điều đó sẽ loại bỏ yêu cầu đó. Và thay vì __halt_compiler()sử dụngreturn;
Ismael Miguel

Coi thường nó Bạn không thể sử dụng ý kiến. Nhưng return;vẫn còn hiệu lực.
Ismael Miguel

2

05AB1E, 9 byte

lDÙQqQÙDl

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

* chèn một cái gì đó về việc quay trở lại thử thách đầu tiên của tôi *

Không cạnh tranh kể từ 05AB1E đã được thực hiện sau thử thách này.

Giải trình

lDÙQqQÙDl
l           Take input and lowercase it.
 DÙ         Duplicate and uniquify.
   Q        Compare the two strings.
    q       Immediately exit.
     QÙDl   The rest of the program is ignored.

1
"Không cạnh tranh kể từ 05AB1E đã được thực hiện trước thử thách này." Có lẽ bạn có ý nghĩa sau thử thách này? ;)
Sản phẩm điện tử

2

Brachylog , 3 byte, thách thức ngôn ngữ

DdD

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

Đây là một trong số rất ít các chương trình hoạt động trong cả Brachylog 1 và Brachylog 2. Liên kết TIO là Brachylog 1 vì lợi ích của thời xưa. Cũng không mong muốn cho Brachylog, đây là một chương trình đầy đủ, không phải là một chức năng. (Các chương trình đầy đủ trong Brachylog hoàn toàn xuất ra booleans, đây chỉ là những gì chúng tôi muốn cho câu hỏi này.)

Nguyên tắc chung ở đây là việc đặt một vị ngữ giữa một cặp chữ in hoa giống hệt nhau là một khẳng định rằng giá trị hiện tại là bất biến dưới vị từ đó. Vì vậy, bạn thường thấy những thứ như AoA"được sắp xếp" ("bất biến theo cách sắp xếp"); A↔Awould (trong Brachylog 2) có nghĩa là "là một palindrom" ("bất biến dưới sự đảo ngược"), v.v. Chương trình này là "bất biến dưới việc loại bỏ trùng lặp", tức là "không chứa các bản sao". Thật tiện lợi khi phương pháp xác định tính bất biến này là một bảng màu.



0

MATL , 7 byte

tuX=Xut

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

Trả về danh sách [1, 1] nếu đầu vào là một heterogram và [0, 0] nếu không.

Giải trình:

t       % duplicate the input
u       % remove duplicates from the original
X=      % check the two lists are equal
Xu      % unique rows (does nothing as we now have a boolean)
t       % duplicate the result
        % (implicit) convert to string and display
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.