回転対称性のある数


27

整数、出力所与truthyのそれは同じ逆さまである場合、値または(180°回転)falsyそうでない場合、値を。

01、及び8回転対称性を持っています。6となり9、逆もまた同様です。

真実の結果を生み出す一連の数字:OEIS A000787

0, 1, 8, 11, 69, 88, 96, 101, 111, 181, 609, 619, 689, 808, 818, 888, 906, 916, 986, 1001, 1111, 1691, 1881, 1961, 6009, 6119, 6699, 6889, 6969, 8008, 8118, 8698, 8888, 8968, 9006, 9116, 9696, 9886, 9966, 10001, 10101, 10801, 11011, 11111, 11811, 16091, ...

この質問は、投稿時の私自身の評判に触発されました:6009


これは、Print rotation-safe numbersの duに似ています
xnor

2
@xnorそれらはまったく同じではありません。その質問には、同じ番号であるかどうかではなく、ローテーション時に番号が別の有効な番号になるかどうか(およびピリオドを追加して区別する)が含まれます。私は私の質問を投稿する前にその質問を調べました。
mbomb007

@ mbomb007私の間違い。再開しました。
-xnor

入力を文字列として取得できますか?
xnor

@xnor言語に数値型がある場合は、たとえば関数パラメーターなどに数値型を使用する必要があります。しかし、たとえばPythonでを取得したraw_input場合、ユーザーが整数を入力すると、背後で文字列になります。それはいいです。
mbomb007

回答:


6

05AB1E22 16 15 14バイト

コード:

Â23457ð«-69‡Q

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


前のコード:

Â69‡Q¹¹„vd•ÃQ*

文字列が回転対称であるかどうかを判断するには、で音訳69するだけで96、文字列を逆にして、それらが等しいかどうかを確認するだけです。私たちが知っておく必要がある他の事は番号があればあるだけの数字が含まれている01869。それがまさに私たちがやろうとしていることです。

                     # Bifurcate the input, which pushes input and input[::-1]
 69Â                  # Bifurcate 69, which pushes 69 and 96.
    ‡                 # Transliterate 69 with 96 in the input, e.g. 1299 becomes 1266.
     Q                # Check for equality.
      ¹¹              # Push input again twice.
        „vd•          # Compressed version for 10869.

„vd•一部は実際には、文字列変換vdからベース190ベース10こちらで試してみることができます

            Ã        # Keep the characters of the second string in the first string.
                       667788 would become 6688 (since 7 is not in 10869).
             Q       # Check for equality.
              *      # Multiply the top two numbers, which actually does an AND function.

CP-1252エンコードを使用します。オンラインでお試しください!


9

Python 2、50バイト

lambda n:`n`==`map('01xxxx9x86'.find,`n`)`[-2::-3]

このメソッド'01xxxx9x86'.findは、逆さまの数字に数字を使用し-1ます。この関数は逆数文字列にマッピングされ、数字のリストを生成します。

これは、[1::3]トリックを使用して文字列に変換されますが、代わりに逆に実行されます[-2::-3](これはDennisに感謝し、4バイトを節約します)。元の数値文字列と比較されます。-1反転不可能な数字からのすべては、変換を不整列にし、失敗させます。


56バイト:

lambda n:`n`[::-1]==`n`.translate('01xxxx9x86______'*16)

逆にされた数値文字列が、逆さまの置換と同じかどうかをチェックします。反転できない数字は、'x'常に間違った答えを与えるために置き換えられます。

translate256文字の文字列で置換が行われ、対応するASCII値が置換されます。唯一の10個の値が48する57問題では、私は短い方法がある場合は全長が256 I不思議可能にするために長さ16に埋め込まれます。

他のアプローチ(長さ59、60、60):

lambda n:set(zip(`n`,`n`[::-1]))<=set(zip('01896','01869'))
r=lambda s:set(zip(s,s[::-1]));lambda n:r(`n`)<=r('9018106')
lambda n:all(a+b in'001188969'for a,b in zip(`n`,`n`[::-1]))

たぶんこれが役立つでしょう:codegolf.stackexchange.com/a/48994/34718
mbomb007

6

ルビー、54 46バイト

 ->a{(b=a.to_s).tr('1-9','1w-z9x86').reverse==b}

私は知らない、そのような匿名関数は許可されているかどうか

Python2の答えと基本的に同じ考え。入力が整数でない場合、悪い行動をとる(つまりabaを与えるtrue


1
プログラミングパズルとコードゴルフへようこそ!最初のいい答え:D無名関数、通常の名前付き関数許可されるすべてのコンテキストで許可されます。


4

JavaScript(ES6)、56バイト

n=>n==[...''+n].reverse().map(c=>'0100009086'[c]).join``

配列の...は何をしますか?
ericw31415

@ ericw31415この場合、文字列を文字の配列に変換します。より一般的には、反復可能なものであれば何でも提供でき、反復処理を行って要素を配列に含めます。
ニール

[... '' + n]は本質的にn.split( "")と同じものですか?これについてどこでもっと読むことができますか?
ericw31415

@ ericw31415はい、この場合はの省略形として使用しsplit``ます。参照してくださいAより強力な配列リテラル
ニール

2

Perl、29 26バイト

+1を含む -p

STDINの入力で実行します。

rotation.pl <<< 69

rotation.pl

#!/usr/bin/perl -p
$_=reverse==y/962-7/69a/r

2

ゼリー、16 15バイト

,ȷ9+90860¤Dị/⁼Ṛ

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

使い方

,ȷ9+90860¤Dị/⁼Ṛ  Main link. Argument: n (integer)

         ¤       Evaluate the three links to the left as a niladic chain:
 ȷ9              Yield 1000000000.
    90860        Yield 90860.
   +             Add to yield 1000090860.
,                Pair; yield [n, 1000090860].
          D      Convert both integers to base 10.
           ị/    Reduce by index, i.e., for each digit of n, retrieve the element
                 of [1, 0, 0, 0, 0, 9, 0, 8, 6, 0] at that index (1-based).
              Ṛ  Yield the digits of n in reversed order.
             ⁼   Test for equality.

この回答は15バイトで別の回答と結び付けられていますが、他の回答が最初に投稿されました。1バイト削り取ることができますか?
mbomb007

私はかなり一生懸命努力しました。できるとは思わない。ただし、デフォルトのタイブレーカー、勝利スコアを達成するための最初の回答であり、最初に15に到達したと思います。
デニス


2

sh、40 33バイト

[ `rev<<<$1|tr 6923457 96` = $1 ]

コマンドライン引数による入力、終了コードによる出力。すべてのテストケースを生成します。

for i in `seq 0 10000`
do
  if [ `rev<<<$i|tr 6923457 96` = $i ]
  then
    echo $i
  fi
done

2

TSQL、122バイト

私はゴルフをコーディングするのは初めてなので、キャラクターの数え方がよくわかりません。この場合に使用される数は8なので、ここでは1としてカウントします

これは、逆の値が一致する場合は1を返し、一致しない場合は何も返しません。

SELECT 1FROM(values(8))x(x)WHERE(x)NOT like'%[23457]%'and REPLACE(REPLACE(x,6,4),9,6)=REVERSE(REPLACE(REPLACE(x,9,4),9,6))

人間が読める形式:

SELECT 1
FROM
  (values(808))x(x)
WHERE(x)
  NOT like'%[23457]%'
  and REPLACE(REPLACE(x,6,4),9,6)=REVERSE(REPLACE(REPLACE(x,9,4),9,6))

2

網膜40 38 33バイト

$
;$_
T`92-7`69`;.+
+`(.);\1
;
^;

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

説明

これは、他のRetina回答とはまったく異なるアプローチを使用します。すべての対称部分を削除する代わりに、単に文字列を反転し、スワップ69sの変換を実行してから、等しいかどうかを比較します。非対称の数字が表示されないようにするために、それらを9半分にsに変換します。

$
;$_

入力を複製するには、文字列の末尾を照合し、;その後に入力全体を挿入します。

T`92-7`69`;.+

これは、と一致させることにより、後半でのみ文字の音訳を実行し;.+ます。2つの音訳セットは次のように展開されます。

9234567
6999999

そのため2-7範囲を示し、ターゲットセットがソースセットの長さに一致するように最後の文字で埋められます。したがって、ステージはスワップ69、すべて234579s に変換します。

+`(.);\1
;

繰り返し(+;。これは、のみ;が残るか、周囲の2つの文字;が同一でなくなるまで続きます。つまり、文字列が互いに逆ではないことを意味します。

^;

最初の文字が;and printであるかどうか、0または1それに応じてチェックします。


レバー、非常にレバー。
CalculatorFeline


1

Pyth、17バイト

!-FmC_B`d,QC\􄽥

Pyth Compilerでテストします。

使い方

!-FmC_B`d,QC\􄽥  (implicit) Store the input in Q.

            \􄽥  Yield the Unicode character with code point 1068901.
           C    Compute its code point.
         ,Q     Pair the input and 1068901.
   m            Map; for each d in [Q, 1068901]:
       `d         Yield the string representation of d.
     _B           Yield the pair of `d` and `d` reversed.
    C             Zip. For the second string, this gives
                  ['11', '00', '69', '88', '96', '00', '11'].
 -F             Fold by difference, i.e., removes all pairs in the second list
                from the first list.
!               Logically negate the result, returning True iff the list is empty.

1

Visual Basic for Applications、150 111バイト

コンソールまたはUDFとして使用できます。

Function c(b)
c=(Not b Like"*[!01869]*")And b=Replace(Replace(Replace(StrReverse(b),9,7),6,9),7,6)
End Function

暗黙の型変換を利用し、方程式の両側で2つのステップの代わりに3つのステップのスワップを行うことにより改善されました。インクルードFunctionおよびEnd Functionステートメントをカウントします。


1

GNU sed、84バイト

-rフラグの+1を含む)

:
s/^6(.*)9$/\1/
s/^9(.*)6$/\1/
s/^([081])(.*)\1$/\2/
t
s/^[081]$//
s/.+/0/
s/^$/1/

行が開始文字の回転で終了する場合、両端を1つずつ切り取ります。一致するものがなくなるまで繰り返します。単一の対称文字を考慮し、何かが残っている場合、入力は対称ではなく、falseを返します。それ以外の場合はtrueを返します。


1

C、82バイト

char*s="0100009086";f(x){int y=0,z=x;for(;x;x/=10)y=y*10+s[x%10]-'0';return z==y;}

拡大

char *s = "0100009086";
int f(int x)
{
    int y=0, z=x;
    for(; x; x/=10)
        y = y*10 + s[x%10]-'0';
    return z==y;
}

説明

xモジュロ10演算を使用して数字を反転し、6と9をその反射に置き換えます。回転非対称の数字をゼロに置き換えます(単純に置換テーブルを変更することで、対称の5または2を処理できることに注意してくださいs)。新しい数値が元の数値(「z」で保存)と等しい場合、回転対称です。

テストプログラム

#include <stdio.h>
int main()
{
    int i;
    for(i=0;  i <= 16091; ++i)
        if (f(i))
            printf("%d\n", i);
}

これは質問で与えられた対称数のリストを印刷します。


0

MATL、25 21 22バイト

j69801VmAGtP69VtPXE=vA

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

説明

j       % Explicitly grab input as string
69801   % Number literal
V       % Convert to a string
mA      % Check if all input chars are members of this list
G       % Explicitly grab the input
tP      % Duplicate and flip it
69      % Number literal
V       % Convert to string ('69')
tP      % Duplicate and flip it ('96')
XE      % Replace all '6' with '9', and '9' with '6'
=       % Check that this substituted string is equal to the original
v       % Vertically concatenate all items on the stack
A       % Ensure everything is true
        % Implicitly print boolean result


0

Kotlin、69バイト

これは数値を取得し、それを文字列に変換し、回転させてから、元の文字列と等しいかどうか比較します。回転不可能な数字は、単にに変換されます0

{i->"$i".map{"0100009086"[it-'0']}.joinToString("").reversed()=="$i"}

ここでテストしてください!

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