Niemals ungerade oder gerade

15

Haben Sie bemerkt, dass dies ein Palindrom ist?

Eingabe
Nicht negative Ganzzahl oder Zeichenfolge, die diese Zahl darstellt

Ausgabe
4 mögliche Ausgaben, die zwei Eigenschaften der Zahl darstellen:

  • ist es Palindrom
  • tricky # 2

Tricky # 2 property
Wenn number nicht palindrome ist, beantwortet diese Eigenschaft die Frage "Haben die erste und die letzte Ziffer die gleiche Parität?"
Wenn die Zahl palindrom ist, beantwortet diese Eigenschaft die Frage "Haben die erste und die mittlere Ziffer die gleiche Parität?". Bei geraden Längen ist die mittlere Ziffer eine der beiden mittleren Ziffern.

Beispiele

12345678 -> False False
Es ist kein Palindrom, erste und letzte Ziffer haben unterschiedliche Parität

12345679 -> False True
Es ist kein Palindrom, erste und letzte Ziffer haben die gleiche Parität

12344321 -> True False
Es handelt sich um ein Palindrom. Die erste Ziffer 1 und die mittlere Ziffer 4 haben unterschiedliche Paritäten

123454321 -> True True
Es handelt sich um ein Palindrom. Die erste Ziffer 1 und die mittlere Ziffer 5 haben dieselbe Parität

PS
Sie können Art und Format der Ausgabe selbst bestimmen. Es können 4 verschiedene Werte sein. Erwähne es einfach in deiner Antwort.

Totes Opossum
quelle
Es ist nicht klar, was "die Hälfte dieser Zahl" bedeutet. Ich dachte, es bedeutete n / 2, aber die Klarstellung scheint zu implizieren, dass es die erste oder letzte Hälfte der Reihe ist.
XNOR
@xnor Its stringwise
Dead Possum
Ich habe die Regel auf eine meiner Meinung nach einfachere Art und Weise bearbeitet.
Xnor
@xnor Scheint gut zu sein, danke!
Dead Possum
Können wir eine nicht negative Ganzzahleingabe annehmen?
Titus

Antworten:

6

05AB1E, 15 , 14, 13 Bytes (Dank an Riley und carusocomputing)

ÐRQi2ä¨}ȹRÈQ

Versuchen Sie es online

Gibt mit Klammern zurück, wenn es sich um ein Palindrom handelt

Gibt mit 0 zurück, wenn die Parität unterschiedlich ist, und mit 1, wenn sie gleich ist

Ð Füge Input hinzu, so dass ich genug Input habe, um damit zu arbeiten

R Kehrt das letzte Element des Stapels um

Q Prüfen Sie, ob es dasselbe ist (nimmt die beiden obersten Elemente und führt == aus)

i If-Anweisung geht also nur durch, wenn es sich um ein Palindrom handelt

2 Drücken Sie die Nummer 2

ä Teilen Sie die Eingabe in 2 gleiche Schichten

¨ Schieben Sie das erste Element der Teilung (1264621 ergibt 1264)

} Ende wenn

È Überprüfen Sie, ob das letzte Element gerade ist

¹ Drücken Sie den ersten Eingang erneut

R Kehre diese Eingabe um

È Überprüfen Sie, ob es jetzt noch ist

Q Überprüfen Sie, ob diese geraden Ergebnisse gleich sind und implizit gedruckt werden

P. Knops
quelle
2
Erklären Sie Ihren Code?
Dead Possum
Wird es wirklich bald tun
P. Knops
1
Sie könnten ¨anstelle von verwenden .
Riley
Sie brauchen keine endende ,, implizite Ausgabe. Auch statt Sie können gegabelten benutzen Â; Einsparungen von 2 Byte für 12:ÐRQi¨}ȹRÈQ
Magic Octopus Urn
Ich würde den Gabelungsteil testen, er verhält sich in bestimmten Szenarien merkwürdig, aber das ,sollte Sie an die Spitze treiben ;).
Magic Octopus Urn
8

PHP, 55 52 Bytes

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

nimmt Eingaben von STDIN entgegen; renn mit -R.

Ausgabe:

  • 10 für Palindrom und gleiche Parität
  • 11 für Palindrom und unterschiedliche Parität
  • 0 für Nicht-Palindrom und gleiche Parität
  • 1 für Nicht-Palindrom und unterschiedliche Parität

Anmerkungen:

  • strlen($n)/2== log($n,10)/2==log($n,100)
  • Bei Palindrom die mittlere Ziffer vergleichen $n[1*log($n,100)]
  • Wenn nicht, erste Ziffer $n[0*log($n,100)]
  • ... auf ganze Zahl (<- niedrigstes Bit <- letzte Ziffer)
Titus
quelle
Sie können ein Byte speichern, indem Sie <?=anstelle von echo sandbox.onlinephpfunctions.com/code/…
roberto06 am
@ roberto06 $argnist nur mit definiert -Rund das erlaubt keine Tags.
Titus
OK, wusste das nicht, danke.
roberto06
@ roberto06 Warten ... $argngibt es auch mit -F. Aber nm.
Titus
7

Jelly , 16 bis 14 Bytes

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

Probieren Sie es online!

Gibt zwei Zeilen aus:

  • 1für Palindrom, 0für nicht
  • 0für knifflige # 2 , 1für nicht

Erläuterung

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
PurkkaKoodari
quelle
Ich frage mich immer, wie viele verschiedene Charaktere muss man lernen, um damit Programme schreiben zu können? Kennst du alle Bedeutungen und alle Charaktere? Können Sie die Zeichen auch ohne ALT-Taste oder Zeichentabelle eingeben? Wie sieht eine IDE dafür aus?
Daniel W.
3
@DanFromGermany Ich erinnere mich noch nicht an die meisten Charaktere. Aus diesem Grund muss ich auch nicht das US International-Tastaturlayout lernen, also kopiere ich einfach die Zeichen aus dem Wiki . Die Entwicklung erfolgt durch Ausprobieren in TIO.
PurkkaKoodari
5

PowerShell , 114 bis 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])]

Probieren Sie es online!

Dank @Sinusoid 15 Bytes gespart.

Eingaben als Zeichenfolge. Gibt ein Array vom Typ aus (0|1) (True|False), wobei 0"kein Palindrom" und 1"Palindrom" angezeigt werden und die Trueangezeigte Parität übereinstimmt False.

Dies geschieht durch Verwendung eines Pseudoternärs und Indizierung an der entsprechenden Stelle (a,b)[index]. Der Index ($n-eq-join$n[$n.length..0])prüft, ob die Eingabe ein Palindrom ist. Wenn dies nicht der Fall, nehmen wir den aTeil, der eine ist 0mit gekoppelt ob die Parität der ersten Ziffer $n[0]ist -equal der Parität der letzten Ziffer $n[-1]. Ansonsten befinden wir uns in dem bTeil, der 1mit der Parität der mittleren Ziffer $z(der Parität der ersten Ziffer) -eqgekoppelt ist $n[$n.length/2].

Früher musste ich "$($n[0])"die erste Ziffer als Ganzzahl korrekt umsetzen, da $n[0]a charund der Modulo-Operator s auf der Grundlage des ASCII-Werts und nicht des Literalwerts %verschmelzen char, während a stringden Literalwert ergibt. Mit @Sinusoid konnte ich jedoch feststellen, dass 0,1,2,...,9alle Literalwerte die gleiche Parität wie 48,49,50,...,57haben. Wenn also der ASCII-Wert verwendet wird, erhalten wir immer noch das gleiche Ergebnis.

Dieses Array verbleibt in der Pipeline, und die Ausgabe ist implizit.

AdmBorkBork
quelle
Warum mussten Sie aus Neugier doppelte Anführungszeichen und ein zusätzliches verwenden, $wenn Sie %2eine Zahl modulierten ? Ich habe es selbst versucht und es war nicht notwendig, wenn ich jeden Schritt einzeln ausgeführt habe, aber wenn Sie ihn in ein Array einfügen? Wird es von Powershell als anderer Variablentyp behandelt?
Sinusoid
@Sinusoid Es nimmt Eingaben als Zeichenfolge entgegen. Wenn also ein $n[0]Index erstellt wird, wird er als ausgegeben char. Die vom Operator erzwungene Umwandlung von charnach erfolgt nicht von nach nach , sondern nach dem ASCII- Wert . Das führt stattdessen eine explizite Umwandlung in einen String durch, in den es ordnungsgemäß konvertiert wird . ... Obwohl jetzt, da Sie es erwähnen, die Parität von der von ASCII identisch ist , kann ich das wahrscheinlich abschätzen. Vielen Dank! int%'1'149"$( )"10..948..57
AdmBorkBork
@ Sinusoid 15 Bytes gespeichert, danke!
AdmBorkBork
3

VBA, 117 99 Bytes

18 Bytes dank Titus gespart

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

Es wird nicht viel erweitert, wenn es einmal formatiert ist:

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

Hier sind die gegebenen Testergebnisse:

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
Ingenieur Toast
quelle
Hat VBA bitweise Operatoren? Versuchen Sie es &1statt mod 2. Sie könnten auch das If/Thenmit r=r+2-2*(left(s,1)-b &1)oder sogar besser loswerden If s = StrReverse(s) then r=2und r=r+1-(left(s,1)-b &1)... und 2 Bytes weg mit dem Umkehren des Tricky # 2 r=r+(left(s,1)-b &1):; sparen mehr mit Druck direkt: Debug.Print r+(left(s,1)-b &1). Sollte dann 95 Bytes sein; 98 wenn &1nicht funktioniert.
Titus
@ Titus Danke! Eigentlich kannte ich mich mit bitweisen Operationen überhaupt nicht aus. VBA verfügt zwar über bitweise Operationen , diese werden jedoch Andnicht nur verwendet &. Ich habe herausgefunden, wie Sie Ihren ersten Vorschlag umsetzen können, aber ich konnte nicht herausfinden, wie Sie die dritte Zeile mit ändern wollten StrReverse.
Ingenieur 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 für Palindrome, 1/0 für Tricky # 2
Titus
Oh und du solltest das Mid()mit Left(s,Len(s)/2+1)oder so ersetzen können .
Titus
1
@Titus Weil VBA dumm ist und nicht immer von 0,5 aufrundet. Es wird eine Round-to-Even- Logik verwendet. Wenn die Zeichenfolge 9 Zeichen lang ist, wird Len(s)/2= auf 4.5welche VBA gerundet 4. Wenn es 7 Zeichen lang ist, wird Len(s)/2= auf 3.5welches VBA auch gerundet 4. Hinzufügen 0.1korrigiert den Wahnsinn.
Ingenieur Toast
3

Perl 6 , 48 Bytes

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

Versuch es

ergibt (True True) (True False) (False True)oder(False False)

Erweitert:

{                  # 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
}
Brad Gilbert b2gills
quelle
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;}

Ausgänge: 1für falsch-falsch; 2für falsch-wahr; 3für wahr-falsch; 4für wahr-wahr.

Erläuterung:

Probieren Sie es hier aus.

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
Kevin Cruijssen
quelle
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)

Probieren Sie es online! Verbrauch: f "12345". Gibt 0für True True, 1für True False, 2für False True und 3für False False zurück.

Die Funktion #konvertiert beide Ziffern in ihre ASCII-Zeichencodes und summiert sie. Wenn beide gerade oder beide ungerade sind, ist die Summe gerade, andernfalls, wenn einer gerade und der andere ungerade ist, ist die Summe ungerade. Die Berechnung Modulo zwei, #kehrt 0für gleiche Parität und aus 1anderen Gründen . fprüft, ob die Eingabezeichenfolge xein Palindrom ist. Wenn nicht, #wird mit aufgerufen xund das letzte Zeichen von xund zwei wird zum Ergebnis hinzugefügt, andernfalls xwird bei einem palindromischen Aufruf #mit dem mittleren Zeichen von xstattdessen das Ergebnis so belassen, wie es ist.

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

Probieren Sie es 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
)
leuchtender_hafen
quelle
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

Gibt logisches Wertepaar 0 0, 0 1, 1 0oder 1 1.

idrougge
quelle
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)

Übernimmt die Eingabe von stdin. Gibt FALSE FALSEfür False False, FALSE TRUEfür False True, TRUE FALSEfür True False und TRUE TRUEfür True True zurück.

rturnbull
quelle
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

Am einfachsten ist es, den Code in einer Datei abzulegen: OddEvendann mache:

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

Die Ausgabe ist im Wesentlichen die Bitsumme der Vergleiche in der Frage, z

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

Ich habe versucht das Entfernen der ()aus (s?0:2)aber diese vermasselt Operatorpräzedenz irgendwie.

Robert Benson
quelle
Durch Bewegen des Inkrements auf j wurde ein Byte gespeichert. Dies bedeutet, dass das for () durch ein while () ersetzt werden könnte, aber dabei werden keine Bytes gespeichert :(
Robert Benson
1

CJam, 32 Bytes

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

Die Eingabe ist eine Zahl oben auf dem Stapel.

Erläuterung:

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
Esolanging Fruit
quelle
1

Groovy, 326 303 Bytes

Geschrumpfter Code:

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)

Originalcode (mit Erklärung):

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)

Originalcode (ohne Erklärung):

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)

Eingang:

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

Ausgabe:

"PS" - Palindrome with Same Parity
"PN" - Palindrome with Diff Parity
"NS" - Non-palindrome with Same Parity
"NN" - Non-palindrome with Diff Parity
Jimwel Anobong
quelle