整数が指定された基数(基数)の回文であるかどうかを判別


11

stdinから2つの整数を読み取るプログラムを作成します。それぞれの改行は終了し、以降は「number」および「radix」と呼ばれます。

  1. 数がその基数での回文である場合(例えば、あなたが望む任意の固定メッセージを出力しtruet1
  2. 数はその基数(例えばで回文ではない場合、あなたが望む任意の異なる固定メッセージを印刷しfalsef0、など)
  3. これらのメッセージは実行ごとに同じである必要がありますが、メッセージの内容(ゴルフに最適なもの)に関するルールはありません。
  4. 入力が有効な2つの正の整数であると仮定できます。「数」は超えません2147483647、「基数」は超えません32767
  5. 外部リソースを使用することはできませんが、言語にデフォルトで含まれている任意の数学関数を使用できます。

注: 基数は、数値の基数にすぎません。

サンプルの実行:

16
10
false

16
3
true

16
20
true

121
10
true

5
5
false

12346
12345
true

16781313
64
true

16781313
16
true

注:基数は、数値の基数にすぎません。

よさそうだ。ただし、外部リソースを禁止することもできます。

@ user2509848うーん、たとえば?
durron597 14

人がベース間で数値を変換する電卓をウェブ上で見つけることができれば、ほぼ確実に使用されます。私たちは最近、トロリーの回答が急増しています。

固定メッセージの1つを空の文字列にすることができます(もう1つが空でない文字列であると仮定します)。
トビー・スペイト

回答:


5

J(23文字)とK(19)の二重機能

この2つの言語は、一般的にもこの特定のゴルフでも非常によく似ています。Jは次のとおりです。

(-:|.)#.^:_1~/".1!:1,~1
  • ,~1-番号1を自分自身に追加して、配列を作成し1 1ます。
  • 1!:1-キーボードから2つの文字列1!:1を読み取ります(読み取ることであり1、キーボード入力のファイルハンドル/番号です)。
  • ". -各文字列を数値に変換します。
  • #.^:_1~/- F~/ x,y見つけることを意味しますy F x。私たちは、Fある#.^:_1基地拡張を行います。
  • (-:|.)-引数は-:その逆(|.)に一致しますか()?1はい、いいえ0

そして、これがKです。

a~|a:_vs/|.:'0::'``
  • 0::'``- コンソールから0::各(')行の文字列を()読み取り`ます(これのファイルハンドルです)。
  • .:'- .:各(')文字列を数値に変換()します。
  • _vs/|-基数が数値の前になるように数値のペアを逆にし、それらの間に/ベース拡張関数_vs(「スカラーからのベクトル」)を挿入()します。
  • a~|a:-この結果の展開をに割り当てa、次にその逆()にa一致するかどうか(~)を確認し|ます。繰り返し1ますが、はい、いいえ0

@ ak82この方法のほうが面白いと思います
ジョン・ドヴォルザーク14年

8

GolfScript、10文字

~base.-1%=

GolfScriptにとって簡単な方法であれば、それは簡単です。出力は0/ 1真/偽のために。

~       # Take input and evaluate it (stack: num rdx)
base    # Fortunately the stack is in the correct order for
        # a base transformation (stack: b[])
.       # Duplicate top of stack (stack: b[] b[])
-1%     # Reverse array (stack: b[] brev[])
=       # Compare the elements

3

APL(20)

⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕

出力0または1、例えば:

      ⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕
⎕:
      5
⎕:
      5
0
      ⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕
⎕:
      16781313
⎕:
      64
1

説明:

  • ⎕{... }⎕:2つの数値を読み取り、それらを関数に渡します。は最初の数であり、2番目の数です。
  • ⌊1+⍺⍟⍵floor(1+⍺ log ⍵)baseで表すのに必要な数字の数
  • ⍺/⍨:各桁のベース。計算したばかりの数値で複製されます。
  • ⍵⊤⍨指定されたベースで表現します(数値を使用するため、のすべての値で機能します)。
  • ≡∘⌽⍨:結果がその逆に等しいかどうかを確認します。

3

Perl、82 77 73 69バイト

$==<>;$.=<>;push(@a,$=%$.),$=/=$.while$=;@b=reverse@a;print@a~~@b?1:0

入力数はSTDINの入力行として期待され、結果は1or として書き込まれます。0前者は、最初の数が与えられたベースの表現の回文であることを意味します。

編集1:使用$=すると、intへの内部変換のため、いくつかのバイトが節約されます。

編集2: smartmatch演算子~~は配列要素を直接比較するため、文字列への変換は不要です。

編集3:不要な変数の削除による最適化。

65バイト:の出力として空の文字列が許可されているfalse場合、最後の4バイトを削除できます。

非ゴルフバージョン

$= = <>;
$. = <>;
while ($=) {
    push(@a, $= % $.);
    $= /= $.; # implicit int conversion by $=
}
@b = reverse @a;
print (@a ~~ @b) ? 1 : 0

アルゴリズムは、変換された数値の桁を配列に格納し@aます。次に、この配列の文字列表現が配列と逆の順序で比較されます。スペースで数字を区切ります。


申し訳ありませんが、私の答えは、実際には同じaproachですが、使用して$=、あなたがwhipe聞かせてintステップ...そしてのための質問スタンドanything you wantので、何もすることができ、あなたが何をしたい ;-)
F. HAURI

@ F.Hauri:ありがとう、更新します。「Perlでのゴルフのヒント」という質問に対するこの回答のヒント$=としても提供されています。返送には6バイト余分にかかりますが、固定メッセージは空にすることを意図していないという印象を受けました。0
ヘイコオベルディク14

裾,,戻り0コスト4余分なバイト、ない6。しかし、私は維持:ある何でも!silence
F. HAURI

@ F.Hauri:はい、4は正しいです。余分な2バイトは、未ゴルフバージョンの括弧でした。
ヘイコOberdiek 14

2

Javascript 87

function f(n,b){for(a=[];n;n=(n-r)/b)a.push(r=n%b);return a.join()==a.reverse().join()}

n引数は数値、b引数は基数です。


2

セージ、45

対話型プロンプトで実行します

A=Integer(input()).digits(input())
A==A[::-1]

プリントTrueそれは回文が、印刷されFalseそう


2

Perl 54 56 62

$==<>;$-=<>;while($=){$_.=$/.chr$=%$-+50;$=/=$-}say$_==reverse

テスト対象:

for a in $'16\n3' $'16\n10' $'12346\n12345' $'12346\n12346' $'21\n11' $'170\n16';do
    perl -E <<<"$a" ' 
        $==<>;$-=<>;while($=){$_.=$/.chr$=%$-+50;$=/=$-}say$_==reverse
    '
  done

あげる:

1

1


1

したがって、回文が見つかった場合の出力1true、他の場合は何もありません。

アンゴルフ:

$==<>;                            # Stdin to `$=`  (value)
$-=<>;                            # Stdin to `$-`  (radix)
while ( $= ) {
    $_.= $/. chr ( $= % $- +50 ); # Add *separator*+ chr from next modulo to radix to `$_`
    $=/= $-                       # Divide value by radix
}
say $_ == reverse                 # Return test result

注意

  • $_ 現在の行バッファであり、開始時には空です。
  • $=は元々行印刷に使用される予約変数です。これは行カウンタです。したがって、この変数は整数です。これを計算すると、int()使用された場合のように整数が切り捨てられます。
  • $- 伝統的な文字を使用しないために、楽しみのために使用されていました...(いくつかの難読化)...

明確にするために、これは回文ではない場合は何も言わず、回文ではない場合は1と言いますか?
durron597 14

1
素敵なトリック。ただし、正の値は間違っています。21は基数11です。数字は、文字列の比較に区切り文字が必要です。
ヘイコオベルディク14

Aaaarg +3!あなたにしている右のF ... @HeikoOberdiek
F. HAURI

@ F.Hauri:数字も逆になります。したがって、基数16の170は回文である0xAAですが、結果は偽です。
ヘイコオベルディク14

Aaarg +6!文字に変換しています...
F.ハウリ14年

1

Mathematica 77 43

IntegerDigits[n,b]nを基数bの数字のリストとして表します。各base-b桁は10進数で表されます。

たとえば、16781313はベース17の回文ではありません。

IntegerDigits[16781313, 17]

{11、13、15、11、14、1}

ただし、これベース16の回文です。

IntegerDigits[16781313, 16]

{1、0、0、1、0、0、1}


上記の例の順序付きペアが入力された場合、

(x=Input[]~IntegerDigits~Input[])==Reverse@x

戻ります

False(*({11、13、15、11、14、1}!= {1、14、11、15、13、11}のため)*)

True(*({1、0、0、1、0、0、1}は{1、0、0、1、0、0、1}に等しいため)*)


奇妙な、答えに必要ではないが、私は好奇心が強い、それはどのようにそれらをレンダリングしますか?
durron597 14

私は愚かなので、型キャストで負けたとき、私は...それを嫌う
user12205

「タイプキャスト」を親切に説明してください。
DavidC 14

私は入力するための入力をキャストする必要があるため、私のセージ・ソリューションは、2つの文字によってあなたより長いInteger
user12205

今、私はあなたの意味を理解しています。ありがとう。
DavidC 14年

1

Haskell(80文字)

tb 0 _=[]
tb x b=(tb(div x b)b)++[mod x b]
pali n r=(\x->(x==reverse x))(tb n r)

で呼び出しpali $number $radixます。数字が回文の場合はTrue、そうでない場合はFalse。



1

Perl 6、27バイト(stdin / outなしの22)

say (+get).base(get)~~.flip

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

  get()                     # pulls a line of stdin
 +                          # numerificate
(      ).base(get())        # pull the radix and call base to 
                            #  convert to string with that base
                    ~~      # alias LHS to $_ and smartmatch to
                      .flip # reverse of the string in $_

Perl6、読みやすいゴルフの王者(ゴルブ?)(および読みにくいものもあります)。

Perl 6関数(stdin / stdoutではない)、22バイト

{$^a.base($^b)~~.flip}

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


私は使用しなかった理由base私の答えでは、ということであるbaseベース36までサポートのみ、との質問は、最大基数サポートに尋ねる32767
ジョー・キング

ああ、知らなかった。うーん。
フィルH

0

dg-97バイト

dgを試す:

n,r=map int$input!.split!
a=list!
while n=>
 a.append$chr(n%r)
 n//=r
print$a==(list$reversed a)

説明:

n, r=map int $ input!.split!      # convert to int the string from input
a = list!                         # ! calls a function without args
while n =>
 a.append $ chr (n % r)           # append the modulus
 n //= r                          # integer division
print $ a == (list $ reversed a)  # check for palindrome list

0

C、140 132

int x,r,d[32],i=0,j=0,m=1;main(){scanf("%d %d",&x,&r);for(;x;i++)d[i]=x%r,x/=r;i--;for(j=i;j;j--)if(d[j]-d[i-j])m=0;printf("%d",m);}
  • 基数1はサポートされていません:)

1
ちょうどいいputs(m)でしょうか?
durron597 14年

printf("%d",m);8文字短くなります。
VX 14年

0

ハスケル-59

Max Riedの回答に対する変更はほとんどありません。

0%_=[]
x%b=x`mod`b:((x`div`b)%b)
p=((reverse>>=(==)).).(%)


0

dc、39バイト

長さはもちろん回文です(33₁₂)。

[[t]pq]sgod[O~laO*+sad0<r]dsrx+la=g[f]p

番号と基数は、スタックの最上部になければなりません(現在の基数で)。numberは少なくとも0でなければならず、基数は少なくとも2でなければなりません。出力はt回文であるf場合とそうでない場合です。チャレンジでは指定されていないため、数字に先行ゼロがないことを前提にしています(したがって、末尾が0パリンドロームになることはありません)。

説明

完全なプログラムとして:

#!/usr/bin/dc

# read input
??

# success message
[[t]pq]sg

# set output radix
o

# keep a copy unmodified
d

# reverse the digits into register a
[O~ laO*+sa d0<r]dsrx

# eat the zero left on stack, and compare stored copy to a
+ la=g

# failure message
[f]p

0

LaTeX、165バイト

desmos.comの例

k、基数は調整可能な入力です

b=\floor \left(\log _k\left(\floor \left(x\right)\right)\right)
f\left(x\right)=k^bx-x-\left(k^2-1\right)\sum _{n=1}^bk^{\left(b-n\right)}\floor \left(xk^{-n}\right)

の場合f(x)=0xベースの回文kです。


0

Perl 6、34バイト

PhilHのおかげで-4バイト

{@(polymod $^a: $^b xx*)~~[R,] $_}

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


あなたは2を保存する代わりに@rの_ $を使用することができます
フィル・H

@PhilH いいえ。(リストではなく、Seqを割り当てます)
ジョーキング

ああ、申し訳ありませんがエラーが表示されませんでした
Phil H

@PhilH 2番目のヒントは、バイトの節約にも役立ちました。
ジョーキング

1
$ _または@_でreduceメタを呼び出す簡単な方法がないことを常に悩ます。
フィルH

0

05AB1E 4  3 バイト

вÂQ

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

в      # The first (implicit) input converted to base second (implicit) input
       #  i.e. 12345 and 12346 → [1,1]
       #  i.e. 10 and 16 → [1,6]
 Â     # Bifurcate the value (short for duplicate & reverse)
       #  i.e. [1,1] → [1,1] and [1,1]
       #  i.e. [1,6] → [1,6] and [6,1]
  Q    # Check if they are still the same, and thus a palindrome
       #  i.e. [1,1] and [1,1] → 1
       #  i.e. [1,6] and [6,1] → 0

0

C(gcc)、79バイト

n,r,m;main(o){for(scanf("%d %d",&n,&r),o=n;n;n/=r)m=m*r+n%r;printf("%d",m==o);}

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

流れ落ちる

n,r,m;main(o){
for(scanf("%d %d",&n,&r),       Read the number and the radix.
o=n;                            ...and save the number in o
n;                              Loop while n is non-zero
n/=r)                           Divide by radix to remove right-most digit.
m=m*r+n%r;                      Multiply m by radix to make room for a digit
                                and add the digit.
printf("%d",m==o);}             Print whether we have a palindrome or not.

回文の場合、数値の逆数は数値自体と等しくなければならないという事実に基づいています。

ある拠点に3桁の数字ABCがあるとします。それをベースで乗算すると常にABC0になり、ABでベースで除算するとCが剰余になります。そのため、元の番号から右端の数字を取り出して、反転した番号の右側に挿入します。その桁にスペースを空けるために、事前に逆数にベースを掛けます。

基本的に:

n       rev
ABC     0
AB      C
AB      C0
A       CB
A       CB0
0       CBA

これはクールです、この背後にある数学を説明できますか?
durron597

@ durron597もちろん!投稿に説明を追加しました。
ガストロプナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.