ไม่แปลกหรือแม้แต่


15

คุณสังเกตเห็นไหมว่านี่เป็นอาการปวดท้อง

ใส่
ตัวเลขหรือสตริงจำนวนเต็มแบบไม่เป็นลบ

เอาท์พุท
4 เอาต์พุตที่เป็นไปได้ซึ่งแสดงถึงคุณสมบัติสองประการของจำนวน:

  • มันคือ palindrome
  • หากิน # 2

คุณสมบัติ Tricky # 2
หากตัวเลขไม่ใช่ Palindrome คุณสมบัตินี้จะตอบคำถาม "ตัวเลขตัวแรกและตัวสุดท้ายมีความเหมือนกันหรือไม่"
หาก number เป็น palindrome คุณสมบัตินี้จะตอบคำถาม "ตัวเลขตัวแรกและตัวกลางมีความเหมือนกันหรือไม่" สำหรับความยาวที่เท่ากันเลขกลางคือหนึ่งในสองหลักที่กึ่งกลาง

ตัวอย่าง

12345678 -> เท็จเท็จ
มันไม่ใช่ palindrome, หลักแรกและสุดท้ายมีความเท่าเทียมกันที่แตกต่างกัน

12345679 -> เท็จจริง
มันไม่ใช่ palindrome, หลักแรกและสุดท้ายมีความเท่าเทียมกันเหมือนกัน

12344321 -> จริงเท็จ
มันเป็น palindrome หลักแรก 1 และหลักกลาง 4 มีความแตกต่างกัน

123454321 -> True True
มันเป็น palindrome หลักแรก 1 และหลักกลาง 5 มีความเท่าเทียมกัน

ปล.
คุณพร้อมที่จะตัดสินใจเลือกประเภทและรูปแบบของเอาต์พุต มันอาจเป็น 4 ค่าที่ต่างกัน เพียงแค่พูดถึงมันในคำตอบของคุณ


ยังไม่ชัดเจนว่า "ครึ่งหนึ่งของจำนวนนี้" หมายถึงอะไร ฉันคิดว่ามันหมายถึง n / 2 แต่ความกระจ่างดูเหมือนจะบ่งบอกว่ามันเป็นครึ่งแรกหรือสตริงสุดท้าย
xnor

@xnor มันเป็นสตริง
Possum ที่ตายแล้ว

ฉันแก้ไขสิ่งที่ฉันคิดว่าเป็นวิธีที่ง่ายกว่าในการระบุกฎ
xnor

@xnor ดูเหมือนดีขอบคุณ!
Dead Possum

เราสามารถสมมติว่าอินพุตจำนวนเต็มไม่เป็นลบได้หรือไม่?
ติตัส

คำตอบ:


6

05AB1E, 15 , 14 13 ไบต์ (ขอบคุณ Riley และ carusocomputing)

ÐRQi2ä¨}ȹRÈQ

ลองออนไลน์

กลับมาพร้อมกับวงเล็บถ้ามันเป็น palindrome

ส่งคืนด้วย 0 หากพาริตีแตกต่างกัน 1 ถ้ามันเหมือนกัน

Ð เพิ่มอินพุตเช่นฉันมีอินพุตเพียงพอที่จะทำงาน

R ย้อนกลับองค์ประกอบสุดท้ายของสแต็ก

Q ดูว่ามันเหมือนกันหรือไม่ (รับทั้งสององค์ประกอบด้านบนและดำเนินการ ==)

i หากมีคำสั่งให้ทำเฉพาะเมื่อเป็น palindrome เท่านั้น

2 กดหมายเลข 2

ä แบ่งอินพุตเป็น 2 ส่วนเท่ากัน

¨ กดองค์ประกอบแรกของการแยก (1264621 ผลลัพธ์ใน 1264)

} สิ้นสุดถ้า

È ตรวจสอบว่าองค์ประกอบสุดท้ายเป็นคู่

¹ กดอินพุตแรกอีกครั้ง

R ย้อนกลับอินพุตนั้น

È ตรวจสอบว่าเป็นตอนนี้

Q ตรวจสอบว่าผลลัพธ์ที่สม่ำเสมอหรือไม่เหมือนกันและพิมพ์โดยนัย


2
คุณช่วยอธิบายรหัสของคุณได้ไหม?
Dead Possum

จะทำอะไรเร็ว ๆ นี้
P. Knops

1
คุณสามารถใช้แทน¨
Riley

คุณไม่จำเป็นต้อง,เอาท์พุทสิ้นสุด, โดยปริยาย นอกจากนี้คุณสามารถใช้ bifurcate แทน: Â; ประหยัด 2 ไบต์สำหรับ 12:Ð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 สำหรับ palindrome และ parity เดียวกัน
  • 11 สำหรับ palindrome และ parity ที่ต่างกัน
  • 0 สำหรับความไม่เท่าเทียมกันและความเท่าเทียมกัน
  • 1 สำหรับ non-palindrome และ parity ที่ต่างกัน

บันทึก:

  • strlen($n)/2== log($n,10)/2==log($n,100)
  • ถ้า palindrome ให้เปรียบเทียบตัวเลขกลาง $n[1*log($n,100)]
  • ถ้าไม่ใช่ตัวเลขตัวแรก $n[0*log($n,100)]
  • ... เป็นจำนวนเต็ม (<- บิตต่ำสุด <- หลักสุดท้าย)

คุณสามารถบันทึกหนึ่งไบต์โดยใช้<?=แทนecho sandbox.onlinephpfunctions.com/code/…
roberto06

@ roberto06 $argnถูกกำหนดด้วย-Rเท่านั้นและไม่อนุญาตให้ใช้แท็ก
ติตัส

ตกลงไม่ทราบว่าขอบคุณ
roberto06

@ roberto06 รอสักครู่ ... นอกจากนี้ยังสามารถใช้ได้กับ$argn -Fแต่นาโนเมตร
ติตัส

7

เยลลี่ , 16 14 ไบต์

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

ลองออนไลน์!

เอาต์พุตสองบรรทัด:

  • 1สำหรับ palindrome 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])]

ลองออนไลน์!

บันทึก 15 ไบต์ขอบคุณ @Sinusoid

อินพุตเป็นสตริง ส่งออกอาร์เรย์ประเภทที่(0|1) (True|False)มีการ0ระบุว่า "ไม่ใช่ palindrome" และ1"palindrome" ที่Trueระบุและการบ่งชี้พาริตีตรงกันและFalseอื่น ๆ

นี้จะกระทำโดยใช้หลอก ternary (a,b)[index]และการสร้างดัชนีเข้าไปในสถานที่ที่เหมาะสม ดัชนี($n-eq-join$n[$n.length..0])ตรวจสอบว่าอินพุทเป็นแบบสีหรือไม่ หากไม่เป็นเช่นนั้นเราจะนำaส่วนที่เป็น0คู่กับว่าความเท่าเทียมกันของตัวเลขตัวแรก$n[0]นั้นเป็น-eqไปตามความเท่าเทียมกันของหลักสุดท้าย$n[-1]หรือไม่ มิฉะนั้นเราจะอยู่ในbส่วนหนึ่งซึ่งเป็น1ควบคู่ไปกับการว่า$z(ความเท่าเทียมกันของหลักแรก) เป็นทางเพศเพื่อความเท่าเทียมกันของหลักตรงกลาง-eq$n[$n.length/2]

ก่อนหน้านี้ฉันต้อง"$($n[0])"ได้รับตัวเลขแรกที่จะแสดงอย่างถูกต้องเป็นจำนวนเต็มเนื่องจาก$n[0]ผลลัพธ์ในcharตัวดำเนินการโมดูโล%รวมตัวกันcharโดยยึดตามค่า ASCII ไม่ใช่ค่าตามตัวอักษรในขณะที่ a stringทำตามตัวอักษรตามตัวอักษร อย่างไรก็ตาม @Sinusoid ช่วยให้ฉันเห็นว่า0,1,2,...,9ในฐานะที่เป็นตัวอักษรทั้งหมดมีความเท่าเทียมกัน48,49,50,...,57ดังนั้นถ้ามันใช้ค่า ASCII เรายังคงได้รับผลเดียวกัน

อาร์เรย์นั้นถูกทิ้งไว้บนไพพ์ไลน์และเอาต์พุตนั้นเป็นนัย


จากความอยากรู้ทำไมคุณต้องใช้เครื่องหมายคำพูดคู่และอีกรายการหนึ่ง$เมื่อคุณทำโมดูลัส%2เป็นตัวเลข? ฉันลองตัวเองแล้วไม่จำเป็นเลยถ้าฉันทำทีละขั้นตอน แต่เมื่อคุณใส่มันเข้าไปในอาเรย์ PowerShell ถือเป็นตัวแปรชนิดอื่นหรือไม่
Sinusoid

@Sinusoid ก็สละการป้อนข้อมูลเป็นสตริงดังนั้นเมื่อดัชนีมันออกมาเป็น$n[0] charหล่อจากcharการintบังคับโดย%ผู้ประกอบการไม่ได้ไปจาก'1'ไป1แต่เพื่อASCII49ค่าจึงเป็น ไม่หล่ออย่างชัดเจนสตริงแทนซึ่งถูกแปลงไป"$( )" 1... ถึงแม้ว่าตอนนี้คุณพูดถึงแล้วความเท่าเทียมกันของ0..9มันก็เหมือนกับ ASCII 48..57ดังนั้นฉันอาจจะลงสนามได้ ขอบคุณ!
AdmBorkBork

@Sinusoid บันทึก 15 ไบต์ขอบคุณ!
AdmBorkBork

3

VBA, 117 99 ไบต์

บันทึกแล้ว 18 ไบต์ขอบคุณ 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

มันไม่ได้ขยายรูปแบบมากเพียงครั้งเดียว:

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/Thenด้วยr=r+2-2*(left(s,1)-b &1)หรือดียิ่งขึ้นIf s = StrReverse(s) then r=2และr=r+1-(left(s,1)-b &1)... และ 2 ไบต์ออกด้วยการย้อนกลับของหากิน # 2: r=r+(left(s,1)-b &1); Debug.Print r+(left(s,1)-b &1)ประหยัดมากขึ้นกับการพิมพ์โดยตรง: ควรเป็น 95 ไบต์แล้ว; 98 ถ้า&1ไม่ทำงาน
ติตัส

@Titus ขอบคุณ! ฉันไม่คุ้นเคยกับการใช้งานระดับบิตเลย VBA จะมีค่าที่เหมาะสมการดำเนินงานแต่พวกเขาใช้แทนเพียงAnd &ฉันคิดวิธีนำข้อเสนอแนะแรกของคุณไปใช้ แต่ฉันไม่สามารถเข้าใจได้ว่าคุณต้องการเปลี่ยนบรรทัดที่ 3 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 สำหรับ palindromes, 1/0 สำหรับ Tricky # 2
Titus

โอ้และคุณควรจะสามารถแทนที่Mid()ด้วยLeft(s,Len(s)/2+1)หรือดังนั้น
ติตัส

1
@Titus เนื่องจาก VBA นั้นโง่และไม่เสมอกันจาก 0.5 มันใช้ลอจิกแบบ round-to-even ถ้าสตริงคือ 9 ตัวอักษรแล้วLen(s)/2= 4.5ซึ่ง VBA 4จะรอบ ถ้ามันยาว 7 ตัวอักษรแล้วLen(s)/2= 3.5ซึ่ง VBA จะยัง4รอบ การเพิ่ม0.1แก้ไขความบ้า
Engineer Toast

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

เอาต์พุต: 1สำหรับ 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". คืนค่า0เป็น True True 1สำหรับ True False2สำหรับ False True และ3 False False

ฟังก์ชั่น#แปลงตัวละครทั้งสองตัวเป็นรหัสตัวอักษร ASCII ของพวกเขาและผลรวมพวกเขา หากทั้งคู่เป็นคู่หรือทั้งคู่เป็นคี่ผลรวมจะเป็นเลขคู่มิฉะนั้นหากเป็นคู่และคู่อื่น ๆ จะเป็นเลขคี่ การคำนวณแบบโมดูโลสอง#ส่งกลับ0สำหรับพาริตี้เท่ากันและ1อย่างอื่น fตรวจสอบว่าสายป้อนข้อมูลxเป็น Palindrome หากไม่ได้#ถูกเรียกใช้ด้วยxและอักขระสุดท้ายของxและสองจะถูกเพิ่มไปยังผลลัพธ์มิฉะนั้นหากxมีการโทรแบบ palindromic #ด้วยอักขระกลางxแทนและปล่อยผลลัพธ์ตามเดิม


1

Kotlin , 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 0, 0 1, หรือ1 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 FALSEค่า False False, FALSE TRUEFalse True, TRUE FALSETrue True และ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 303 bytes

รหัสหด:

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.