奇数または偶数


15

これは回文であることに気づきましたか?

入力
非負整数またはそれを表す文字列

出力
数の2つのプロパティを表す4つの可能な出力:

  • それは回文ですか
  • トリッキーな#2

Tricky#2 property
数値が回文ではない場合、このプロパティは「最初と最後の数字は同じパリティを持っていますか?」という質問に答えます。
数字が回文の場合、このプロパティは「最初の数字と中央の数字は同じパリティを持っていますか?」という質問に答えます。偶数の場合、中央の数字は中央の2桁の数字の1つです。

12345678-> False False
これは回文ではありません。最初と最後の数字はパリティが異なります

12345679-> False True
パリンドロームではなく、最初と最後の桁が同じパリティを持っています

12344321-> True False
これは回文です。最初の数字1と中央の数字4のパリティは異なります

123454321-> True True
これは回文です。最初の数字1と中央の数字5は同じパリティを持っています

PS
出力のタイプとフォーマットを決定します。4つの異なる値を指定できます。答えにそれを記載してください。


「この数の半分」が何を意味するのかは明確ではありません。私はそれがn / 2を意味すると思ったが、明確化はそれが文字列の前半または後半であることを暗示しているようだ。
XNOR

@xnor文字列単位
デッドポッサム

ルールを記述するより簡単な方法だと思うものを編集しました。
XNOR

@xnorよろしくお願いします!
デッドポッサム

非負の整数入力を想定できますか?
タイタス

回答:


6

05AB1E、1514、13バイト(ライリーとcarusocomputingのおかげで)

ÐRQi2ä¨}ȹRÈQ

オンラインで試す

回文である場合は括弧付きで返します

パリティが異なる場合は0を返し、同じ場合は1を返します

Ð 入力を追加して、作業するのに十分な入力があるようにします

R スタックの最後の要素を逆にします

Q 同じかどうかを確認します(2つの上位要素を取り、==を実行します)

i if文、それは回文である場合にのみ通過する

2 数字2を押す

ä 入力を2つの等しいスライスに分割します

¨ 分割の最初の要素をプッシュします(1264621は1264になります)

} 終了する場合

È 最後の要素が偶数かどうかを確認します

¹ 最初の入力をもう一度押します

R その入力を逆にする

È 今でも確認してください

Q それらの偶数の結果が同じであり、暗黙的に印刷されるかどうかを確認します


2
コードの説明をしますか?
デッドポッサム

本当にすぐに行います
P. Knops

1
¨代わりに使用できます
ライリー

終了,する暗黙的な出力は必要ありません。また、代わりにbifurcateを使用できますÂ。12で2バイトの節約:ÐRQi¨}ȹRÈQ
マジックタコUr

私は分岐部分をテストし,ますが、特定のシナリオでは奇妙に動作しますが、それはあなたをリードに押し込むはずです;)。
魔法のタコUr

8

PHP、55 52バイト

echo$p=strrev($n=$argn)==$n,$n-$n[$p*log($n,100)]&1;

STDINから入力を受け取ります。で実行し-Rます。

出力:

  • 10 回文と同じパリティ
  • 11 回文と異なるパリティ
  • 0 非回文および同じパリティの場合
  • 1 非回文および異なるパリティの場合

ノート:

  • strlen($n)/2== log($n,10)/2==log($n,100)
  • 回文の場合、中桁を比較 $n[1*log($n,100)]
  • そうでない場合、最初の桁 $n[0*log($n,100)]
  • ...整数に(<-最下位ビット<-最後の桁)

sandbox.onlinephpfunctions.com/code/…の<?=代わりに使用することで1バイトを節約できますecho
roberto06

@ roberto06はで$argnのみ定義され-R、タグは許可されません。
タイタス

わかりませんでした、ありがとう。
roberto06

@ roberto06 Wait ... $argnもで利用できます-F。しかし、nm。
タイタス

7

ゼリー16 14バイト

DµŒḂṄHC×LĊị+ḢḂ

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

2行を出力します。

  • 1回文で0はなく
  • 0以下のためのトリッキー#21ではないため

説明

DµŒḂṄHC×LĊị+ḢḂ    Main link. Argument: n (number)
D                 Get the digits of n
 µ                Start a new monadic chain
  ŒḂ              Check if the digit array is a palindrome (1 if yes, 0 if no)
    Ṅ             Print the result with a newline
     H            Halve (0.5 if palindrome, 0 if not)
      C           Subtract from 1 (0.5 if palindrome, 1 if not)
       ×          Multiply by...
        L         ...length of array (length/2 if palindrome, length if not)
         Ċ        Round up
          ị       Take item at that index from the digits
           +      Add...
            Ḣ     ...first item of digits
             Ḃ    Result modulo 2

私はいつも、これでプログラムを書くことができるようになるには何人のキャラクターを学ばなければならないのかと自問しています。すべての意味とすべてのキャラクターを知っていますか?Altキーまたは文字テーブルを使用せずに文字を入力することもできますか?このIDEはどのように見えますか?
ダニエルW.

3
@DanFromGermanyほとんどのキャラクターはまだ覚えていません。そのため、US Internationalのキーボードレイアウトを学ぶ必要もありません。そのため、Wikiから文字をコピーするだけです。開発はTIOで試行錯誤によって行われます。
-PurkkaKoodari


5

PowerShell114 99バイト

param($n)((0,(($z=$n[0]%2)-eq$n[-1]%2)),(1,($z-eq$n[$n.length/2]%2)))[($n-eq-join$n[$n.length..0])]

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

@Sinusoidのおかげで15バイト節約されました。

文字列として入力します。typeの配列を出力(0|1) (True|False)0ます。これは、「回文ではない」と1「回文」をTrue示し、パリティが一致することを示し、Falseそれ以外の場合。

これは、疑似3進数を使用して適切な場所にインデックスを付けることで行われ(a,b)[index]ます。インデックス($n-eq-join$n[$n.length..0])は、入力が回文であるかどうかをチェックします。そうでない場合は、私たちが取るaされている部分、0最初の数字のパリティがいるかどうかに結合し$n[0]ている-eq最後の桁のパリティにUALを$n[-1]。それ以外の場合は、そのb部分にあります。これは、(最初の桁のパリティ)が中央の桁のパリティに一致1するかどうかと連動しています。$z-eq$n[$n.length/2]

Previously, I had "$($n[0])" to get the first digit to cast correctly as an integer, since $n[0] results in a char and the modulo operator % coalesces chars based on the ASCII value, not the literal value, whereas a string does the literal value. However, @Sinusoid helped me to see that 0,1,2,...,9 as literal values all have the same parity as 48,49,50,...,57, so if it uses the ASCII value we still get the same result.

That array is left on the pipeline, and output is implicit.


好奇心から、なぜ数値に$モジュラス%2をかけたときに二重引用符と余分を使用する必要があったのですか?私はこれを自分で試しましたが、各ステップを個別に実行する必要はありませんでしたが、アレイ内に配置したときですか?Powershellはそれを異なる変数タイプとして扱いますか?
正弦波

@Sinusoid It's taking input as a string, so when $n[0] indexes, it comes out as a char. The cast from char to int forced by the % operator doesn't go from '1' to 1, but to the ASCII value, so it's 49. The "$( )" does an explicit cast to string instead, which properly converts it to 1. ... Although, now that you mention it, the parity of 0..9 is the same as ASCII 48..57, so I can probably golf that down. Thanks!
AdmBorkBork

@Sinusoid 15 bytes saved, thanks!
AdmBorkBork

3

VBA, 117 99 bytes

Saved 18 bytes thanks to Titus

Sub p(s)
b=s
If s=StrReverse(s)Then r=2:b=Left(s,Len(s)/2+.1)
Debug.?r+(Left(s,1)-b And 1);
End Sub

It doesn't expand much once formatted:

Sub p(s)
    b = s
    If s = StrReverse(s) Then r = 2: b = Left(s, Len(s) / 2 + 0.1)
    Debug.Print r + (Left(s, 1) - b And 1);
End Sub

Here are the given test case results:

s = 12345678     p(s) = 1 = False False
s = 12345679     p(s) = 0 = False True
s = 12344321     p(s) = 3 = True False
s = 123454321    p(s) = 2 = True True

Does VBA have bitwise operators? Try &1 instead of mod 2. You might also get rid of the If/Then with r=r+2-2*(left(s,1)-b &1) or even better If s = StrReverse(s) then r=2 and r=r+1-(left(s,1)-b &1) ... and 2 bytes off with reversing the Tricky#2: r=r+(left(s,1)-b &1); save more with printing it directly: Debug.Print r+(left(s,1)-b &1). Should be 95 bytes then; 98 if &1 does not work.
Titus

@タイタスありがとう!実際、ビット単位の操作にはまったく慣れていませんでした。VBAにはビット演算がありますが、のAnd代わりに使用します&。最初の提案を実装する方法はわかりましたが、で3行目を変更する意味を理解できませんでしたStrReverse
エンジニアトースト

Sub p(s);b=s;If s=StrReverse(s)Then r=2:b=Mid(s,Len(s)/2+.1,1);Debug.?r+(Left(s,1)-b&1);End Sub-トリッキー#2の回文ための> 0/2、1/0
タイタス

ああ、あなたが交換することができるはずMid()Left(s,Len(s)/2+1)かそこら。
タイタス

1
@Titus Because VBA is stupid and doesn't always round up from 0.5. It uses round-to-even logic. If the string is 9 characters long, then Len(s)/2 = 4.5 which VBA will round to 4. If it's 7 characters long, then Len(s)/2 = 3.5 which VBA will also round to 4. Adding 0.1 corrects the lunacy.
Engineer Toast

3

Perl 6, 48 bytes

{($/=.flip==$_),[==] .ords[0,($/??*/2!!*-1)]X%2}

Try it

results in (True True) (True False) (False True) or (False False)

Expanded:

{                  # bare block lambda with implicit parameter 「$_」

  (
    $/ =           # store in 「$/」
    .flip == $_    # is 「$_」 equal backwards and forwards
  ),


  [==]             # reduce the following using &infix:<==> (are they equal)

    .ords\         # list of ordinals (short way to make 「$_」 indexable)
    [
      0,           # the first digit's ordinal
      (
        $/         # if the first test is True (palindrome)
        ??   * / 2 # get the value in the middle
        !!   * - 1 # else get the last value
      )
    ]
    X[%] 2         # cross those two values with 2 using the modulus operator
}

3

Java 8, 205 197 182 168 134 bytes

n->{int l=n.length(),a=n.charAt(0)%2;return n.equals(new StringBuffer(n).reverse()+"")?a==n.charAt(l/2)%2?4:3:a==n.charAt(l-1)%2?2:1;}

Outputs: 1 for false-false; 2 for false-true; 3 for true-false; 4 for true-true.

Explanation:

Try it here.

n->{                     // Method with String parameter and integer return-type
  int l=n.length(),      //  The length of the input String
      a=n.charAt(0)%2,   //  Mod-2 of the first digit
  return n.equals(new StringBuffer(n).reverse()+"")?
                         //  If the String is a palindrome
    a==n.charAt(l/2)%2?  //   And if the first and middle digits are both even/odd
     4                   //    return 4
    :                    //   Else
     3                   //    Return 3
   :a==n.charAt(l-1)%2 ? //  Else-if the first and last digits are both even/odd
    2                    //   Return 2
   :                     //  Else
    1;                   //   Return 1
}                        // End of method

1

Haskell, 89 bytes

(x:r)#y=mod(sum$fromEnum<$>[x,y])2
f x|reverse x/=x=2+x#last x|y<-length x`div`2=x#(x!!y)

Try it online! Usage: f "12345". Returns 0 for True True, 1for True False, 2 for False True and 3 for False False.

The function # converts both digit characters into their ascii character codes and sums them. If both are even or both are odd the sum will be even, otherwise if one is even and the other odd the sum will be odd. Calculating modulo two, # returns 0 for equal parity and 1 otherwise. f checks if the input string x is a palindrome. If not then # is called with x and the last character of x and two is added to the result, otherwise if x is palindromic call # with the middle character of x instead and leave the result as is.


1

Kotlin, 142 bytes

fun Char.e()=toInt()%2==0;
val y=x.reversed()==x;val z=x.first();println("${y},${if(y)z.e()==x.get(x.length/2).e();else z.e()==x.last().e()}")

Try it online!

fun Char.e() = toInt() % 2 == 0; //character extension function, returns if character(as int) is even

val y = x.reversed() == x
val z = x.first()

println(
"${y} //returns whether or not input is a palindrome
, //comma separator between the values
${if(y) z.e() == x.get(x.length/2).e() // if it's a palindrome compare first and middle parity
else z.e() == x.last().e()}" //else compare first and last parity
)

1

REXX, 104 100 bytes

arg a
parse var a b 2''-1 c
e=a=reverse(a)
b=b//2
if e then f=b&centre(a,1)//2
else f=b&c//2
say e f

Returns logical value pair 0 0, 0 1, 1 0 or 1 1.


1

R, 115 109 105 bytes

w=strtoi(el(strsplit(scan(,""),"")))
c(p<-all(w==rev(w)),w[1]%%2==switch(p+1,tail(w,1),w[sum(1|w)/2])%%2)

Takes input from stdin. Returns FALSE FALSE for False False, FALSE TRUE for False True, TRUE FALSE for True False, and TRUE TRUE for True True.


1

AWK, 97 96 bytes

{n=split($0,a,"")
for(;j<n/2;)s+=a[j+1]!=a[n-j++]
x=(a[1]%2==a[s?n:int(n/2)+1]%2)+(s?0:2)
$0=x}1

Simplest usage is to place the code into file: OddEven then do:

awk -f OddEven <<< "some number here"

Output is essentially the bit-sum of the comparisons in the Question, e.g.

0, Not palindrome and first and last digits have different parity
1, Not palindrome and first and last digits have same parity 
2, Palindrome and the first digit and middle digit have different parity
3, Palindrome and the first digit and middle digit have same parity

I tried removing the () from (s?0:2) but this messes up operator precedence somehow.


jの増分を移動してバイトを保存しました。これは、for()をwhile()で置き換えることができることを意味しますが、そうすることでバイトは保存されません。(
Robert Benson

1

CJam、32バイト

q:N_W%=N0=~2%NW=~2%N_,2/=~2%3$?=

入力は、スタックの一番上の数字です。

説明:

q                                 e# Read input:          | "12345679"
 :N                               e# Store in N:          | "12345679"
   _                              e# Duplicate:           | "12345679" "12345679"
    W%                            e# Reverse:             | "12345679" "97654321"
      =                           e# Check equality:      | 0
       N                          e# Push N:              | 0 "12345679"
        0=~                       e# First digit:         | 0 1
           2%                     e# Modulo 2:            | 0 1
             N                    e# Push N:              | 0 1 "12345679"
              W=~                 e# Get last digit:      | 0 1 9
                 2%               e# Modulo 2:            | 0 1 1
                   N              e# Push N:              | 0 1 1 "12345679"
                    _             e# Duplicate:           | 0 1 1 "12345679" "12345679"
                     ,            e# Length:              | 0 1 1 "12345679" 8
                      2/          e# Divide by 2:         | 0 1 1 "12345679" 4
                        =         e# Get digit (as char): | 0 1 1 '5
                         ~        e# Eval character       | 0 1 1 5
                          2%      e# Modulo 2:            | 0 1 1 1
                            3$    e# Copy stack element:  | 0 1 1 1 0
                              ?   e# Ternary operator:    | 0 1 1
                               =  e# Check equality:      | 0 1


1

Groovy、326303バイト

縮小コード:

String str="12345678";char pal,par;pal=str==str.reverse()?'P':'N';if(pal=='P'){par=(int)str.charAt(0).toString()%2==str.charAt((int)str.length()-1-(int)((str.length()-1)/2))%2?'S':'N'}else{par = (int)str.charAt(0).toString()%2==str.charAt((int)(str.length()-1)%2)?'S':'N'};print((String)pal+(String)par)

元のコード(説明付き):

Declare str as String                        String str = "12345678"
Declare pal and par as char                  char pal, par
Check if Palindrome or not                   pal = str==str.reverse()?'P':'N'
If Palindrome...                             if (pal=='P') {
and has same parity (S) and if not (N)       par = (int)str.charAt(0).toString()%2==str.charAt((int)str.length()-1-(int)((str.length()-1)/2))%2?'S':'N'
else if not palindrome...                    } else {
and has same parity (S) and if not (N)       par = (int)str.charAt(0).toString()%2==str.charAt((int)(str.length()-1)%2)?'S':'N'
closing tag for if                           }
Print desired output                         print((String)pal+(String)par)

元のコード(説明なし):

String str = "12345678"
char pal, par
pal = str==str.reverse()?'P':'N'
if (pal=='P') {
    par = (int)str.charAt(0).toString()%2==str.charAt((int)str.length()-1-(int)((str.length()-1)/2))%2?'S':'N'
} else {
    par = (int)str.charAt(0).toString()%2==str.charAt((int)(str.length()-1)%2)?'S':'N'
}
print((String)pal+(String)par)

入力:

Just change "12345678" to another set of non-negative digits.

出力:

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