Asla garip veya çift


15

Bunun bir palindrom olduğunu fark ettiniz mi?

Girdi
onu temsil Dışı negatif tam sayı veya dize

Çıktı
4 sayının iki özelliğini temsil eden olası çıktılar:

  • palindrom mu
  • zor # 2

Zor # 2 özelliği
Sayı palindrom değilse, bu özellik "İlk ve son basamaklar aynı pariteye sahip mi?"
Sayı palindrom ise, bu özellik "İlk ve orta basamak aynı pariteye sahip mi?" Eşit uzunluklar için orta basamak, ortadaki iki basamaktan biridir.

Örnekler

12345678 -> Yanlış Yanlış
Palindrom değil, ilk ve son basamak farklı pariteye sahip

12345679 -> False True
Palindrome değil, ilk ve son rakamlar aynı pariteye sahip

12344321 -> Doğru Yanlış
Palindrom, ilk basamak 1 ve orta basamak 4 farklı pariteye sahip

123454321 -> Gerçek Gerçek
Palindrom, ilk hane 1 ve orta hane 5 aynı pariteye sahip

PS
Çıktı türü ve biçimine siz karar verirsiniz. Herhangi 4 farklı değer olabilir. Sadece cevabında bahset.


"Bu sayının yarısı" nın ne anlama geldiği belli değil. Bunun n / 2 anlamına geldiğini düşündüm, ancak açıklama bunun ilk veya son yarısının dize doğru olduğu anlamına geliyor.
xnor

@xnor Onun ipi
Dead Possum

Kuralı ifade etmenin daha basit bir yolu olduğunu düşündüğüm şeyi düzenledim.
xnor

@xnor İyi görünüyor, teşekkürler!
Dead Possum

Negatif olmayan bir tamsayı girdisi olduğunu varsayabilir miyiz?
Titus

Yanıtlar:


6

05AB1E, 15 , 14 13 bayt (Riley ve carusocomputing sayesinde)

ÐRQi2ä¨}ȹRÈQ

Çevrimiçi deneyin

Palindrom ise parantezle döner

Eşlik farklıysa 0, aynı ise 1 ile döner

Ð Girdi ekle, böylece çalışmak için yeterli girdim var

R Yığının son öğesini ters çevirme

Q Aynı olup olmadığına bakın (iki üst öğeyi alır ve == gerçekleştirir)

i If ifadesi, sadece bir palindrom olduğunda geçer

2 2 numaraya basın

ä Girişi 2 eşit dilime bölün

¨ Bölmenin ilk öğesini itin (1264621 sonuç 1264)

} Eğer biterse

È Son öğenin düzgün olup olmadığını kontrol edin

¹ İlk girişi tekrar basın

R Bu girişi ters çevir

È Şimdi bile olup olmadığını kontrol edin

Q Bu eşit sonuçların aynı olup olmadığını kontrol edin ve dolaylı olarak yazdırın


2
Kodunuzla ilgili biraz açıklama yapar mısınız?
Dead Possum

Gerçekten yakında yapacak
P. Knops

1
Bunun ¨yerine kullanabilirsiniz .
Riley

Bitişik ,, örtük çıktıya ihtiyacınız yok . Ayrıca yerine bifurkate kullanabilirsiniz Â:; 12 baytlık 2 bayt tasarruf:ÐRQi¨}ȹRÈQ
Sihirli Ahtapot Urn

İki parçalı kısmı test ederdim, bazı senaryolarda garip davranır, ancak bu ,sizi liderliğe itmelidir;).
Sihirli Ahtapot Urn

8

PHP, 55 52 bayt

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

STDIN'den girdi alır; ile çalıştırın -R.

çıktı:

  • 10 palindrom ve aynı parite için
  • 11 palindrom ve farklı parite için
  • 0 palindrom olmayan ve aynı parite için
  • 1 palindrom olmayan ve farklı parite için

notlar:

  • strlen($n)/2== log($n,10)/2==log($n,100)
  • palindrome ise, orta basamağı karşılaştırın $n[1*log($n,100)]
  • değilse, ilk basamak $n[0*log($n,100)]
  • ... tam sayıya (<- en düşük bit <- son basamak)


@ roberto06 $argnyalnızca ile tanımlanır -Rve bu etiketlere izin vermez.
Titus

Tamam, bilmiyordum, teşekkürler.
roberto06

@ roberto06 Bekle ... $argnile de mevcuttur -F. Ama nm.
Titus

7

Jöle , 16 14 bayt

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

Çevrimiçi deneyin!

İki satır verir:

  • 1palindrom 0için değil
  • 0için zor 2. , 1değil

açıklama

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

Her zaman kendime soruyorum, bununla program yazabilmek için kaç farklı karakter öğrenmek zorundasın? Bütün anlamı ve karakterleri biliyor musun? ALT tuşunu veya karakter tablosunu kullanmadan karakterleri bile yazabilir misiniz? Bunun için bir IDE neye benziyor?
Daniel W.5

3
@DanFromGermany Karakterlerin çoğunu henüz hatırlamıyorum. Bu yüzden de ABD Uluslararası klavye düzenini öğrenmek zorunda değilim, bu yüzden karakterleri wiki'den kopyaladım . Geliştirme, TIO'daki deneme yanılma yoluyla gerçekleşir.
PurkkaKoodari


5

PowerShell , 114 99 bayt

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

Çevrimiçi deneyin!

@Sinusoid sayesinde 15 bayt tasarruf etti.

Dize olarak girilir. Tür bir dizi çıkışları (0|1) (True|False)ile, 0"bir palindrom değil" ve belirten 1belirten "palindrom" ve Trueparite eşleşme olduğunu ve Falseaksi.

Bu sahte bir üçlü kullanarak ve uygun yere indeksleme ile yapılır (a,b)[index]. Dizin ($n-eq-join$n[$n.length..0]), girişin bir palindrom olup olmadığını kontrol eder. Değilse, biz almak abir olan kısmı, 0birinci basamak parite olmadığını birleştiğinde $n[0]ise -eqrakamların parite için UAL $n[-1]. Aksi takdirde, konum bbir çıkan kısmının, 1ister ile birleştiğinde $z(birinci rakam parite) olan -equal orta parmağın parite $n[$n.length/2].

Önceden, "$($n[0])"bir tamsayı olarak doğru bir şekilde döküm yapmak için ilk basamağı almak zorunda kaldım , çünkü $n[0]a charve modulo operatörünün sonuçları , değişmez değere değil ASCII değerine dayalı olarak %birleşirken char, a stringdeğişmez değerdir. Bununla birlikte, @Sinusoid 0,1,2,...,9gerçek değerlerin hepsiyle aynı pariteye sahip olduklarını görmeme yardımcı oldu 48,49,50,...,57, bu yüzden ASCII değerini kullanırsa yine de aynı sonucu alıyoruz.

Bu dizi ardışık düzende bırakılır ve çıktı örtüktür.


Meraktan, neden bir sayıya $katlandığınızda çift ​​tırnak ve bir ekstra kullanmak zorunda kaldınız %2? Bunu kendim denedim ve her adımı ayrı ayrı yapmam gerekli değildi, ama bir dizinin içine koyduğunuzda mı? Powershell bunu farklı bir değişken türü olarak mı ele alıyor?
Sinusoid

@Sinusoid Girdi bir dize olarak alıyor, bu nedenle $n[0]dizinler olduğunda , bir olarak çıkıyor char. Dan döküm chariçin intzoruyla %gelen gitmez operatör '1'için 1, bunlarla ASCII değeri, böylece olduğundan 49. Bunun "$( )"yerine, düzgün bir şekilde dönüştüren dizeye açık bir döküm yapar 1. ... şimdi sen söyleyince, rağmen parite ait 0..9ASCII aynıdır 48..57bu yüzden can muhtemelen golf aşağı olduğunu. Teşekkürler!
AdmBorkBork

@Sinusoid 15 bayt kaydedildi, teşekkürler!
AdmBorkBork

3

VBA, 117 99 bayt

Titus sayesinde 18 bayt tasarruf edildi

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

Biçimlendirildikten sonra çok fazla genişlemez:

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

Aşağıda verilen test senaryosu sonuçları verilmiştir:

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'nın bitsel operatörleri var mı? &1Bunun yerine deneyin mod 2. Ayrıca ya da daha iyisi ve ... ve 2 byte off Tricky # 2 ters If/Thenile kurtulmak :; doğrudan baskı ile daha fazla tasarruf: . O zaman 95 bayt olmalı; 98 çalışmazsa. r=r+2-2*(left(s,1)-b &1)If s = StrReverse(s) then r=2r=r+1-(left(s,1)-b &1)r=r+(left(s,1)-b &1)Debug.Print r+(left(s,1)-b &1)&1
Titus

@Titus Teşekkürler! Aslında bitsel operasyonlara hiç aşina değildim. VBA'nın bitsel işlemleri var ama Andsadece yerine kullanıyorlar &. İlk önerinizi nasıl uygulayacağınızı anladım, ancak 3. satırı nasıl değiştirmek istediğinizi anlayamadım StrReverse.
Mühendis Tost

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-> palindromlar için 0/2, Tricky # 2 için 1/0
Titus

Oh ve değiştirmek gerekir Mid()ile Left(s,Len(s)/2+1)ya da öylesine.
Titus

1
@Titus VBA aptal ve her zaman 0,5'ten fazla yuvarlanmıyor. Eşit-eşit mantık kullanır . Dize 9 karakter uzunluğunda ise Len(s)/2= 4.5hangi VBA'nın yuvarlanacağı 4. O zaman, uzun 7 karakterden varsa Len(s)/2= 3.5hangi VBA olacak da yuvarlak için 4. Eklemek 0.1çılgınlığı düzeltir.
Mühendis Tost

3

Perl 6 , 48 bayt

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

Dene

sonuç (True True) (True False) (False True)veya(False False)

Expanded:

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

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

Çıktılar: 1yanlış-yanlış için; 2yanlış-doğru için; 3doğru-yanlış için; 4doğru-doğru için.

Açıklama:

Burada deneyin.

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 bayt

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

Çevrimiçi deneyin! Kullanımı: f "12345". 0True True, False True 1, 2False True ve 3False False için döndürür .

İşlev #, her iki basamaklı karakteri de ascii karakter kodlarına dönüştürür ve toplar. Her ikisi de eşitse veya her ikisi de tekse, toplam çift olacaktır, aksi takdirde biri çift ve diğeri tekse toplam tek olacaktır. Modulo ikisini hesaplamak, eşit parite için #döner 0ve 1aksi halde. fgiriş dizesinin xpalindrom olup olmadığını kontrol eder . Değilse #ile çağrılır xve son karakterix ve iki, sonuca eklenirse, aksi takdirde bunun yerine orta karakterle xpalindromik çağrı yapılır ve sonucu olduğu gibi bırakın.#x


1

Kotlin , 142 bayt

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

Çevrimiçi deneyin!

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 bayt

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

Mantıksal değer çifti döndürür 0 0, 0 1, 1 0ya da 1 1.


1

R, 115 109 105 bayt

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'den girdi alır. FALSE FALSEFalse False, FALSE TRUEFalse True, TRUE FALSETrue False ve TRUE TRUETrue True için döndürür .


1

AWK, 97 96 bayt

{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

En basit kullanım kodu dosyaya yerleştirmektir OddEven:

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

Çıktı, esasen Sorudaki karşılaştırmaların bit toplamıdır, ör.

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

Ben çıkarmadan çalıştı ()dan (s?0:2)ancak operatör önceliği kadar bu Messes nasılsa.


Artışı j üzerine getirerek bir bayt kaydetti. Bu, for () öğesinin bir süre () ile değiştirilebileceği, ancak bunu yaparken hiçbir baytın kaydedilmeyeceği anlamına gelir :(
Robert Benson

1

CJam, 32 bayt

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

Giriş, yığının üstündeki bir sayıdır.

Açıklama:

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, 326303 bayt

Daralan Kod:

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)

Orijinal Kod (Açıklamalı):

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)

Orijinal Kod (Açıklama olmadan):

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)

Giriş:

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

Çıktı:

"PS" - Palindrome with Same Parity
"PN" - Palindrome with Diff Parity
"NS" - Non-palindrome with Same Parity
"NN" - Non-palindrome with Diff Parity
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.