Nigdy dziwne, a nawet parzyste


15

Czy zauważyłeś, że to jest palindrom?

Wprowadź
nieujemną liczbę całkowitą lub ciąg znaków reprezentujący ją

Wyjście
4 możliwe wyjścia, reprezentujące dwie właściwości liczby:

  • czy to palindrom?
  • trudne # 2

Podstępna właściwość # 2
Jeśli liczba nie jest palindromem, ta właściwość odpowiada na pytanie „Czy pierwsza i ostatnia cyfra mają tę samą parzystość?”
Jeśli liczba jest palindromem, ta właściwość odpowiada na pytanie „Czy pierwsza i środkowa cyfra mają tę samą parzystość?”. Dla parzystych długości środkowa cyfra jest jedną z dwóch środkowych cyfr.

Przykłady

12345678 -> Fałsz Fałsz
To nie jest palindrom, pierwsze i ostatnie cyfry mają różną parzystość

12345679 -> Fałsz Prawda
To nie jest palindrom, pierwsze i ostatnie cyfry mają tę samą parzystość

12344321 -> Prawda Fałsz
To palindrom, pierwsza cyfra 1 i środkowa cyfra 4 mają różną parzystość

123454321 -> Prawda Prawda
To palindrom, pierwsza cyfra 1 i środkowa cyfra 5 mają tę samą parzystość

PS
Ty decydujesz o rodzaju i formacie wyjścia. Mogą to być dowolne 4 różne wartości. Po prostu wspomnij o tym w swojej odpowiedzi.


Nie jest jasne, co oznacza „połowa tej liczby”. Myślałem, że oznaczało to n / 2, ale wyjaśnienie zdaje się sugerować, że jest to pierwsza lub ostatnia połowa łańcucha.
xnor

@xnor Jego ciąg
Dead Possum

Zredagowałem to, co moim zdaniem jest prostszym sposobem określenia reguły.
xnor

@xnor Wydaje się dobre, dziękuję!
Dead Possum,

Czy możemy założyć nieujemną liczbę całkowitą?
Tytus

Odpowiedzi:


6

05AB1E, 15 , 14 13 bajtów (dzięki Riley i carusocomputing)

ÐRQi2ä¨}ȹRÈQ

Wypróbuj online

Zwraca w nawiasach, jeśli jest to palindrom

Zwraca 0, jeśli parzystość jest inna, 1, jeśli jest taka sama

Ð Dodaj dane wejściowe, dzięki czemu mam wystarczającą ilość danych wejściowych do pracy

R Odwróć ostatni element stosu

Q Sprawdź, czy jest taki sam (bierze dwa górne elementy i wykonuje ==)

i Instrukcja if, więc przejdzie tylko wtedy, gdy jest palindromem

2 Naciśnij cyfrę 2

ä Podziel wejście na 2 równe plasterki

¨ Wciśnij pierwszy element podziału (1264621 wyników w 1264)

} Zakończ jeśli

È Sprawdź, czy ostatni element jest parzysty

¹ Naciśnij ponownie pierwsze wejście

R Odwróć to wejście

È Sprawdź, czy jest jeszcze teraz

Q Sprawdź, czy te parzyste wyniki są takie same i niejawnie drukowane


2
Czy podasz jakieś wyjaśnienie swojego kodu?
Dead Possum,

Zrobimy to wkrótce
P. Knops

1
Możesz użyć ¨zamiast .
Riley,

Nie potrzebujesz końcowego ,, niejawnego wyniku. Także zamiast można użyć selerowaty: Â; oszczędność 2 bajtów dla 12:ÐRQi¨}ȹRÈQ
Magiczna ośmiornica Urn

Przetestowałbym bifurkowaną część, która zachowuje się dziwnie w niektórych scenariuszach, ale to ,powinno pchnąć cię na prowadzenie;).
Magic Octopus Urn

8

PHP, 55 52 bajtów

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

pobiera dane wejściowe ze STDIN; biegać z -R.

wynik:

  • 10 dla palindromu i tej samej parzystości
  • 11 dla palindromu i innej parzystości
  • 0 w przypadku braku palindromu i tej samej parzystości
  • 1 w przypadku braku palindromu i innej parzystości

uwagi:

  • strlen($n)/2== log($n,10)/2==log($n,100)
  • jeśli palindrom, porównaj środkową cyfrę $n[1*log($n,100)]
  • jeśli nie, pierwsza cyfra $n[0*log($n,100)]
  • ... na liczbę całkowitą (<- najniższy bit <- ostatnia cyfra)

Możesz zapisać jeden bajt, używając <?=zamiast echo sandbox.onlinephpfunctions.com/code/…
roberto06

@ roberto06 $argnjest zdefiniowany tylko za pomocą -R, i nie pozwala na znaczniki.
Tytus

OK, nie wiedziałem tego, dzięki.
roberto06

@ roberto06 Czekaj ... $argnjest również dostępny z -F. Ale nm.
Tytus

7

Galaretka , 16 14 bajtów

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

Wypróbuj online!

Wyprowadza dwie linie:

  • 1za palindrom, 0za nie
  • 0za podstępne # 2 , 1za nie

Wyjaśnienie

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

Zawsze zadaję sobie pytanie, ile różnych postaci musisz nauczyć się pisać z tym programem? Czy znasz całe znaczenie i wszystkie postacie? Czy potrafisz nawet wpisać znaki bez użycia klawisza ALT lub tablicy znaków? Jak wygląda IDE dla tego?
Daniel W.

3
@DanFromGermany Nie pamiętam jeszcze większości postaci. Z tego powodu nie muszę się również uczyć układu klawiatury US International, więc po prostu kopiuję znaki z wiki . Rozwój odbywa się metodą prób i błędów w TIO.
PurkkaKoodari


5

PowerShell , 114 99 bajtów

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

Wypróbuj online!

Zaoszczędzono 15 bajtów dzięki @Sinusoid.

Dane wejściowe jako ciąg. Wyprowadza tablicę typu (0|1) (True|False)ze 0wskazującym „nie palindromem” i 1wskazującym „palindromem”, a Trueparzystość wskazująca jest dopasowana i w Falseinny sposób.

Odbywa się to za pomocą pseudo-trójki i indeksowania w odpowiednim miejscu (a,b)[index]. Indeks ($n-eq-join$n[$n.length..0])sprawdza, czy dane wejściowe są palindromem. Jeśli tak nie jest, bierzemy tę aczęść, która jest 0sprzężona z tym, czy parzystość pierwszej cyfry $n[0]jest równa -eqparzystości ostatniej cyfry $n[-1]. W przeciwnym razie jesteśmy w bczęści, która jest 1sprzężona z tym, czy $z(parzystość pierwszej cyfry) jest równa -eqparzystości środkowej cyfry $n[$n.length/2].

Wcześniej musiałem "$($n[0])"uzyskać pierwszą cyfrę, aby poprawnie rzutowała jako liczba całkowita, ponieważ $n[0]wyniki a chari operator modulo %łączą się chars na podstawie wartości ASCII, a nie wartości dosłownej, podczas gdy a stringrobi wartość dosłowną. Jednak @Sinusoid pomógł mi zobaczyć, że 0,1,2,...,9ponieważ dosłowne wartości mają taką samą parzystość jak 48,49,50,...,57, więc jeśli używa wartości ASCII, nadal otrzymujemy ten sam wynik.

Tę tablicę pozostawia się w potoku, a dane wyjściowe są niejawne.


Z ciekawości, dlaczego musiałeś użyć podwójnych cudzysłowów i dodatkowego, $gdy zrobiłeś moduł %2dla liczby? Próbowałem tego sam i nie było to konieczne, gdybym robił każdy krok indywidualnie, ale czy to jest, gdy umieścisz go w tablicy? Czy PowerShell traktuje go jako inny typ zmiennej?
Sinusoid

@ Sinusoid Pobiera dane wejściowe jako ciąg, więc kiedy $n[0]indeksuje, wychodzi jako char. Rzut z charna intwymuszony przez %operatora nie przechodzi od '1'do 1, ale do wartości ASCII , więc jest 49. "$( )"Robi wyraźne zabarwienie ciąg zamiast, który konwertuje go prawidłowo 1. ... Mimo, że teraz wspomnieć, tym parytet od 0..9jest taka sama jak ASCII 48..57, więc mogę chyba że golf w dół. Dzięki!
AdmBorkBork

@Sinusoid 15 bajtów zapisanych, dzięki!
AdmBorkBork

3

VBA, 117 99 bajtów

Zaoszczędził 18 bajtów dzięki Tytusowi

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

Po sformatowaniu niewiele się rozwija.

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

Oto wyniki podanych przypadków testowych:

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

Czy VBA ma operatory bitowe? Spróbuj &1zamiast mod 2. Można też pozbyć się If/Thenz r=r+2-2*(left(s,1)-b &1)lub jeszcze lepiej If s = StrReverse(s) then r=2i r=r+1-(left(s,1)-b &1)... i 2 bajty mecz odwrócenie Tricky # 2: r=r+(left(s,1)-b &1); więcej oszczędzać przy drukowaniu bezpośrednio: Debug.Print r+(left(s,1)-b &1). Powinien wtedy wynosić 95 bajtów; 98 jeśli &1nie działa.
Tytus

@Titus Thanks! Właściwie wcale nie znałem operacji bitowych. VBA ma operacje bitowe, ale używa ich Andzamiast po prostu &. Wymyśliłem, jak wdrożyć pierwszą sugestię, ale nie mogłem zrozumieć, jak zamierzałeś zmienić trzecią linię StrReverse.
Inżynier 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 dla palindromów, 1/0 dla Tricky # 2
Tytus

No i powinien być w stanie wymienić Mid()z Left(s,Len(s)/2+1)lub tak.
Tytus

1
@Titus Ponieważ VBA jest głupi i nie zawsze zaokrągla w górę od 0,5. Wykorzystuje logikę zaokrąglenia do parzystości . Jeśli łańcuch ma 9 znaków, to Len(s)/2= do 4.5którego VBA zaokrągli 4. Jeśli ma 7 znaków, to Len(s)/2= do 3.5którego VBA również się zaokrągli 4. Dodanie 0.1poprawia obłęd.
Inżynier Toast

3

Perl 6 , 48 bajtów

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

Spróbuj

wyniki w (True True) (True False) (False True)lub(False False)

Rozszerzony:

{                  # 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 bajtów

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

Wyjścia: 1dla false-false; 2dla fałszu-prawdy; 3dla prawda-fałsz; 4dla prawdy-prawdy.

Wyjaśnienie:

Wypróbuj tutaj.

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 bajtów

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

Wypróbuj online! Zastosowanie: f "12345". Zwraca wartość 0True True, 1True False, 2False True i 3False False.

Funkcja #konwertuje obie cyfry na ich kody ascii i sumuje je. Jeśli oba są parzyste lub oba są nieparzyste, suma będzie parzysta, w przeciwnym razie, jeśli jedno będzie parzyste, a drugie nieparzyste, suma będzie nieparzysta. Obliczanie modulo dwa, #zwraca 0dla równej parzystości i 1inaczej. fsprawdza, czy ciąg wejściowy xjest palindromem. Jeśli nie, #to wywoływany jest za pomocą, xa xdo wyniku dodawany jest ostatni znak i dwa, w przeciwnym razie, jeśli xjest wywołanie palindromiczne #ze środkowym znakiem xzamiast, i pozostaw wynik bez zmian .


1

Kotlin , 142 bajty

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

Wypróbuj 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
)

1

REXX, 104 100 bajtów

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

Zwraca wartość logiczną parą 0 0, 0 1, 1 0lub 1 1.


1

R, 115 109 105 bajtów

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)

Pobiera dane wejściowe ze standardowego wejścia. Zwraca wartość FALSE FALSEFalse False, FALSE TRUEFalse True, TRUE FALSETrue False i TRUE TRUETrue True.


1

AWK, 97 96 bajtów

{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

Najprostszym sposobem jest umieszczenie kodu w pliku: OddEvennastępnie wykonaj:

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

Wynik jest zasadniczo sumą bitów porównań w pytaniu, np

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

Próbowałem usunąć ()z, (s?0:2)ale to w jakiś sposób zaburza pierwszeństwo operatora.


Zapisano bajt, przesuwając przyrost na j. Oznacza to, że for () można zamienić na chwilę (), ale w ten sposób nie zostaną zapisane żadne bajty :(
Robert Benson

1

CJam, 32 bajty

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

Dane wejściowe to liczba na górze stosu.

Wyjaśnienie:

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 bajtów

Kod skurczony:

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)

Kod oryginalny (z wyjaśnieniem):

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)

Kod oryginalny (bez wyjaśnienia):

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)

Wejście:

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

Wynik:

"PS" - Palindrome with Same Parity
"PN" - Palindrome with Diff Parity
"NS" - Non-palindrome with Same Parity
"NN" - Non-palindrome with Diff Parity
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.