Heterogram, Palindrom, oh my!


28

(Tantangan pertama, tolong beri tahu saya jika ada masalah dengannya.)

Sebuah heterogram adalah kata di mana tidak ada huruf alfabet terjadi lebih dari sekali, dan palindrom adalah ungkapan yang mundur sama dan ke depan.

Tantangannya di sini adalah untuk menulis sepotong kode yang mengambil kata (hanya huruf) sebagai input, dan menghasilkan apakah itu adalah heterogram (kebenaran / kepalsuan). Tangkapannya adalah bahwa program tersebut harus berupa palindrom - membaca yang sama mundur dan maju. Kapitalisasi tidak penting di sini, jadi untuk heterogram yang valid itu tidak bisa memiliki q dan Q, misalnya. Tidak ada komentar yang diizinkan, dan Anda tidak dapat menempatkan string yang berisi kode Anda (atau bagian penting dari kode Anda) untuk mencoba membuat bagian palindrome mudah: P

Ini kode-golf, jadi kode terpendek menang. Semoga berhasil!

EDIT: Parens, tanda kurung atau simbol lain yang memiliki bentuk kiri dan kanan harus dibalikkan dengan tepat untuk bagian palindrome. Jadi (helloolleh) adalah palindrom, tetapi (helloolleh (tidak. Rupanya ini disebut palindrome yang nyaman).

EDIT 2: Anda tidak akan mendapatkan input kosong, input dengan banyak kata atau input dengan karakter selain huruf. Jadi jangan khawatir tentang itu :)


Apakah kurung dianggap setara dengan palindromisitas? Artinya, apakah (hellolleh)palindrome yang valid? Mirip untuk [],, {}dan <>(jika perlu).
Glen O

Iya nih. Maaf, saya harus menjelaskan itu.
spaghetto

Bagaimana dengan baris baru, akan asdsadianggap sama dengan asd\nsa?
wendelbsilva

Tidak, mereka tidak akan setara.
spaghetto

5
Saya percaya ini disebut palindrome yang nyaman .
lirtosiast

Jawaban:


9

Pyth - 11 byte

(Trailing dan memimpin ruang yang diperlukan dan dihitung).

 z.{ z }.z 

Test Suite .

<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

Jawaban Mike's Pyth dikonversi ke huruf kecil sebelum melakukan. {, Apakah Anda yakin tidak perlu melakukan itu juga?
Sparr

18

Pyth, 17 byte

 Z.{rzZ.q.Zzr}.Z 

Cobalah online di sini.

Ruang terdepan diperlukan. Saya telah menghitungnya dan spasi tambahan dalam hitungan byte.

Berikut rinciannya:

     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
Astaga, dan aku khawatir ini akan terlalu sulit ... Kerja bagus!
spaghetto

2
Anda memiliki .qdi komentar Anda, tetapi .wdi program Anda.
James Webster

@ JamesWebster Terima kasih telah menunjukkannya. Seharusnya .q
Mike Bufardeci

16

Python 3, 125

Masalah utama adalah membuat kebalikan dari kode yang dapat diuraikan. Kemudian kita bisa membiarkannya keluar dari pengidentifikasi yang tidak terdefinisi.

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

Poin yang sangat kecil, tetapi dari aturan Anda harus mengubah yang kedua <menjadi >!
Jarmex

12

Perl, 43 byte

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

Contoh penggunaan:

echo "abcde" | perl -n entry.pl

Wow, itu luar biasa. Pekerjaan yang baik!
spaghetto

6

> <> , 137 131 Bytes

Ketika saya melihat tantangan ini, saya pikir> <> mungkin akhirnya menjadi pilihan bahasa yang baik karena menggunakannya Anda kebanyakan dapat mengabaikan palindrom; sederhana untuk memastikan pointer hanya tetap di tempat yang seharusnya. Meskipun ini benar,> <> sayangnya membuat persyaratan bermain golf menyiksa (atau hanya bermain golf pada umumnya). Saya berharap untuk menggunakan beberapa trik aneh yang saya pikirkan untuk mengimbangi ini, tapi inilah jawaban "cepat" (tidak sebenarnya, baik program-bijaksana dan penciptaan-bijaksana). Anda dapat mencobanya online di sini .

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

Mengembalikan 1 untuk true dan -1 untuk false (saya bisa mengubahnya ke 0 tetapi panjangnya akan tetap sama, sayangnya)

Seperti biasa, beri tahu saya jika ini tidak berhasil dan jika Anda memiliki ide tentang cara menurunkannya. Saya mengujinya terhadap beberapa kasus uji, tetapi selalu ada pengecualian.

Ini versi lain, yang menurut saya sedikit lebih pintar, tetapi sayangnya sepuluh byte lebih. Nilai kebenaran / kesalahan saat ini adalah 1 dan kesalahan ( 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<

Penjelasan:

Inilah kode tanpa bagian yang ditambahkan untuk menjadikannya palindrome. Yang ini tidak menggunakan trik "lebih pintar" yang saya coba gunakan untuk versi alternatif, jadi agak lebih mudah untuk menjelaskan (jika ada yang tertarik dengan penjelasan untuk "trik," saya akan dengan senang hati memberikan satu. , meskipun).

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

Baris 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

Inilah cara swapping berbelit-belit ( :{:@=?v$) bekerja - saya akan menggunakan test case stack ini: di [5,1,8,1]mana karakter terakhir adalah atas.

:{Bagian atas tumpukan digandakan:, [5,1,8,1,1]dan tumpukan bergeser ke kiri:[1,8,1,1,5]

:@Atas digandakan:, [1,8,1,1,5,5]maka tiga nilai teratas digeser ke kanan:[1,8,1,5,1,5]

=?v Tidak perlu untuk bagian penjelasan ini

$Nilai teratas ditukar sekali lagi menghasilkan [1,8,1,5], yang, jika Anda akan perhatikan, adalah tumpukan asli bergeser sekali (seolah-olah {telah menjadi satu-satunya perintah).


Jadi apa yang dilakukan dalam bahasa Inggris ("Terima kasih Tuhan, dia benar-benar menjelaskan hal-hal") adalah memeriksa seluruh tumpukan terhadap nilai teratas dan pindah ke titik di baris kedua jika ada nilai yang sama dengan atas. Pemeriksaan ini dilakukan proporsional dengan berapa banyak nilai yang ada di tumpukan ( l - 1, di mana lpanjang tumpukan) sehingga semua nilai diperiksa satu sama lain.

Baris 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

Senang melihat jawaban> <> :)
spaghetto

1
Juga, ><>adalah palindrom itu sendiri (hanya bukan yang nyaman)
Jo King

5

PHP, 126 Bytes

Anda perlu menjalankan ini dengan short_tagsdirektif Penyanyi berubah off di 5.4 atau di atas.

Golf pertama. Dua salinan, yang pertama mencetak sejumlah besar sampah dengan hasil palsu / benar:

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

Versi ini tidak akan mencetak jargon (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=?>

Jalankan dari baris perintah dengan

php -f golf.php heterogram

Mungkin bisa bermain golf sedikit lebih jauh


Pintar, meski mendorong batas validitas. Mungkin untuk olahraga pikirkan solusi dengan komentar
Martijn

Alih-alih ?><?, Anda bisa menggunakan //\\. Itu harus menghapus persyaratan itu. Dan alih-alih __halt_compiler()menggunakanreturn;
Ismael Miguel

Abaikan saja. Anda tidak dapat menggunakan komentar. Tapi return;itu masih berlaku.
Ismael Miguel

2

05AB1E, 9 byte

lDÙQqQÙDl

Cobalah online.

* Masukkan sesuatu tentang kembali ke tantangan pertama saya *

Non-bersaing sejak 05AB1E dibuat setelah tantangan ini.

Penjelasan

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
"Non-bersaing sejak 05AB1E dibuat sebelum tantangan ini." Mungkin yang Anda maksud setelah tantangan ini? ;)
ETHproduk

2

Brachylog , 3 byte, tantangan tanggal akhir bahasa

DdD

Cobalah online!

Ini adalah salah satu dari sedikit program yang bekerja baik di Brachylog 1 dan Brachylog 2. TIO link ke Brachylog 1 demi masa lalu. Juga secara tidak biasa untuk Brachylog, ini adalah program lengkap, bukan fungsi. (Program lengkap di Brachylog secara implisit menghasilkan boolean, yang memang kami inginkan untuk pertanyaan ini.)

Prinsip umum di sini adalah bahwa menempatkan predikat antara sepasang huruf besar identik adalah pernyataan bahwa nilai saat ini tidak berubah di bawah predikat itu. Jadi, Anda sering melihat hal-hal seperti AoA"diurutkan" ("invarian di bawah pengurutan"); A↔Aakan (dalam Brachylog 2) berarti "adalah palindrome" ("invarian di bawah pembalikan"), dan sebagainya. Program ini "tidak berubah dalam menghapus duplikat", yaitu "tidak mengandung duplikat". Ini benar-benar nyaman bahwa metode ini menentukan invarian kebetulan palindrom.



0

MATL , 7 byte

tuX=Xut

Cobalah online!

Mengembalikan daftar [1, 1] jika inputnya adalah heterogram dan [0, 0] jika tidak.

Penjelasan:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.