결코 홀수 또는 짝수


15

이것이 회문이라는 것을 알았습니까?


음수가 아닌 정수 또는 숫자를 나타내는 문자열을 입력 하십시오.

출력
수의 두 가지 속성을 나타내는 4 개 개의 가능한 출력 :

  • 회문인가요?
  • 까다로운 # 2

까다로운 # 2 속성
숫자가 회문이 아닌 경우이 속성은 "첫 번째 숫자 와 마지막 숫자가 같은 패리티를 갖습니까?"라는 질문에 대답합니다.
숫자가 회 문인 경우이 속성은 "첫 번째 숫자 와 중간 숫자가 같은 패리티를 갖습니까?" 라는 질문에 대답합니다 . 짝수 길이의 경우 가운데 숫자는 가운데 두 자리 중 하나입니다.

12345678-> False False
회문이 아니며 첫 번째와 마지막 숫자가 다른 패리티를 갖습니다.

12345679-> False True
회문이 아니며 첫 번째와 마지막 숫자가 동일한 패리티를 갖습니다.

12344321-> True False
그것은 회문이며 첫 번째 숫자 1과 가운데 숫자 4는 다른 패리티를 갖습니다.

123454321-> True True
이것은 회문이며 첫 번째 숫자 1과 가운데 숫자 5는 동일한 패리티를 갖습니다.

PS
출력 유형과 형식을 결정해야합니다. 4 개의 고유 한 값이 될 수 있습니다. 답에 언급하십시오.


"이 숫자의 절반"이 무엇을 의미하는지는 확실하지 않습니다. 나는 그것이 n / 2를 의미한다고 생각했지만, 설명은 그것이 첫 번째 또는 마지막 절반이라는 것을 의미합니다.
xnor

@ xnor 그것은 현명한
죽은 Possum

규칙을 설명하는 더 간단한 방법이라고 생각하는 것을 편집했습니다.
xnor

@ xnor는 좋은 것 같습니다, 감사합니다!
Dead Possum

음이 아닌 정수 입력을 가정 할 수 있습니까?
Titus

답변:


6

05AB1E, 15 , 14 13 바이트 (라일리 및 카루소 컴퓨팅에 감사)

ÐRQi2ä¨}ȹRÈQ

온라인으로 시도

회 문인 경우 대괄호와 함께 반환

패리티가 다르면 0으로, 동일하면 1로 리턴

Ð 입력 할 수 있도록 입력을 추가하십시오.

R 스택의 마지막 요소를 뒤집습니다

Q 동일한 지 확인하십시오 (두 개의 최상위 요소를 취하고 == 수행).

i if 문은 회문 인 경우에만 통과합니다.

2 숫자 2를 누릅니다

ä 입력을 2 개의 동일한 슬라이스로 분할

¨ 스플릿의 첫 번째 요소를 밉니다 (1264621 결과 1264).

} 경우 종료

È 마지막 요소가 짝수인지 확인하십시오.

¹ 첫 번째 입력을 다시 누릅니다

R 그 입력을 반대로

È 지금도 확인

Q 그 결과조차 동일하고 내재적으로 인쇄되는지 확인하십시오.


2
코드에 대해 설명해 주시겠습니까?
Dead Possum

정말 빨리
P. Knops

1
¨대신에 사용할 수 있습니다 .
Riley

끝나는 ,암시 적 출력이 필요하지 않습니다 . 또한 대신 bifurcate를 사용할 수 있습니다. Â; 12에 대한 2 바이트 절약 :ÐRQi¨}ȹRÈQ
Magic Octopus Urn

나는 분기 부분을 테스트했는데 특정 시나리오에서는 이상하게 작동하지만 ,리드를 이끌어야합니다.).
Magic Octopus Urn

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태그를 허용하지 않습니다.
Titus

알았어, 고마워
roberto06

@ roberto06 Wait ... $argn도 사용할 수 있습니다 -F. 그러나 nm.
Titus

7

젤리 , 16 14 바이트

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

온라인으로 사용해보십시오!

두 줄을 출력합니다 :

  • 1회문을 0위해
  • 0대한 까다로운 # 2 , 1하지 않는

설명

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 나는 아직 대부분의 문자를 기억하지 못한다. 그로 인해 미국 국제 키보드 레이아웃을 배우지 않아도되었으므로 위키 에서 문자를 복사하기 만하면 됩니다. 개발은 TIO의 시행 착오에 의해 발생합니다.
PurkkaKoodari


5

PowerShell , 114 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 바이트가 절약되었습니다.

문자열로 입력합니다. 유형의 어레이 출력 (0|1) (True|False)와, 0"회문 없습니다"와 의미 1를 나타내는 "팔린 드롬"및 True패리티가 일치를 나타내는와 False달리.

이것은 의사 삼항을 사용하고 적절한 장소에 색인을 생성하여 수행됩니다 (a,b)[index]. 색인 ($n-eq-join$n[$n.length..0])은 입력이 회문인지 확인합니다. 그렇지 않은 경우에는 취할 aA는 부분, 0첫 번째 자리의 패리티 여부 결합 $n[0]이고 -eq마지막 숫자의 패리티를 연간 $n[-1]. 그렇지 않으면, 우리는 (첫 번째 숫자 의 패리티)가 중간 숫자 의 패리티 와 일치하는지 여부와 결합 된 b부분에 있습니다.1$z-eq$n[$n.length/2]

이전 "$($n[0])"에는 첫 번째 숫자를 정수로 올바르게 캐스트해야했습니다. $n[0]결과는 a char및 modulo 연산자 가 리터럴 값이 아닌 ASCII 값을 기반으로 %합병 char하는 반면 a string는 리터럴 값을 나타냅니다. 그러나 @Sinusoid를 사용 0,1,2,...,9하면 리터럴 값이 모두와 동일한 패리티를 가지 48,49,50,...,57므로 ASCII 값을 사용하면 여전히 동일한 결과를 얻을 수 있습니다.

해당 배열은 파이프 라인에 남아 있으며 출력은 암시 적입니다.


호기심으로 인해 왜 $계수 %2를 숫자로 할 때 큰 따옴표와 여분의 따옴표를 사용해야 했 습니까? 나는 이것을 직접 시도했지만 각 단계를 개별적으로 수행하면 필요하지 않지만 배열 안에 넣을 때입니까? Powershell이 ​​다른 변수 유형으로 취급합니까?
사인파

@Sinusoid 그것은 문자열로 입력을 받고 있습니다. $n[0] 색인을 만들char . 로부터 주조 charint의해 강제 %로하지 않는 사업자 '1'1하지만,에 아스키 값, 그래서이다 49. 은 "$( )"제대로가 변환하는 대신 문자열로 명시 적 캐스트를 수행합니다 1. ... 이제 언급했지만 패리티0..9ASCII와 동일 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. 또한 Tricky # 2를 뒤집 으면 If/Thenwith r=r+2-2*(left(s,1)-b &1)또는 더 나은 If s = StrReverse(s) then r=2r=r+1-(left(s,1)-b &1)... 및 2 바이트를 제거 할 수 있습니다 r=r+(left(s,1)-b &1). 직접 인쇄하면 더 많은 비용을 절약 할 수 있습니다 Debug.Print r+(left(s,1)-b &1).. 그러면 95 바이트 여야합니다. &1작동하지 않으면 98 입니다.
Titus

@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-> 회 문의 경우 0/2, Tricky # 2의 경우 1/0
Titus

아, 그리고 당신은 교체 할 수 있어야한다 Mid()Left(s,Len(s)/2+1)정도.
Titus

1
@Titus VBA가 바보이기 때문에 항상 0.5에서 반올림하지는 않습니다. 그것은 사용 라운드에 심지어 논리. 문자열의 길이가 9자인 경우 Len(s)/2= 4.5VBA는로 반올림합니다 4. 길이가 7 자이면 Len(s)/2= 3.5VBA 반올림합니다.4 . 추가 0.1하면 미치광이가 수정됩니다.
엔지니어 토스트

3

펄 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

자바 (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;}

출력 : 1거짓 거짓; 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

하스켈 , 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, 2False True 및 3False False를 반환 합니다 .

이 함수 #는 두 자리 문자를 ASCII 문자 코드로 변환하고 합칩니다. 둘 다 짝수이거나 둘 다 홀수이면 합은 짝수이고, 그렇지 않으면 하나가 짝수이고 다른 홀수이면 합은 홀수입니다. 모듈이 계산, #반환 0동일한 패리티와 1달리. f입력 문자열 x이 회문 인지 확인합니다 . #호출 되지 않은 경우 호출 x되고 마지막 문자 x및 2가 결과에 추가되고 그렇지 않은 경우 대신 중간 문자를 사용 하여 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, 104100 바이트

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 0, 0 1, 1 0또는 1 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

그루비, 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.