Ніколи не непарно або парно


15

Ви помітили, що це паліндром?

Введіть
невід'ємне ціле число або рядок, що представляє його

Вихід
4 можливих виходів, що представляють два властивості числа:

  • це паліндром
  • хитрий №2

Властивість Tricky # 2
Якщо число не паліндром, це властивість відповідає на питання "Чи однакова і перша черт, і остання цифра?"
Якщо число паліндром, ця властивість відповідає на питання "Чи однакова і перша та середня цифри мають однаковий паритет?". Для рівних довжин середня цифра є однією з центральних двох цифр.

Приклади

12345678 -> False False
Це не паліндром, перші та останні цифри мають різний паритет

12345679 -> Хибно правда
Це не паліндром, перші та останні цифри мають однаковий паритет

12344321 -> Істинна помилка
Це паліндром, перша цифра 1 і середня цифра 4 мають різний паритет

123454321 -> True True
Це паліндром, перша цифра 1 і середня цифра 5 мають однаковий паритет

PS
Ви вирішуєте тип та формат виводу. Це можуть бути будь-які 4 різних значення. Просто згадайте про це у своїй відповіді.


Не ясно, що означає "половина цього числа". Я подумав, що це означає n / 2, але, здається, уточнення означає, що це перша чи остання половина строково.
xnor

@xnor Її струнно
Dead Possum

Я відредагував те, що, на мою думку, є більш простим способом викласти правило.
xnor

@xnor Здається добре, дякую!
Мертвий Поссум

Чи можемо ми припустити невід'ємне ціле введення?
Тит

Відповіді:


6

05AB1E, 15 , 14 13 байт (Завдяки Райлі та карусокомп'ютерам)

ÐRQi2ä¨}ȹRÈQ

Спробуйте в Інтернеті

Повертається дужками, якщо це паліндром

Повертається з 0, якщо парність різна, 1, якщо вона однакова

Ð Додайте вхід, щоб у мене було достатньо входу для роботи

R Переверніть останній елемент стека

Q Подивіться, чи це однаково (бере два верхні елементи і виконує ==)

i Якщо твердження, то проходить лише тоді, коли це паліндром

2 Натисніть на число 2

ä Розбийте введення на 2 рівні скибочки

¨ Перший елемент розколу (1264621 результат у 1264 р.)

} Кінець, якщо

È Перевірте, чи останній елемент рівний

¹ Знову натисніть перший ввід

R Зворотній зв'язок

È Перевірте, чи це навіть зараз

Q Перевірте, чи ті самі результати однакові та друкуються неявно


2
Ви додасте пояснення свого коду?
Мертвий Поссум

Зробимо справді незабаром
П. Нопс

1
Ви можете використовувати ¨замість цього .
Райлі

Вам не потрібно закінчення ,, неявний вихід. Крім того, замість того , щоб ви можете використовувати роздвоюються: Â; економія 2 байти за 12:ÐRQi¨}ȹRÈQ
Чарівний восьминіг Урна

Я б протестував роздвоєну частину, вона дивно поводиться в певних сценаріях, але це ,повинно підштовхнути вас до лідерства;).
Чарівна восьминога урна

8

PHP, 55 52 байти

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

приймає вхід від STDIN; бігати з-R .

вихід:

  • 10 для паліндром і той же паритет
  • 11 для паліндром і різного паритету
  • 0 для непаліндрому та такого ж паритету
  • 1 для непаліндрому та різного паритету

примітки:

  • strlen($n)/2== log($n,10)/2==log($n,100)
  • якщо паліндром, порівняйте середню цифру $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для паліндром, 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 для цього?
Даніель В.

3
@DanFromGermany Я ще не пам’ятаю більшості персонажів. Через це я також не вивчив розкладку клавіатури США International, тому я просто копіюю символи з вікі . Розробка відбувається за допомогою проб і помилок у 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зазначенням "не паліндром" та 1вказівкою "паліндром", а Trueіндикаторний паритет збігається та Falseінше.

Це робиться за допомогою псевдотерміналу та індексації у відповідне місце (a,b)[index]. Індекс ($n-eq-join$n[$n.length..0])перевіряє, чи є вхід паліндром. Якщо це не так , ми беремо aчастину, яка представляє собою 0з'єднану з чи парність першою цифрою $n[0]є -eqUAL парності останньої цифри $n[-1]. В іншому випадку ми знаходимось у bчастині, що 1поєднується з тим, чи є $z(парність першої цифри) -eqнереальною до парності середньої цифри $n[$n.length/2].

Раніше мені доводилося "$($n[0])"отримувати першу цифру для правильного відтворення як ціле число, оскільки $n[0]результат a charі оператор модуля %з'єднується chars на основі значення ASCII, а не прямого значення, тоді як a string- буквального значення. Однак @Sinusoid допоміг мені це побачити0,1,2,...,9 як буквальні значення всі мають однаковий паритет 48,49,50,...,57, так що, якщо він використовує значення ASCII, ми все одно отримаємо той самий результат.

Цей масив залишається на конвеєрі, а вихід неявний.


З цікавості, чому вам довелося використовувати подвійні лапки та додаткові, $коли ви робили модуль %2до числа? Я сам спробував це, і це було не потрібно, якщо я робив кожен крок індивідуально, але це коли ви поміщаєте його в масив? Чи розглядає повноваження це як інший тип змінної?
Синусоїд

@Sinusoid Він приймає введення як рядок, тому коли $n[0]індексується, він виходить як a char. Кидок від charдо intзаставлено %оператору , не йде від '1'до 1, але в ASCII - значення, так що 49. Натомість "$( )"виконує чіткий перехід на рядок, який належним чином перетворює його в 1. ... Хоча, тепер, коли ви згадуєте, то співвідношення в 0..9такій же , як ASCII 48..57, так що я можу , ймовірно , гольф , що вниз. Спасибі!
AdmBorkBork

@Sinusoid 15 байтів збережено, дякую!
AdmBorkBork

3

VBA, 117 99 байт

Збережено 18 байт завдяки Титу

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 байта геть з реверсування Tricky # 2: r=r+(left(s,1)-b &1); зберегти більше з печаткою безпосередньо: Debug.Print r+(left(s,1)-b &1). Тоді має бути 95 байт; 98, якщо &1не працює.
Тит

@Titus Дякую! Насправді я взагалі не був знайомий з бітовими операціями. VBA має бітові операції, але вони використовуються Andзамість просто &. Я придумав, як реалізувати вашу першу пропозицію, але не зміг зрозуміти, як ви мали намір змінити 3-й рядок StrReverse.
Інженер Тост

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 для паліндромів, 1/0 для Tricky # 2
Titus

Ох , і ви повинні бути в змозі замінити Mid()з Left(s,Len(s)/2+1)або близько того .
Тит

1
@Titus Тому що VBA дурний і не завжди складається з 0,5. Для цього використовується логіка круглої форми . Якщо рядок довжиною 9 символів, то Len(s)/2= до 4.5якого VBA буде округлювати 4. Якщо довжина 7 символів, то Len(s)/2= до 3.5якої VBA також буде округлювати 4. Додавання 0.1виправляє лунатизм.
Інженер Тост

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для хибних-хибних; 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 False, 2для False True та 3False False.

Функція #перетворює обидва знакових символів у їхні коди символів ascii та підсумовує їх. Якщо обидва парні або обидва непарні, сума буде парною, інакше якщо одна парна, а інша непарна, сума буде непарною. Обчисливши по модулю два, #коефіцієнт повернення 0для рівного паритету та 1іншим чином. fперевіряє, чи є вхідний рядок xпаліндром. Якщо ні, то #викликається з, xі останній символ з xдвох додається до результату, інакше якщо xпаліндромний виклик #із середнім символом xзамість цього і залиште результат таким, як є.


1

Котлін , 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 0або1 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 TRUEfor False True, TRUE FALSEfor True False та 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 () може бути замінений на деякий час (), але при цьому жодні байти не будуть збережені :(
Роберт Бенсон

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 байт

Код скорочення:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.