ヘテログラム、パリンドローム、なんてこった!


28

(最初の課題は、問題があるかどうかを教えてください。)

heterogramはアルファベットのない手紙が複数回発生していない、と言葉で回文が同じ前後にあるフレーズです。

ここでの課題は、単語(文字だけ)を入力として受け取り、それがヘテログラム(真実/偽)であるかどうかを出力するコードを書くことです。キャッチは、プログラムが回文である必要があるということです-同じ前後を読み取ります。ここで大文字化重要ではないため、ヘテログラムを有効にするには、たとえばqとQの両方を含めることはできません。コメントは許可されません。また、回文部分を簡単にするために、コード(またはコードの重要な部分)を含む文字列を配置することはできません:P

これはコードゴルフなので、最短のコードが優先されます。がんばろう!

編集:パリンドローム部分については、左右の形の括弧、括弧、またはその他の記号を適切に反転する必要があります。(helloolleh)は回文ですが、(helloolleh(はそうではありません。これは便利な回文と呼ばれます。

編集2:空の入力、複数の単語の入力、または文字以外の文字の入力はありません。だからそれを心配しないでください:)


括弧は回文性と同等と見なされますか?つまり(hellolleh)、有効な回文ですか?以下のための同様の[]{}および<>(適切な場合)。
グレンO

はい。申し訳ありませんが、私はそれを説明すべきでした。
spaghetto

新ラインについては、何をされますasdsaと同等とみなされますかasd\nsa
wendelbsilva

いいえ、同等ではありません。
spaghetto

5
便利な回文と呼ばれていると思います。
リルトシアスト

回答:


9

Pyth-11バイト

(トレーリングおよび先行スペースが必要であり、カウントされます)。

 z.{ z }.z 

テストスイート

<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

マイクのPythの回答は、。{を実行する前に小文字に変換します。
スパー16

18

Pyth、17バイト

 Z.{rzZ.q.Zzr}.Z 

こちらからオンラインでお試しください。

先行スペースが必要です。私はそれを数え、バイト数の末尾のスペースを数えました。

内訳は次のとおりです。

     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
うん、これが難しいのではないかと心配していました。
spaghetto

2
あなたの.qコメントにはあるが、.wあなたのプログラムにはある。
ジェームズウェブスター

@JamesWebsterそれを指摘してくれてありがとう。.qである必要があります
マイクブファルデシ

16

Python 3、125

主な問題は、コードの逆を解析可能にすることです。次に、未定義の識別子からエラーを出すことができます。

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

非常にマイナーなポイントですが、ルールから、2番目<>!に変更する必要があります。
Jarmex


6

> <>137 131バイト

この挑戦を見たとき、> <>は言語の良い選択かもしれないと思った。ポインタが本来あるべき場所に留まるようにするのは簡単です。これは事実ですが、残念ながら、ゴルフの条件付けは耐え難いものになります(または一般的には単にゴルフになります)。これを補うために私が考えた奇妙なトリックを使用したいと思っていますが、ここに「クイック」(実際には、プログラムと作成の両方ではない)答えがあります。こちらからオンライン試すことができます

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の場合は1、falseの場合は-1を返します(0に変更することはできますが、残念ながら長さは同じままです)

いつものように、これがうまくいかないかどうか、そしてゴルフをする方法について何かアイデアがあれば教えてください。いくつかのテストケースに対してテストしましたが、常に例外が発生する可能性があります。

ここに別のバージョンがありますが、私はもう少し賢いと思いますが、悲しいかな10バイト多くなります。今回のTruthy / falsey値は1およびエラー(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<

説明:

これは、回文にするために追加された部分のないコードです。これは、私が代替バージョンに使用しようとした「より賢い」トリックを使用しないため、説明が少し簡単です(「トリック」の説明に興味がある人は、喜んで提供します) 、しかし)。

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

ライン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

複雑なスワッピング(:{:@=?v$)の仕組みを次に示します。このスタックのテストケースを使用します[5,1,8,1]。最後の文字が最上位になります。

:{スタックの最上部が複製されます:[5,1,8,1,1]、スタックは左にシフトします:[1,8,1,1,5]

:@上部が複製されます:[1,8,1,1,5,5]、上部の3つの値は右にシフトされます:[1,8,1,5,1,5]

=?v 説明のこの部分には不要

$一番上の値がもう一度スワップされ[1,8,1,5]ます。これは、元のスタックが1回だけシフトされたことに注意してください({唯一のコマンドであるかのように)。


したがって、これが英語で行われること(「ありがとう、彼は実際に物事を説明している」)は、スタック全体を最上位の値と照合し、値が最上位に等しい場合は2行目のポイントに移動します。このチェックは、スタック内の値の数に比例して行われ(l - 1、ここlで、スタックの長さ)、すべての値が互いにチェックされます。

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

> <>答え:)見て喜ん
spaghetto

1
また、><>パリンドローム自体(便利なものではありません)
ジョーキング

5

PHP、126バイト

これは、5.4以降でshort_tagsiniディレクティブをオフにて実行する必要があります。

史上初のゴルフ。2つのコピー、最初のコピーは、偽物/真実の結果を含む大量のゴミを印刷します。

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

このバージョンでは、専門用語(162バイト)は出力されません。

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

コマンドラインから実行します

php -f golf.php heterogram

おそらくもう少しゴルフすることができます


賢い、しかし有効性の限界を押し広げる。多分スポーツのために、コメント付きの解決策を考えてください
-Martijn

代わりに?><?、を使用できます//\\。それはその要件を削除する必要があります。__halt_compiler()使用の代わりにreturn;
イスマエルミゲル

無視してください。コメントは使用できません。しかし、return;まだ有効です。
イスマエルミゲル

2

05AB1E、9バイト

lDÙQqQÙDl

オンラインでお試しください。

*最初のチャレンジに戻るまでのことを挿入してください*

05AB1Eはこのチャレンジの後に作成されて以来、競合していません。

説明

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が作成されて以来、競合していません。」おそらく、あなたはこの挑戦のを意味したのでしょうか?;)
ETHproductions

2

Brachylog、3バイト、言語のポストデートチャレンジ

DdD

オンラインでお試しください!

これは、Brachylog 1とBrachylog 2の両方で機能する数少ないプログラムの1つです。TIOリンクは、昔からBrachylog 1へのリンクです。Brachylogにとっても通常ではないが、これは完全なプログラムであり、機能ではありません。(Brachylogの完全なプログラムは暗黙的にブール値を出力しますが、これがこの質問に必要なものです。)

ここでの一般的な原則は、同じ大文字のペアの間に述語を置くことは、その述語の下で現在の値が不変であるという主張であるということです。そのAoAため、「ソートされている」(「ソート中の不変式」)などのことがよく見られます。A↔A(Brachylog 2で)は「回文である」(「反転下で不変」)などを意味します。このプログラムは「重複を除去しても不変」、つまり「重複を含まない」です。この不変性を指定する方法が偶然パリンドロームであることは本当に便利です。



0

MATL、7バイト

tuX=Xut

オンラインでお試しください!

入力がヘテログラムの場合はリスト[1、1]を返し、そうでない場合は[0、0]を返します。

説明:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.