Heterogramlar, Palindromlar, aman tanrım!


28

(İlk zorluk, lütfen bununla ilgili herhangi bir sorun olup olmadığını bana bildirin.)

Bir heterogram , alfabenin bir harfinin bir defadan fazla bulunmadığı bir kelimedir ve bir palindrom , geriye ve ileriye aynı olan bir ifadedir.

Buradaki zorluk girdi olarak bir kelimeyi (sadece harfler) alan ve bunun bir heterogram olup olmadığını (truthy / falsy) çıkaran bir kod parçası yazmaktır. Yakalama, programın bir palindrom olması gerektiğidir - aynısını geriye ve ileriye okur. Büyük harf değil o mesela hem q ve Q, olamaz geçerli olmak çok heterogram için, burada önemli. Yorum yapılmasına izin verilmez ve palindrome bölümünü kolaylaştırmak için kodunuzu (veya kodunuzun önemli bir bölümünü) içeren dizeleri yerleştiremezsiniz: P

Bu kod golf, yani en kısa kod kazanır. İyi şanslar!

EDIT: Parens, parantez veya sol ve sağ formlara sahip diğer semboller, palindrom bölümü için yaklaşık olarak ters çevrilmelidir. Öyleyse (helloolleh) bir palindrome, ama (helloolleh (öyle değil. Görünüşe göre buna uygun bir palindrome denir).

2 EDIT: Boş bir giriş, birden çok kelime ile giriş veya harflerden farklı karakterlerle giriş yapamazsınız. Bu yüzden endişelenme :)


Parantezler palindromicity için eşdeğer kabul edilir mi? Yani (hellolleh)geçerli bir palindrom mu? Benzer [], {}ve <>(uygun olduğunda).
Glen O

Evet. Üzgünüm, bunu açıklamalıydım.
bir

Peki ya yeni çizgiler, asdsaeşit sayılır asd\nsa?
wendelbsilva

Hayır, eşdeğer olmazlardı.
bir

Yanıtlar:


9

Pyth - 11 bayt

(İzleyen ve öndeki boşluklar gerekli ve sayıldı).

 z.{ z }.z 

Test Takı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

Mike'ın Pyth cevabı, yapmadan önce küçük harfe çevrilir. {, Sizin de bunu yapmanız gerekmediğinden emin misiniz?
Sparr

18

Pyth, 17 bayt

 Z.{rzZ.q.Zzr}.Z 

Burada çevrimiçi deneyin.

Baştaki boşluk gereklidir. Ben saydım ve bayt sayımındaki sondaki boşluk.

İşte dağılım:

     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
Tanrım, ve bunun çok zor olacağından endişelendim ... Güzel iş!
Bir spaghetto

2
Bir var .qyorumlarınızda ama .wprogramınızda.
James Webster,

@JamesWebster Bunu işaret ettiğiniz için teşekkür ederiz. Olması gereken .q
Mike Bufardeci

16

Python 3, 125

Asıl sorun, kodun tersini ayrıştırılabilir hale getirmektir. Sonra tanımsız tanımlayıcılardan hata çıkmasına izin verebiliriz.

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

Çok küçük bir nokta, ama kurallardan <ikinciyi a >!
Jarmex

12

Perl, 43 bayt

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

Kullanım örneği:

echo "abcde" | perl -n entry.pl

Vay canına bu inanılmaz. İyi iş!
Bir spaghetto

6

> <> , 137 131 Bayt

Bu meydan okumayı gördüğümde, sonunda palindromları görmezden gelebileceğiniz için iyi bir dil seçimi olabileceğini düşündüm. işaretçinin yalnızca olması gerektiği yerde kaldığından emin olmak kolaydır. Bu doğru olsa da,> <> maalesef golf koşullarını aşırı derecede (veya sadece genel olarak golf oynamayı) zorlaştırıyor. Bunun için telafi etmeyi düşündüğüm bazı tuhaf hileler kullanmayı umuyorum, ama işte "hızlı" (aslında, hem programda hem de yaratımda) cevap. Burada çevrimiçi deneyebilirsiniz .

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

True için 1, false için -1 döndürür (bunu 0 olarak değiştirebilirim, ancak uzunluk ne yazık ki aynı kalır)

Her zaman olduğu gibi, bu işe yaramazsa ve nasıl golf oynamak hakkında bir fikriniz varsa bana bildirin. Birkaç test olayına karşı test ettim, ancak her zaman bir istisna olabilirdi.

İşte biraz daha zekice olduğunu düşündüğüm başka bir sürüm daha var ama ne yazık ki on bayt daha fazla. Bu sefer Truthy / falsey değerleri 1 ve bir hata ( 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<

Açıklama:

İşte bir palindrome yapmak için eklenen kısmı olmayan kod. Bu, alternatif sürüm için kullanmaya çalıştığım "daha akıllıca" püf noktalarını kullanmıyor, bu yüzden açıklamak biraz daha kolay (eğer herhangi biri "püf noktaları" ile ilgili bir açıklama yapmak isterse, bir tane vermekten mutluluk duyarım) , olsa).

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

Satır 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

Kıvrımlı swapping ( :{:@=?v$) nasıl çalışır? - Bu yığının bir test senaryosunu kullanacağım: [5,1,8,1]son karakter en üstte.

:{Yığının üstü çoğaltılır: [5,1,8,1,1]ve yığın sola kaydırılır:[1,8,1,1,5]

:@Üst kopyalanır: [1,8,1,1,5,5]sonra ilk üç değer sağa kaydırılır:[1,8,1,5,1,5]

=?v Açıklamanın bu kısmı için gereksiz

$En yüksek değer bir kez daha değiştirilir [1,8,1,5], eğer dikkat ederseniz, orijinal yığının bir kez kaydırıldığı ( {tek komut sanki ).


Öyleyse bunun İngilizce'de yaptığı şey ("Tanrıya şükür, aslında bir şeyler açıklıyor") , tüm yığını en yüksek değere karşı kontrol etmek ve herhangi bir değer en üste eşitse, ikinci satırdaki bir noktaya geçmek. Bu denetleme (yığınında kaç değerleri orantılı küçük yapılır l - 1, ltüm değerler birbirine karşı kontrol edilir, böylece yığının uzunluğudur).

Hat 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

Bir> <> cevap :)
bir spaghetto

1
Ayrıca, ><>bir palindrom kendisi (sadece uygun bir değil)
Jo King

5

PHP, 126 Bayt

Bunu short_tagsini yönergesi 5.4 veya daha üstü kapalıyken çalıştırmanız gerekir .

Şimdiye kadar ilk golf. İki kopya, ilki sahte / truthy sonucu bir sürü çöp basar:

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

Bu sürüm herhangi bir jargon (162 bayt) basmaz:

<?=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=?>

İle komut satırından çalıştır

php -f golf.php heterogram

Muhtemelen biraz daha golf oynayabilir


Zekice olsa da, geçerlilik sınırlarını zorluyorum. Belki spor için yorumlar ile bir çözüm düşünüyorum
Martijn

Bunun yerine ?><?kullanabilirsiniz //\\. Bu gereksinimi ortadan kaldırmalı. Ve __halt_compiler()kullanım yerinereturn;
Ismael Miguel

Gözardı et. Yorum kullanamazsın. Ancak return;yine de geçerlidir.
Ismael Miguel

2

05AB1E, 9 bayt

lDÙQqQÙDl

Çevrimiçi deneyin.

* ilk zorluğuma geri dönme konusunda bir şeyler ekleyin *

05AB1E’den bu yana rekabet etmeyen bu mücadeleden sonra yapıldı.

açıklama

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
"05AB1E’den bu yana rekabet etmeyen bu mücadeleden önce yapıldı." Belki bu mücadeleden sonra demek istedin? ;)
ETHproductions

2

Brachylog , 3 bayt, dil kayıt sonrası mücadelesi

DdD

Çevrimiçi deneyin!

Bu, hem Brachylog 1 hem de Brachylog 2'de çalışan çok az programdan biridir. TIO bağlantısı, eski zamanlar için Brachylog 1'edir. Aynı zamanda, Brachylog için genellikle bu, bir işlev değil, tam bir programdır. (Brachylog'daki tüm programlar dolaylı olarak, bu soru için istediğimiz şey olan boolean'leri çıktılar.)

Buradaki genel ilke, bir çift özdeş büyük harf arasına bir tahmin yerleştirmenin, mevcut değerin bu tahmin altında değişmez olduğu iddiasıdır. Sık sık AoA"sıralanır" ("sıralamanın altında değişmez"); A↔A(Brachylog 2’de), “bir palindrom” (“tersine çevrilemez”) anlamına gelir, vb. Bu program "kopyaların kaldırılması altında değişmez", yani "kopya içermiyor". Değişmezliği belirleme yönteminin bir palindrom olması gerçekten uygun.


1

Brachylog , 3 bayt

≠ụ≠

Çevrimiçi deneyin!

Giriş, bir heterogram ise yüklem başarılı, başarısız ise başarısız olur.

≠      The characters of the input are all distinct,
 ụ     and when converted to upper case,
  ≠    are still all distinct.

0

MATL , 7 bayt

tuX=Xut

Çevrimiçi deneyin!

Girdi bir heterogram ise listeyi [1, 1] ve değilse [0, 0] döndürür.

Açıklama:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.