入力で割り切れる最小のパリンドローム


23

正の整数を指定するとN、この数が回文(つまり、それ自身の逆数)であり、で割り切れるような最小の正の整数を出力しNます。

回文(つまり出力)は、回文になるために先行ゼロを必要としてはなりません。たとえば080、の有効な答えではありません16

前の理由により、入力が10の倍数になることはありません。

実際には回答を出力するには長すぎても、プログラムには必要な時間がかかる場合があります。

入力と出力

  • を介して入力をSTDIN関数の引数などとして受け取ることができます。
  • 出力をSTDOUTに印刷し、関数から返すか、類似のものを返すことができます。
  • 入力と出力は10進数でなければなりません。

テストケース

N        Output
1        1
2        2
16       272
17       272
42       252
111      111
302      87278
1234     28382

得点

これはであるため、バイト単位の最短回答が優先されます。


入力は10で割り切れますか?
リーキー修道女

@LeakyNunいいえ、パリンドロームは先行ゼロを必要としないため、解決策がないためです。これを明示します。
16

入力は正になりますか?
小麦ウィザード

1
@WheatWizardはい:正の整数が与えられたN
致命

ごめんなさい どうやって見逃したかわかりません。
ウィートウィザード

回答:


9

2sable / 05AB1E、6/7バイト

2セーブル

[DÂQ#+

説明

[         # infinite loop
 D        # duplicate current number
  Â       # bifurcate
   Q#     # if the number is equal to its reverse, break loop
     +    # add input
          # implicitly print

オンラインで試す

05AB1E

[DÂQ#¹+

2sableコードとの違いは、入力が05AB1Eで暗黙的に1回だけであるため、ここで¹最初の入力を再度取得する必要があることです。

オンラインで試す

Adnanが示唆するように、2バイトで1バイトを保存


@ファタライズ私はただそれを書いていた:)
エミグナ

2sableに切り替えると、次のようにして1バイトを保存できます[DÂQ#+
アドナン

@アドナン:そう!暗黙的な入力の繰り返しにより、1バイト節約されます:)
エミグナ


13

Pyth、7バイト

*f_I`*Q

オンラインで試す:デモンストレーション

説明

*f_I`*QT)Q   implicit endings, Q=input number
 f      )    find the first number T >= 1, which satisfies:
     *QT        product of Q and T
    `           as string
  _I            is invariant under inversion (=palindrom)
*        Q   multiply this number with Q and print

非常に多くのcodegoldの質問を読んだ後、私は... Pythは、次のJS / Javaの/ルビー/ Pythonのだろうと考えるのは始めている
agilob

5
@agilob oh親愛なる神pls no。
アレクサンダー-モニカーの復活

7

Java(登録商標)、164の 159 126 108 94バイト

ゴルフバージョン:

int c(int a){int x=a;while(!(x+"").equals(new StringBuffer(x+"").reverse()+""))x+=a;return x;}

ゴルフされていないバージョン:

int c(int a)
{
    int x = a;
    while (!(x + "").equals(new StringBuffer(x + "").reverse() + ""))
        x += a;
    return x;
}

EmignaとKevin Cruijssenに、改善に貢献し、バイトをほぼ半分に削減したことに対する大声で叫ぶ:)


1
x % a == 0xをaとして初期化し、aだけ増やすと、冗長ではありませんか?また、文字列の反転との比較は、while条件で実行できますか?
エミグナ

削除import org.apache.commons.lang.StringUtils;してorg.apache.commons.lang.StringUtils.reverse直接使用できます。for(;;)はより短いwhile(1>0)int c(int a){...}質問には次のルールがあるので、完全なプログラムを必要とせず、有効な回答として行うだけです。「入力を関数の引数として受け取ることができます。関数から出力を返すことができます。」モジュロチェックは必要ありません。
ケビンCruijssen 16

ああ、もちろん歓迎!この投稿が好きかもしれません:Javaでのゴルフのヒント
ケビンCruijssen 16

@Emigna:あなたは絶対に正しい、そうしました。
ピーチ

@KevinCruijssen:(by x += a)で割り切れる数だけを反復処理するため。分割可能性をチェックする必要はありません:)そして、ゴルフのヒントに感謝します!
ピーチ

7

C#、103 80バイト

int f(int p){int x=p;while(x+""!=string.Concat((x+"").Reverse()))x+=p;return x;}

非ゴルフ

int f(int p)
{
   int x = p;
   while (x + "" != string.Concat((x + "").Reverse()))
      x += p;
   return x;
}

2
iを削除し、x + = pでインクリメントすることで、いくつかのバイトを節約できます。
スタニウス

1
x.ToString()'x + "" `で置き換えると、大量の文字が保存されます。

6

Python 2、46バイト

f=lambda x,c=0:`c`[::-1]==`c`and c or f(x,c+x)

できた!

cカウンターとしての再帰的ソリューション。

パリンドロームの条件は満たしていますが、常に返されるため、返されない0ため、このケースは興味深いものです。c=0ccc and 0 or xxxxxx


1
少し短いですc*(`c`[::-1]==`c`)or
xnor

5

PHP、39バイト

while(strrev($i+=$argv[1])!=$i);echo$i;
  • 引数として数値Nを取ります$ argv [1];
  • ; しばらくして何もしない
  • strrev 文字列を後方に返す

forループと同じ長さ

for(;strrev($i+=$argv[1])!=$i;);echo$i;


5

Javascript(ES6)、55 51バイト

ニールのおかげで4バイト。

f=(x,c=x)=>c==[...c+""].reverse().join``?c:f(x,x+c)
<input type=number min=1 oninput=o.textContent=this.value%10&&f(+this.value)><pre id=o>


コードスニペットの作成中に遊んでみると、最初のコード+は不要なようです。
ニール

(x,c=x)あなたは避けることができ&&c
ニール

もうc^[...c+""].reverse().join``?f(x,x+c):c1バイト節約できると思います。
アーナルド

c-c^必要に応じて、よりも少し高い数値で機能します。
ニール


4

C、217 189バイト

スタンドアロン版:

int a(char*b){int c=strlen(b);for(int i=0;i<c/2;i++)if(b[i]!=b[c-i-1])return 0;}int main(int e,char **f){int b,c;char d[9];b=atoi(f[1]);c=b;while(1){sprintf(d,"%d",c);if(a(d)&&(c/b)*b==c)return printf("%d",c);c++;}}

機能バージョンの呼び出し:

int s(char*a){int b=strlen(a);for(int i=0;i<b/2;i++)if(a[i]!=a[b-i-1])return 0;}int f(int a){int b;char c[9];b=a;while(1){sprintf(c,"%d",b);if(s(c)&&(b/a)*a==b)return printf("%d",b);b++;}}

アンゴルフド:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int check_palindrome(char *str) {
  int length = strlen(str);

  for (int i = 0; i < length / 2; i++) {
    if (str[i] != str[length - i - 1])
      return 0;
  }
  return 1;
}

int main(int argc, char **argv) {
  int number;
  int pal;
  char string[15];

  number = atoi(argv[1]);
  pal = number;
  while (1) {
    sprintf(string, "%d", pal);
    if (check_palindrome(string) && (pal / number) * number == pal)
      {
        printf("%d\n", pal);
        return 1;
      }
    pal++;
  }
  return 0;
}

ungolfed関数の呼び出し:

int s(char *a) {
  int b = strlen(a);

  for (int i = 0; i < b / 2; i++) {
    if (a[i] != a[b - i - 1])
      return 0;
  }
  return 1; //We can remove it, it leads to a undefined behaviour but it works
}

int f(int a) {
  int b;
  char c[9];

  b = a;
  while (1) {
    sprintf(c, "%d", b);
    if (s(c) && (b / a) * a == b)
      {
        printf("%d\n", b); //no need for the \n
        return 1; //just return whatever printf returns, who cares anyway ?
      }
    b++;
  }
  return 0; //no need for that
}

履歴のためにスタンドアロンバージョンを含めました。

これは私の最初のcodegolfです、コメントは大歓迎です!


チャレンジ用に別の関数を作成し、main()好みに関係なくカウントしないことをお勧めします。「好きだから」とタグ付けする前に、最初に12回ループして野球をすることはありません。安全に到達することはありません。これは競争であり、主なルールは、必要かつ合法的な手段を使用してバイト数を減らすことです。

1
@Snowman Fair Enouth、「関数の呼び出し」バージョンを含めるように回答を編集しました。これにより、パラメーターとしてintを取得し、さらに数バイトを取得できます。
バレンティンマリエット

「include <string.h>」なしで関数をコンパイルしますか?答えが#define F forまたは#define R return for countを使用せずに使用できない場合
-RosLuP

@RosLuPはい、いくつかの警告が出ますが、gccはそれをコンパイルできます。
バレンティンマリエット

こんにちは、ヒントをいくつかドロップします!1)Cは暗黙のintを持っているため、このようにコードを変更できますint f(int a)-> f(a) 2)int関数パラメーターを使用できるs を宣言する必要がある場合:int f(int a){int b;-> f(a,b){ 3)sprintf決して0を返さないため、次で使用できますwhilewhile(1){sprintf(c,"%d",b);-> while(sprintf(c,"%d",b)){ 4 )関数を定義するためにK&R Cを使用して、touが私の2番目のヒントとコンボできるようにしますint s(char*a){int b=strlen(a);for(int i=0s(a,b,i)char*a;{b=strlen(a);for(i=0;
。-

4

R、117の 113 109 101バイト

D=charToRaw;P=paste;S=strtoi;a=P(i<-scan()+1);while(!all(D(a)==rev(D(a))&&S(a)%%i==0)){a=P(S(a)+1)};a

非ゴルフ

i<-scan()        #Takes the input

D=charToRaw      #Some aliases
P=paste
S=strtoi
a=P(i+1)         #Initializes the output

while(!(all(D(a)==rev(D(a)))&&(S(a)%%i==0))) #While the output isn't a palindrom and isn't
                                             #divisible by the output...
    a=P(S(a)+1)

a

all(charToRaw(a)==rev(charToRaw(a)))aの値の各位置aとその逆が同じであるかどうかを確認します(つまり、a回文であるかどうか)。
をいじっていくつかのバイトをゴルフアウトすることが可能かもしれませんtypes


4

実際には15 14バイト

Leaky Nunによる回答を求められました。ゴルフの提案を歓迎します。オンラインでお試しください!

╖2`╜*$;R=`╓N╜*

アンゴルフ

          Implicit input n.
╖         Save n in register 0.
2`...`╓   Push first 2 values where f(x) is truthy, starting with f(0).
  ╜*$       Push register 0, multiply by x, and str().
  ;R        Duplicate str(n*x) and reverse.
  =         Check if str(n*x) == reverse(str(n*x)).
          The map will always result in [0, the x we want].
N         Grab the last (second) value of the resulting list.
╜*        Push n and multiply x by n again.
          Implicit return.


3

VBSCRIPT、47バイト

do:i=i+1:a=n*i:loop until a=eval(strreverse(a))

食べない

do                     #starts the loop
i=i+1                  #increments i, we do it first to start at 1 instead of 0
a=                     #a is the output
n*i                    #multiply our input n by i
loop until 
a=eval(strreverse(a))  #end the loop when our output is equal to its reverse

3

Perl、25バイト

+2を含む -ap

STDINの入力で実行します。

palidiv.pl <<< 16

palidiv.pl

#!/usr/bin/perl -ap
$_+="@F"while$_-reverse



2

MATL、10バイト

0`G+tVtP<a

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

0      % Push 0
`      % Do...while
  G+   %   Add the input. This generates the next multiple of the input
  tV   %   Duplicate, convert to string
  tP   %   Duplicate, reverse
  <a   %   Is any digit lower than the one in the reverse string? This is the
       %   loop condition: if true, the loop proceeds with the next iteration
       % End do...while
       % Implicitly display

2

PowerShell v2 +、72バイト

for($i=$n=$args[0];;$i+=$n){if($i-eq-join"$i"["$i".Length..0]){$i;exit}}

PowerShellでの逆転の処理方法が長いため、あまりよくありません。;-)

入力を受け取り$args[0]$i(私たちのループ変数)に格納し、$n(入力)。インクリメント、無限ループ$i$n毎回ます(分割可能性を保証するため)。

各反復で$i、回文であるかどうかを確認します。ここでいくつかのトリックが行われているので、説明させてください。まず$i、それを使用して文字列化し"$i"ます。その後、文字列に戻される["$i".length..0]前に、逆の順序で配列のインデックスが作成され-joinます。これは、-equality演算子の右側に入力され、暗黙的に文字列を[int]ます。これは、左側のオペランドであるため。注:このキャストは、回文から先行ゼロを取り除きますが、入力がで割り切れないことが保証されているため、問題ありません10

それから、ifそれは回文です、私達は単に置きます$iexitです。パイプラインとに配置するです。実行の終了時に出力は暗黙的です。

テストケース

PS C:\Tools\Scripts\golfing> 1,2,16,17,42,111,302,1234|%{"$_ -> "+(.\smallest-palindrome-divisible-by-input.ps1 $_)}
1 -> 1
2 -> 2
16 -> 272
17 -> 272
42 -> 252
111 -> 111
302 -> 87278
1234 -> 28382

2

MATLAB、76バイト

function s=p(n)
f=1;s='01';while(any(s~=fliplr(s))) s=num2str(n*f);f=f+1;end

呼び出し形式はp(302)結果が文字列です。

ここには賢いものは何もありません。関数num2str()fliplr()関数を使用して線形検索を行います。

このい配置は、while(1) ... if ... break endパターンを使用するよりも短いタッチです。

非ゴルフ

function s = findFirstPalindromeFactor(n)
  f = 1;                        % factor
  s = '01';                     % non-palindromic string for first try
  while( all(s ~= fliplr(s)) )  % test s not palindrome
    s = num2str( n * f );       % factor of input as string
    f = f + 1;                  % next factor
  end

2

Mathematica、49バイト

(c=#;Not[PalindromeQ@c&&c~Mod~#==0]~While~c++;c)&

で検索を開始し、回文ではなく、で割り切れない場合はc = N増分します。条件が満たされると、が出力されます。cNc


2

ゼリー、12バイト

¹µ+³ßµDU⁼Dµ?

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

説明:

このリンクは1つの引数を取ります。µsが4部に分割します。最後から開始して左に移動:

           ? The three parts in front of this are the if, else, and
             condition of a ternary expression.
      DU⁼D  This condition takes a number n as an argument. It converts
            n to an array of decimal digits, reverses that array, and
            then compares the reversed array to the decimalization of
            n (ie is n palindromic in decimal?)
  +³ß  This is the else. It adds the original input argument to n
       and then repeats the link with the new value of n.
¹  This is the if. It returns the value passed to it.



2

Python 2、66 65バイト

i入力でxあり、(最終的に)出力

def f(i,x):
    y=x if x%i==0&&`x`==`x`[::-1]else f(i,x+1)
    return y

他の回答をスクロールした後、短いPython 2の回答を見つけましたが、私はソリューションに努力を注ぎました。¯\ _(ツ)_ /¯


でスペースを削除でき[::-1] elseます。
mbomb007

yの割り当てを削除して、式をリターンの最後に置くことはできませんか?return x if x%i==0&&x ==x [::-1]else f(i,x+1)は、ラムダにすることができ、さらに多くのバイトをゴルフできることを意味しますか?
破壊可能なレモン



2

QBIC、29バイト

:{c=a*q~!c$=_f!c$||_Xc\q=q+1

説明:

:      Get cmd line param as number 'a'
{      DO
c=a*q  multiply 'a' by 'q' (which is 1 at the start of a QBIC program) and assign to 'c'
~      IF
!c$    'c' cast to string
=      equals
_f!c$| 'c' cast to string, the reversed
|      THEN
_Xc    Quit, printing 'c'
\q=q+1 ELSE increment q and rerun
       DO Loop is auto-closed by QBIC, as is the IF

1

Perl 6、35バイト

->\N{first {$_%%N&&$_==.flip},N..*}
->\N{first {$_==.flip},(N,N*2...*)}
->\N{(N,N*2...*).first:{$_==.flip}}

説明:

-> \N {
  # from a list of all multiples of the input
  # ( deduced sequence )
  ( N, N * 2 ... * )

  # find the first
  .first:

  # that is a palindrome
  { $_ == .flip }
}

1

Perl 6、39バイト

my &f={first {.flip==$_},($_,2*$_...*)}

(33を含まないmy &f=

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