Không bao giờ lẻ hoặc thậm chí


15

Bạn có để ý, rằng đây là một palindrom?

Nhập
số nguyên hoặc chuỗi không âm biểu thị nó

Đầu ra
4 đầu ra có thể, đại diện cho hai thuộc tính của số:

  • nó có nhạt không
  • khó khăn # 2

Thuộc tính Tricky # 2
Nếu số không phải là palindrom, thuộc tính này trả lời câu hỏi "Các chữ số đầu tiên và chữ số cuối có cùng một chẵn lẻ không?"
Nếu số là palindrom, thuộc tính này trả lời câu hỏi "Chữ số đầu tiên và chữ số giữa có cùng tính chẵn lẻ không?". Đối với độ dài chẵn, chữ số giữa là một trong hai chữ số trung tâm.

Ví dụ

12345678 -> Sai Sai
Không phải là màu nhạt, chữ số đầu tiên và chữ số cuối có tính chẵn lẻ khác nhau

12345679 -> Sai Đúng
Không phải là màu nhạt , các chữ số đầu tiên và cuối cùng có cùng tính chẵn lẻ

12344321 -> Đúng Sai
Đó là palindrom, chữ số đầu tiên 1 và chữ số giữa 4 có tính chẵn lẻ khác nhau

123454321 -> Đúng Đúng
Đó là palindrom, chữ số đầu tiên 1 và chữ số giữa 5 có cùng tính chẵn lẻ

PS
Bạn quyết định loại và định dạng đầu ra. Nó có thể là bất kỳ 4 giá trị riêng biệt. Chỉ cần đề cập đến nó trong câu trả lời của bạn.


Không rõ "một nửa số này" nghĩa là gì. Tôi nghĩ rằng nó có nghĩa là 2, nhưng sự làm rõ dường như ngụ ý nó là nửa đầu hoặc nửa cuối theo chuỗi.
xnor

@xnor Chuỗi của nó
Dead Possum

Tôi đã chỉnh sửa theo những gì tôi nghĩ là một cách đơn giản hơn để nêu quy tắc.
xnor

@xnor Có vẻ tốt, cảm ơn bạn!
Xác chết

Chúng ta có thể giả sử đầu vào số nguyên không âm?
Tít

Câu trả lời:


6

05AB1E, 15 , 14 13 byte (Nhờ Riley và carusocomputing)

ÐRQi2ä¨}ȹRÈQ

Thử trực tuyến

Trả về với dấu ngoặc nếu nó là một bảng màu

Trả về 0 nếu chẵn lẻ khác nhau, 1 nếu nó giống nhau

Ð Thêm đầu vào, để tôi có đủ đầu vào để làm việc với

R Đảo ngược phần tử cuối cùng của ngăn xếp

Q Hãy xem nếu nó giống nhau (lấy hai yếu tố hàng đầu và thực hiện ==)

i Nếu câu lệnh, vì vậy chỉ đi qua khi nó là một bảng màu

2 Đẩy số 2

ä Chia đầu vào thành 2 lát bằng nhau

¨ Đẩy phần tử đầu tiên của phần tách (1264621 kết quả vào năm 1264)

} Kết thúc nếu

È Kiểm tra xem phần tử cuối có chẵn không

¹ Nhấn đầu vào lần nữa

R Đảo ngược đầu vào đó

È Kiểm tra nếu nó thậm chí bây giờ

Q Kiểm tra xem những kết quả thậm chí có giống nhau không và in ngầm


2
Bạn sẽ đặt một số giải thích về mã của bạn?
Xác chết

Sẽ thực sự sớm thôi
P. Knops

1
Bạn có thể sử dụng ¨thay vì .
Riley

Bạn không cần kết thúc ,, đầu ra ngầm. Ngoài ra thay vì bạn có thể sử dụng bifurcate : Â; tiết kiệm 2 byte cho 12:ÐRQi¨}ȹRÈQ
Bạch tuộc ma thuật Urn

Tôi sẽ kiểm tra phần hai phần, nó hoạt động kỳ lạ trong một số tình huống nhất định, nhưng điều đó ,sẽ đẩy bạn vào vị trí dẫn đầu;).
Bạch tuộc ma thuật Urn

8

PHP, 55 52 byte

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

lấy đầu vào từ STDIN; chạy với -R.

đầu ra:

  • 10 cho palindrom và tương đương
  • 11 cho palindrom và chẵn lẻ khác nhau
  • 0 cho không phải palindrom và tương đương
  • 1 cho không tương đương và khác nhau

ghi chú:

  • strlen($n)/2== log($n,10)/2==log($n,100)
  • nếu palindrom, so sánh chữ số giữa $n[1*log($n,100)]
  • nếu không, chữ số đầu tiên $n[0*log($n,100)]
  • ... Đến toàn bộ số (<- bit thấp nhất <- chữ số cuối)

Bạn có thể lưu một byte bằng cách sử dụng <?=thay vì echo sandbox.onlinephpfifts.com/code/ Kẻ
roberto06

@ roberto06 $argnchỉ được xác định với -R, và điều đó không cho phép các thẻ.
Tít

OK, không biết điều đó, cảm ơn.
roberto06

@ roberto06 Chờ ... $argncũng có sẵn với -F. Nhưng bước sóng.
Tít

7

Thạch , 16 14 byte

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

Hãy thử trực tuyến!

Đầu ra hai dòng:

  • 1 cho palindrom, 0 không
  • 0cho mánh khóe số 2 , 1không

Giải trình

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

Tôi luôn tự hỏi, bạn phải học bao nhiêu nhân vật khác nhau để có thể viết chương trình với điều này? Bạn có biết tất cả các ý nghĩa và tất cả các nhân vật? Bạn thậm chí có thể nhập các ký tự mà không cần sử dụng phím ALT hoặc bảng ký tự không? Một IDE cho cái này trông như thế nào?
Daniel W.

3
@DanFromGermany Tôi chưa nhớ hầu hết các nhân vật. Do đó, tôi cũng không được học cách bố trí bàn phím Quốc tế Hoa Kỳ, vì vậy tôi chỉ sao chép các ký tự từ wiki . Sự phát triển xảy ra do thử và sai trong TIO.
PurkkaKoodari


5

PowerShell , 114 99 byte

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

Hãy thử trực tuyến!

Đã lưu 15 byte nhờ @Sinusoid.

Đầu vào dưới dạng một chuỗi. Xuất ra một mảng các loại (0|1) (True|False), với 0dấu hiệu "không phải là một bảng màu" và 1chỉ thị "bảng màu" và Truebiểu thị tương đương khớp vàFalse .

Điều này được thực hiện bằng cách sử dụng một giả ba chiều và lập chỉ mục vào nơi thích hợp (a,b)[index]. Chỉ số ($n-eq-join$n[$n.length..0])kiểm tra xem đầu vào là một palindrom. Nếu không, chúng ta sẽ lấy aphần này, 0kết hợp với việc tính chẵn lẻ của chữ số đầu tiên $n[0]-eqphải là ngang bằng với chữ số cuối cùng hay không $n[-1]. Mặt khác, chúng ta nằm trong bphần, được 1kết hợp với việc liệu $z(tính chẵn lẻ của chữ số đầu tiên) có -eqtương đương với tính chẵn lẻ của chữ số giữa hay không $n[$n.length/2].

Trước đây, tôi phải "$($n[0])"lấy chữ số đầu tiên để đúc chính xác như một số nguyên, vì $n[0]kết quả là chartoán tử modulo và toán tử %kết hợp chars dựa trên giá trị ASCII, không phải giá trị bằng chữ, trong khi đó stringgiá trị bằng chữ. Tuy nhiên, @Sinusoid đã giúp tôi thấy điều đó0,1,2,...,9 tất cả các giá trị theo nghĩa đen đều có cùng tính chẵn lẻ48,49,50,...,57 , vì vậy nếu nó sử dụng giá trị ASCII, chúng tôi vẫn nhận được kết quả tương tự.

Mảng đó được để lại trên đường ống và đầu ra là ẩn.


Vì tò mò, tại sao bạn phải sử dụng dấu ngoặc kép và thêm $khi bạn thực hiện mô đun %2cho một số? Tôi đã thử điều này bản thân mình và nó không cần thiết nếu tôi thực hiện từng bước, nhưng đó là khi bạn đặt nó trong một mảng? Liệu powershell coi nó như một loại biến khác nhau?
Sinusoid

@Sinusoid Nó lấy đầu vào là một chuỗi, vì vậy khi $n[0]lập chỉ mục, nó xuất hiện dưới dạng một char. Dàn diễn viên từ charđể intbuộc bởi các %nhà khai thác không đi từ '1'đến 1, nhưng đến ASCII giá trị, vì vậy nó 49. Các "$( )"làm một diễn viên rõ ràng để chuỗi thay vào đó, mà đúng chuyển đổi nó để 1. ... Mặc dù, bây giờ mà bạn đề cập đến nó, chẵn lẻ của 0..9cũng giống như ASCII 48..57, vì vậy tôi có lẽ có thể chơi golf mà xuống. Cảm ơn!
admBorkBork

@ Lưu trữ 15 byte, cảm ơn!
admBorkBork

3

VBA, 117 99 byte

Đã lưu 18 byte nhờ 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

Nó không mở rộng nhiều khi được định dạng:

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

Dưới đây là kết quả trường hợp thử nghiệm đã cho:

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 có toán tử bitwise không? Hãy thử &1thay vì mod 2. Bạn cũng có thể thoát khỏi sự If/Thenvới r=r+2-2*(left(s,1)-b &1)hoặc thậm chí tốt hơn If s = StrReverse(s) then r=2r=r+1-(left(s,1)-b &1)... và 2 byte đầu với đảo ngược Tricky # 2: r=r+(left(s,1)-b &1); tiết kiệm hơn với in trực tiếp : Debug.Print r+(left(s,1)-b &1). Nên 95 byte rồi; 98 nếu &1không hoạt động.
Tít

@Titus Cảm ơn! Tôi thực sự không quen thuộc với các hoạt động bitwise. VBA không có hoạt động bitwise nhưng họ sử dụng Andthay vì chỉ &. Tôi đã tìm ra cách thực hiện đề xuất đầu tiên của bạn nhưng tôi không thể hiểu ý bạn muốn thay đổi dòng thứ 3 bằng cách nào StrReverse.
Kỹ sư 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 cho palindromes, 1/0 cho Tricky # 2
Tít

Oh và bạn sẽ có thể thay thế Mid()bằng Left(s,Len(s)/2+1)hoặc như vậy.
Tít

1
@Titus Vì VBA là ngu ngốc và không phải lúc nào cũng làm tròn từ 0,5. Nó sử dụng logic tròn đến chẵn . Nếu chuỗi dài 9 ký tự, thì Len(s)/2= 4.5VBA nào sẽ làm tròn thành 4. Nếu nó dài 7 ký tự, thì Len(s)/2= 3.5VBA nào cũng sẽ làm tròn 4. Thêm 0.1sửa chữa sự mất trí.
Kỹ sư Toast

3

Perl 6 , 48 byte

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

Thử nó

kết quả trong (True True) (True False) (False True)hoặc(False False)

Mở rộng:

{                  # 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 byte

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

Đầu ra: 1cho false-false; 2cho sai-đúng; 3cho đúng-sai;4cho đúng-đúng.

Giải trình:

Hãy thử nó ở đây.

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 byte

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

Hãy thử trực tuyến! Cách sử dụng : f "12345". Trả về 0cho True True, 1cho True false,2 cho false True và 3sai false.

Hàm này #chuyển đổi cả hai ký tự chữ số thành mã ký tự ascii của chúng và tính tổng chúng. Nếu cả hai đều chẵn hoặc cả hai đều là số lẻ thì tổng sẽ là số chẵn, nếu không thì số chẵn và số lẻ khác thì tổng sẽ là số lẻ. Tính modulo hai, #trả về 0cho tương đương bằng nhau và 1nếu không. fkiểm tra nếu chuỗi đầu vào xlà một palindrom. Nếu không thì #được gọi với xvà ký tự cuối cùng của xvà hai được thêm vào kết quả, nếu không, nếu đó xlà cuộc gọi palindromic #với ký tự giữa xthay vào đó và để lại kết quả như hiện tại.


1

Kotlin , 142 byte

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

Hãy thử trực tuyến!

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 byte

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

Trả cặp giá trị logic 0 0, 0 1, 1 0hoặc 1 1.


1

R, 115 109 105 byte

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)

Lấy đầu vào từ stdin. Trả về FALSE FALSEsai Sai, FALSE TRUEsai sai, TRUE FALSEđúng sai và TRUE TRUEđúng đúng.


1

AWK, 97 96 byte

{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

Cách sử dụng đơn giản nhất là đặt mã vào tệp: OddEvensau đó làm:

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

Đầu ra về cơ bản là tổng bit của các phép so sánh trong Câu hỏi, vd

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

Tôi đã cố gắng loại bỏ ()từ (s?0:2)nhưng điều này làm rối tung ưu tiên nhà điều hành bằng cách nào đó.


Đã lưu một byte bằng cách di chuyển số gia trên j. Điều này có nghĩa là for () có thể được thay thế bằng while (), nhưng không có byte nào được lưu khi làm như vậy :(
Robert Benson

1

CJam, 32 byte

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

Đầu vào là một số trên đầu ngăn xếp.

Giải trình:

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 303 byte

Mã số:

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)

Mã gốc (có Giải thích):

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)

Mã gốc (không có Giải thích):

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)

Đầu vào:

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

Đầu ra:

"PS" - Palindrome with Same Parity
"PN" - Palindrome with Diff Parity
"NS" - Non-palindrome with Same Parity
"NN" - Non-palindrome with Diff Parity
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.