Câu đố Semi-palindrom


23

Một palindrom là một từ đó là đảo ngược của riêng mình.

Bây giờ có một số từ có thể trông giống như palindromes nhưng không. Ví dụ, hãy xem xét từ này sheesh, sheeshkhông phải là một bảng màu bởi vì ngược lại của nó hseehslà khác nhau, tuy nhiên nếu chúng ta coi shlà một chữ cái duy nhất, thì nó ngược lại sheesh. Loại từ này chúng ta sẽ gọi là một nửa bảng màu.

Cụ thể, một từ là một nửa bảng màu nếu chúng ta có thể chia từ này thành một số khối sao cho khi thứ tự của các khối được đảo ngược, từ gốc được hình thành. (Đối với sheeshcác đoạn này là sh e e sh) Chúng tôi cũng sẽ không yêu cầu đoạn nào chứa các chữ cái từ cả hai nửa của từ (nếu không, mỗi từ sẽ là một nửa bảng màu). Ví dụ, rearkhông phải là một nửa bảng màu vì r ea rcó một đoạn ( ea) chứa các chữ cái từ cả hai phía của từ gốc. Chúng tôi coi ký tự trung tâm trong một từ có độ dài lẻ nằm ở hai bên của từ, do đó, đối với các từ có độ dài lẻ, ký tự trung tâm phải luôn nằm trong đoạn riêng của nó.

Nhiệm vụ của bạn sẽ là lấy một danh sách các số nguyên dương và xác định xem chúng có phải là một nửa màu. Mã của bạn sẽ xuất ra hai giá trị không bằng nhau nhất quán, một nếu đầu vào là một nửa màu và mặt khác. Tuy nhiên, chuỗi byte của mã của bạn phải là một nửa bán chính.

Câu trả lời sẽ được tính bằng byte với ít byte hơn.

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

[] -> True
[1] -> True
[2,1,2] -> True
[3,4,2,2,3,4] -> True
[3,5,1,3,5] -> True
[1,2,3,1] -> False
[1,2,3,3,4,1] -> False
[11,44,1,1] -> False
[1,3,2,4,1,2,3] -> False

Chương trình tạo thêm testcase.


bor khủng chỉ ra rằng những điều này tương tự như các palindromes Smarandache tổng quát . Vì vậy, nếu bạn muốn đọc thêm một chút, đó là một nơi để bắt đầu.


2
Tại sao bạn xác định semi-palindromes bằng chuỗi nhưng đầu vào của bạn là mảng số nguyên? Ngoài việc gây nhầm lẫn, điều này có nghĩa là chúng tôi không thể kiểm tra mã nguồn của mình bằng chương trình riêng của chúng tôi.
BradC

@BradC Palindromes và những thứ tương tự thường được giải thích bằng các từ, vì nó dễ hơn một chút để làm như vậy.
Erik the Outgolfer

@BradC Chuỗi có xu hướng giới thiệu các trường hợp cạnh kỳ lạ, đặc biệt là về ký tự so với byte. Tôi chọn số vì chúng đơn giản hơn. Tôi nghĩ từ sẽ dễ dàng hơn cho mục đích giải thích.
Thuật sĩ lúa mì

2
Những loại palindromes này được gọi là Palindromes Generalized Smarandache trong tài liệu.
khủng khiếp

1
@RosLuP Có, palindromes "thật" cũng là nửa palindromes, chỉ cần xử lý từng ký tự / số nguyên như không có "chunking" bổ sung.
BradC

Câu trả lời:


6

Võng mạc 0.8.2 , 85 69 byte

M`^(.+,)*(\d+,)?(?<-1>\1)*$(?(1)^)|M`^(.+,)*(\d+,)?(?<-1>\1)*$(?(1)^)

Hãy thử trực tuyến! Giải trình:

M`

Chọn chế độ Khớp. Trên thực tế, Retina mặc định ở chế độ Kết hợp cho chương trình một dòng, nhưng bản sao thứ hai của mã sẽ luôn khớp nếu không có các ký tự phụ này.

^

Trận đấu phải bắt đầu từ đầu.

(.+,)*

Nắm bắt một số bước chạy của nhân vật. Mỗi lần chạy phải kết thúc bằng dấu phẩy.

(\d+,)?

Tùy chọn khớp một chữ số và dấu phẩy.

(?<-1>\1)*

Tùy chọn khớp tất cả các ảnh chụp theo thứ tự ngược lại, bật từng cái khi nó được khớp.

$

Trận đấu phải kết thúc ở cuối.

(?(1)^)

Backtrack trừ khi tất cả các ảnh chụp được bật lên. Nó hoạt động bằng cách yêu cầu trận đấu vẫn ở đầu chuỗi nếu chúng ta có một bản chụp chưa mở, điều này là không thể.


5

Thạch , 27 23 byte

ṖUṁ@Ƒ€ṚẸHḢŒŒHḢŒṖUṁ@Ƒ€ṚẸ

Trả về 1 cho semi-palindromes, 0 nếu không.

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

Làm thế nào nó hoạt động

ṖUṁ@Ƒ€ṚẸHḢŒŒHḢŒṖUṁ@Ƒ€ṚẸ  Main link. Argument: A (array)

          Π             Invalid token. Everything to its left is ignored.
           ŒH            Halve; divide A into two halves similar lengths. The middle
                         element (if there is one) goes into the first half.
             Ḣ           Head; extract the first half.
              ŒṖ         Generate all partitions of the first half.
                U        Upend; reverse each chunk of each partition.
                         Let's call the result C.

                     Ṛ   Yield R, A reversed.
                   Ƒ€    Fixed each; for each array P in C, call the link to the left
                         with arguments P and R.
                         Return 1 if the result is P, 0 if not.
                 ṁ@          Mold swapped; replace the n integers of C, in reading
                             order, with the first n integers of R.
                     Ẹ   Exists; check if one of the calls returned 1.


4

05AB1E , 59 47 43 41 byte

2äøø€.œ`âʒ`RQ}gĀIg_^q2äøø€.œ`âʒ`RQ}gĀIg_^

-12 byte nhờ @Emigna .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

2ä               # Split the input into two parts
                 #  i.e. [3,4,2,0,2,3,4] → [[3,4,2,0],[2,3,4]]
  øø             # Zip twice without filler
                 # This will remove the middle item for odd-length inputs
                 #  i.e. [[3,4,2,0],[2,3,4]] → [[3,2],[4,3],[2,4]] → [[3,4,2],[2,3,4]]
    €.œ          #  Then take all possible partitions for each inner list
                 #   i.e. [[3,4,2],[2,3,4]]
                 #    → [[[[3],[4],[2]],[[3],[4,2]],[[3,4],[2]],[[3,4,2]]],
                 #       [[[2],[3],[4]],[[2],[3,4]],[[2,3],[4]],[[2,3,4]]]]
`                # Push both lists of partitions to the stack
 â               # Take the cartesian product (all possible combinations) of the partitions
                 #  i.e. [[[[3],[4],[2]],[[2],[3],[4]]],
                 #        [[[3],[4],[2]],[[2],[3,4]]],
                 #        ...,
                 #        [[[3,4,2]],[[2,3,4]]]]
  ʒ   }          # Filter this list of combinations by:
   `             #  Push both parts to the stack
    RQ           #  Check if the second list reversed, is equal to the first
                 #   i.e. [[3,4],[2]] and [[2],[3,4]] → 1 (truthy)
       gĀ        # After the filter, check if there are any combinations left
                 #  i.e. [[[[3,4],[2]],[[2],[3,4]]]] → 1 (truthy)
         Ig_     # Check if the length of the input was 0 (empty input-list edge-case)
                 #  i.e. [3,4,2,0,2,3,4] → 7 → 0 (falsey)
            ^    # Bitwise-XOR
                 #  i.e. 1 XOR 0 → 1 (truthy)
             q   # Stop the program (and then implicitly output the top of the stack)
2äøø€.œ`âʒ`RQ}gĀIg_^
                 # Everything after the `q` are no-ops to comply to the challenge rules

Bạn có thể giải quyết vấn đề với các danh sách có độ dài lẻ với øøε.œ} `, tiết kiệm 6 byte. Bạn dường như cũng đã để lại 30 byte không sử dụng trong ...
Emigna

@Emigna các no-op ở cuối phải tuân thủ yêu cầu nguồn bị hạn chế của thách thức
Kamil Drakari

@KamilDrakari: Ồ đúng rồi. Quên phần đó đi. Tin tốt là lưu 6 byte sẽ là 12 byte sau đó :)
Emigna

@Emigna Rất thông minh với thủ thuật zip đôi. Tôi không hài lòng về phần đó, nhưng điều này tốt hơn rất nhiều! Btw, vì Elixir viết lại các lệnh 2 byte có thể được sử dụng thay vì ε }. :)
Kevin Cruijssen

@KevinCruijssen: Ah tuyệt. Tôi không biết điều đó.
Emigna

4

05AB1E , 37 byte

Sử dụng kỹ thuật tương tự Jonathan đã đưa ra.

.œʒ€gηOZ;îå}εÂQ}ZĀqĀZ}QÂε}åî;ZOηg€ʒ.œ

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


.œʒ€gηOZ;îå}εÂQ}ZĀqĀZ}QÂε}åî;ZOηg€ʒ.œ

Chương trình đầy đủ. Nhận danh sách từ STDIN, xuất 1 hoặc 0 đến STDOUT.

.œʒ        }

Bộ lọc giữ các phân vùng đáp ứng ...

   €gηOZ;îå

Điều kiện này: Độ dài của mỗi ( €g) được lưu trữ trong một danh sách, có tiền tố ( η) sau đó được tính tổng ( O), do đó cung cấp cho chúng tôi tổng số tích lũy của danh sách độ dài. Sau đó, một nửa trần của mức tối đa của danh sách đó được đẩy lên ngăn xếp - nhưng vẫn giữ danh sách gốc trên đó ( Z;î) và nếu nó xảy ra ( å) trong tổng tích lũy thì hàm trả về giá trị trung thực.

εÂQ}

Đối với mỗi, so sánh ( Q) a với một đảo ngược, được đẩy riêng trên ngăn xếp bằng cách Â. Trả về danh sách 0 s và 1 s.

ZĀq

Tối đa. Nếu bất kỳ là sự thật, thì 1 khác 0 . Kết thúc thực hiện. Tất cả mọi thứ sau đó là hoàn toàn bỏ qua.


3

Python 2 , 275 251 205 byte

-24 byte nhờ @KevinCruijssen

-44 byte nhờ @PostLeftGhostHunter

Thêm 2 byte nhờ @KevinCruijssen

def s(x):
 l=len(x)
 if l<2:return 1>0
 for i in range(1,l/2+1):
	if x[l-i:]==x[:i]:return s(x[i:l-i])
def s(x):
 l=len(x)
 if l<2:return 1>0
 for i in range(1,l/2+1):
	if x[l-i:]==x[:i]:return s(x[i:l-i])

Trả về True cho semi-palindrom, Không có gì khác

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


1
Hoặc chỉ cần quay lại 1
Jo King

Tại sao s (x) định nghĩa hai lần?
Bác sĩ Y Wit

Bởi vì họ nói được tính là palindrom ... nhưng có thể xác định một hàm có cùng tên không ???
RosLuP

@RosLuP Có bạn có thể. Người thứ hai chỉ ghi đè lên người đầu tiên
Jo King

3

Thạch ,  33  32 byte

-1 Cảm ơn Erik, Outgolfer Cũng xin
cảm ơn Dennis vì đã sửa lỗi và xem xét thay đổi một chi tiết triển khai trong Jelly.

ẸƇŒḂƇƊ$ƊĊHṀċÄẈṖŒŒṖẈÄċṀHĊƊ$ƊƇŒḂƇẸ

Năng suất bán palindromes 1, năng suất khác 0.

O(2n)

Hoặc xem bộ thử nghiệm .

Các khối chỉ là ŒḂs ({3 thứ & 4 thứ } vs {29 ngày & 30 ngày } byte), chỉ cần để cho phép mã để phân tích cú pháp.

Làm sao?

Tất cả công việc được thực hiện bởi phía bên tay phải - "Liên kết chính":

ŒṖẈÄċṀHĊƊ$ƊƇŒḂƇẸ - Main Link: list
ŒṖ               - all partitions
           Ƈ     - filter keep those for which this is truthy (i.e. non-zero):
          Ɗ      -   last three links as a monad:
  Ẉ              -     length of each
         $       -     last two links as a monad:
   Ä             -       cumulative addition
        Ɗ        -       last three links as a monad:
     Ṁ           -         maximum
      H          -         halve
       Ċ         -         ceiling
    ċ            -     count
              Ƈ  - filter keep those for which this is truthy:
            ŒḂ   -   is palindrome?
               Ẹ - any?

3

Perl 6 , 87 79 byte

-8 byte với một số thủ thuật từ câu trả lời của Jo King

$!={/\s/&&/^(.+)\s[(.+)\s]*$0$/&&$1.$!}#$!={/\s/&&/^(.+)\s[(.+)\s]*$0$/&&$1.$!}

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

Cổng trả lời JavaScript của tsh. Trả về hai đối tượng Regex khác nhau.




1

C (gcc) (X86), 216 byte

p(L,a,n)int*a;{return n?(memcmp(a,a+L-n,n*4)|p(L-2*n,a+n,L/2-n))&&p(L,a,n-1):1<L;}
#define p(L,a)p(L,a,L/2)//p(L,a,n)int*a;{return n?(memcmp(a,a+L-n,n*4)|p(L-2*n,a+n,L/2-n))&&p(L,a,n-1):1<L;}
#define p(L,a)p(L,a,L/2)

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

p(L,a,n)trả về 0 nếu mảng acó độ dài Llà nửa bảng, 1 nếu không. Cho rằng tất cả các tiền tố về độ dài >nđã được kiểm tra, nó so sánh tiền tố của độ dài nvới hậu tố của độ dài n. p(L,a)là điểm vào.

Thật không may, giải pháp thú vị hơn là dài hơn:

224 byte

(f(L,a,n))//#define p(L,a)(n=L/2,
int*a,n;
{return n?(memcmp(a,a+L-n,n*4)|f(L-2*n,a+n,L/2-n))&&f(L,a,n-1):1<L;}//{return n?(memcmp(a,a+L-n,n*4)|f(L-2*n,a+n,L/2-n))&&f(L,a,n-1):1<L;}
int*a,n;
#define p(L,a)(n=L/2,f(L,a,n))//(

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

Ung dung:

(f(L,a,n)) //#define p(L,a)(n=L/2,
int*a,n;
{
  return n 
    ? (memcmp(a, a+L-n, n*4) | f(L-2*n, a+n, L/2-n)) &&
      f(L,a,n-1)
    : 1 < L;
} // { ... } 
int*a,n;
#define p(L,a)(n=L/2,f(L,a,n)) //(

1

Japt , 66 byte


@¯X eUsXn}a1 "
ʧV?UÊ<2:ßUéV sVÑ
@¯X eUsXn}a1 "
ʧV?UÊ<2:ßUéV sVÑ

Phiên dịch viên Japt

Cải tiến lớn phiên bản này, nó thực sự đánh bại hầu hết các ngôn ngữ thực tế hiện nay. Bây giờ hoạt động trên một mảng các số nguyên do phương thức trước đó có lỗi.

Giải trình:

@        }a1         Find the first number n > 0 such that...
 ¯X                   the first n elements
     UsXn             and the last n elements
    e                 are the same

"
ʧV?UÊ<2:ßUéV sVÑ    String literal to make it a Semi-palindrome
@¯X eUsXn}a1 "

ʧV?                 If n >= length of input...
    UÊ<2              return true if the length is less than 2
        :            Otherwise...
          UéV         move n elements from the end of the input to the start
              sVÑ     remove the first 2*n elements
         ß            and repeat on the remaining elements

0

PHP byte byte

function f($a){for($x=2>$c=count($a);++$i<=$c/2;)$x|=($s=array_slice)($a,0,$i)==$s($a,-$i)&f($s($a,$i,-$i));return$x;}#function f($a){for($x=2>$c=count($a);++$i<=$c/2;)$x|=($s=array_slice)($a,0,$i)==$s($a,-$i)&f($s($a,$i,-$i));return$x;}

hàm đệ quy, trả về true(đối với đầu vào chứa ít hơn hai phần tử) hoặc 1cho sự thật,
0cho sai. Hãy thử trực tuyến (có sự cố).

Độ dài mã thực tế là 118 byte; semi-palindrom được tạo thông qua sao chép mã.

Để có hiệu suất tốt hơn, thay thế &bằng &&và chèn !$x&&trước ++$i.


0

Scala, 252 byte

def^(s:Seq[Int]):Int={val l=s.size;if(l>1)(1 to l/2).map(i=>if(s.take(i)==s.takeRight(i))^(s.slice(i,l-i))else 0).max else 1}//def^(s:Seq[Int]):Int={val l=s.size;if(l>1)(1 to l/2).map(i=>if(s.take(i)==s.takeRight(i))^(s.slice(i,l-i))else 0).max else 1}

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

Tái bút Rõ ràng, giải pháp dài hơn 2 lần chỉ để đáp ứng yêu cầu mã nguồn là bán palindrom.

PPS. Không phải là một ứng cử viên golf-code mà hoàn toàn là giải pháp chức năng sử dụng khớp mẫu:

  def f(s:Seq[Int], i:Int=1):Int = {
    (s, i) match {
      case (Nil ,_) => 1
      case (Seq(_), _) => 1
      case (l, _) if l.take(i) == l.takeRight(i) => f(l.slice(i,l.size-i), 1)
      case (l, j) if j < l.size/2 => f(l, i+1)
      case (_, _) => 0
    }
  }

Thách thức đòi hỏi mã của bạn cũng phải là một nửa bảng màu. Đó là điều thú vị nhất trong thử thách.
Thuật sĩ lúa mì

@PostLeftGhostHunter, tôi đã thêm mã nguồn gốc vào bình luận để đáp ứng yêu cầu. BTW, điều thú vị của việc tạo mã nguồn bán palindrom là gì? Nếu tôi không sai, mọi giải pháp trong chuỗi này sẽ ngắn hơn hai lần nếu không có yêu cầu này. Bạn có biết bất kỳ giải pháp không như thế?
Bác sĩ Y Wit

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.