从不奇数或偶数


15

您是否注意到这是回文?

输入
非负整数或表示它的字符串

输出
4个可能的输出,代表数字的两个属性:

  • 回文是否
  • 棘手的#2

棘手的2号属性
如果数字不是回文,则此属性回答以下问题:“第一位和最后一位是否具有相同的奇偶性?”
如果数字是回文,则此属性回答问题“第一和中间数字是否具有相同的奇偶性?”。对于偶数长度,中间数字是中心两位数字之一。

例子

12345678-> False False
这不是回文,第一位和最后一位具有不同的奇偶校验

12345679->假
是不是回文,第一位和最后一位具有相同的奇偶性

12344321->
是错是回文,第一个数字1和中间的数字4具有不同的奇偶校验

123454321-> True True
这是回文,第一个数字1和中间的数字5具有相同的奇偶校验

PS:
您可以决定输出类型和格式。它可以是任意4个不同的值。只需在您的答案中提及即可。


目前尚不清楚“这个数字的一​​半”是什么意思。我以为它的意思是n / 2,但澄清似乎暗示它是弦乐的前一半或后一半。
xnor

@xnor沿线排列
Dead Possum

我以我认为是陈述规则的更简单方法进行了编辑。
xnor

@xnor似乎很好,谢谢!
Dead Possum

我们可以假设非负整数输入吗?
泰特斯(Titus),

Answers:


6

05AB1E,1514 13个字节(感谢莱利和carusocomputing)

ÐRQi2ä¨}ȹRÈQ

在线尝试

如果是回文,则带括号返回

如果奇偶校验不同,则返回0;如果相同,则返回1

Ð 添加输入,以便我有足够的输入来使用

R 反转堆栈的最后一个元素

Q 查看是否相同(采用两个顶级元素并执行==)

i 如果声明,那么只有在回文时才会通过

2 按数字2

ä 将输入分成2个相等的片

¨ 推动拆分的第一个元素(1264621,结果为1264)

} 万一

È 检查最后一个元素是否为偶数

¹ 再次按第一个输入

R 反转输入

È 检查是否现在

Q 检查那些偶数结果是否相同并隐式打印


2
请问您对代码的解释吗?
死负鼠宝

会做真的很快
P. Knops

1
您可以使用¨代替
莱利

您不需要end结尾的,隐式输出。此外,而不是您可以使用分叉:Â; 节省2个字节以保留12个字节:ÐRQi¨}ȹRÈQ
魔术八达通缸

我会测试分叉部分,在某些情况下它的表现很怪异,但这,应该将您带入领先;)。
魔术章鱼缸

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)]
  • ...至整数(<-最低位<-最后一位)

您可以使用<?=而不是echo sandbox.onlinephpfunctions.com/code/…
roberto06

@ roberto06 $argn仅使用定义-R,并且不允许使用标签。
泰特斯

好,不知道,谢谢。
roberto06

@ roberto06 Wait ... $argn也可用于-F。但是nm。
泰特斯

7

果冻16 14字节

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

在线尝试!

输出两行:

  • 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的外观如何?
Daniel W.

3
@DanFromGermany我不记得大多数字符了。因此,我也不必学习美国国际键盘布局,因此我只复制了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指示为“ not palindrome”,1指示为“ palindrome”,并且True奇偶校验匹配,False否则为false。

这是通过使用伪三元数并索引到适当的位置来完成的(a,b)[index]。索引($n-eq-join$n[$n.length..0])检查输入是否为回文。如果不是,我们取a部,其由0与所述第一手指的奇偶性是否$n[0]-eqUAL的最后一位的奇偶校验$n[-1]。否则,我们在b部分,其一个1加上是否$z(第一个数字的奇偶性)是-eqUAL到中间位的奇偶性$n[$n.length/2]

以前,我必须"$($n[0])"将第一个数字正确地转换为整数,因为这会$n[0]导致a char和模运算符基于ASCII值而不是文字值%合并chars,而a string则是文字值。但是,@ Sinusoid帮助我看到了0,1,2,...,9因为所有文字值都具有与相同的奇偶校验48,49,50,...,57,所以如果它使用ASCII值,我们仍然会得到相同的结果。

该数组留在管道上,并且输出是隐式的。


出于好奇,为什么在对数字求$模时必须使用双引号和额外的引号%2?我自己尝试过此步骤,没有必要单独执行每个步骤,但是是何时将其放入数组中?powershell会将其视为其他变量类型吗?
Sinusoid

@Sinusoid将输入作为字符串,因此当$n[0]索引时,它以a形式出现char。从演员charint通过强制%经营者不从去'1'1,但到ASCII值,所以它的49。在"$( )"不显式类型转换成字符串来代替,该正确转换它1。......虽然,现在你提到它的奇偶校验0..9是一样的ASCII 48..57,这样我就可以大概高尔夫球下来。谢谢!
AdmBorkBork

@Sinusoid已保存15个字节,谢谢!
AdmBorkBork

3

VBA,117 99字节

多亏了Titus节省了18个字节

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

格式化后它不会扩展太多:

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

这是给定的测试用例结果:

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

VBA是否有按位运算符?尝试&1代替mod 2。您还可以摆脱If/Thenr=r+2-2*(left(s,1)-b &1)甚至更好If s = StrReverse(s) then r=2r=r+1-(left(s,1)-b &1)......和2逆转整蛊#2字节off:r=r+(left(s,1)-b &1); 直接打印可节省更多:Debug.Print r+(left(s,1)-b &1)。那么应该是95个字节;98如果&1不起作用。
泰特斯

@Titus谢谢!实际上,我一点都不熟悉按位运算。VBA确实有按位运算,但它们使用And而不是&。我想出了如何实施您的第一个建议,但我想不出您打算如何用来更改第三行StrReverse
Engineer Toast

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-> 0/2(用于回文),1/0(用于Tricky#2)
Titus

哦,您应该可以Mid()Left(s,Len(s)/2+1)左右替换。
泰特斯

1
@Titus因为VBA是愚蠢的,并不总是从0.5向上取整。它使用舍入到偶数逻辑。如果字符串的长度为9个字符,则Len(s)/2= 4.5将哪个VBA舍入为4。如果长度为7个字符,则Len(s)/2= 3.5哪个VBA 将舍入到4。添加0.1可纠正这种疯狂。
工程师吐司

3

Perl 6,48个字节

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

尝试一下

导致(True True) (True False) (False True)(False False)

展开:

{                  # 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字节

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;}

输出:1for false-false; 2为假-真; 3为真-假;4为真。

说明:

在这里尝试。

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个字节

(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)

在线尝试!用法:f "12345"。返回0True True,1True False,2 False True和3False False。

该函数#将两个数字字符都转换为它们的ascii字符代码,并对它们求和。如果两个都是偶数或两个都是奇数,则总和将是偶数,否则,如果一个是偶数而另一个是奇数,则总和将是奇数。计算模二,#返回0相等的奇偶校验,1否则返回。f检查输入的字符串x是否是回文。如果不是,则#x和调用,并将和的最后一个字符x添加到结果中,否则,如果x是回文调用#,则将其x替换为中间字符并将结果保持原样。


1

科特林,142字节

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()}")

在线尝试!

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字节

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

返回逻辑值对0 00 11 01 1


1

R,115个 109 105字节

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)

接受来自stdin的输入。返回FALSE FALSEFalse False,FALSE TRUEFalse True,TRUE FALSETrue False和TRUE TRUETrue True。


1

AWK,97 96字节

{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

最简单的用法是将代码放入文件中:OddEven然后执行:

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

输出本质上是课题中比较的位和,例如

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

我尝试()从中删除,(s?0:2)但是这以某种方式弄乱了运算符的优先级。


通过在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,326岁字节

缩小代码:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.