Никогда нечетный или четный

15

Вы заметили, что это палиндром?

Введите
неотрицательное целое число или строку, представляющую его

Выведите
4 возможных выхода, представляющих два свойства числа:

  • это палиндром
  • хитрый # 2

Хитрое свойство # 2
Если число не является палиндромом, это свойство отвечает на вопрос " Имеют ли одинаковые значения первая и последняя цифры?"
Если число равно палиндрому, это свойство отвечает на вопрос « Имеют ли одинаковые значения первая и средняя цифры?». Для четных длин средняя цифра является одной из двух центральных цифр.

Примеры

12345678 -> False False
Это не палиндром, первая и последняя цифры имеют разное соотношение

12345679 -> False True
Это не палиндром, первая и последняя цифры имеют одинаковое соотношение

12344321 -> True False
Это палиндром, первая цифра 1 и средняя цифра 4 имеют разное соотношение

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

PS
Вы должны решить тип и формат вывода. Это могут быть любые 4 различных значения. Просто упомяните это в своем ответе.

Мертвый Опоссум
источник
Непонятно, что означает «половина этого числа». Я думал, что это означает n / 2, но разъяснение, по-видимому, подразумевает, что это первая или последняя половина строки.
xnor
@xnor Струнно
Мертвый Опоссум
Я отредактировал, как мне кажется, более простой способ сформулировать правило.
xnor
@xnor Кажется, хорошо, спасибо!
Мертвый Опоссум
Можем ли мы предположить неотрицательный целочисленный ввод?
Тит

Ответы:

6

05AB1E, 15 , 14 13 байт (благодаря Riley и carusocomputing)

ÐRQi2ä¨}ȹRÈQ

Попробуй онлайн

Возвращает в скобках, если это палиндром

Возвращает с 0, если четность отличается, с 1, если он одинаков

Ð Добавьте вход, чтобы у меня было достаточно ввода для работы

R Обратный последний элемент стека

Q Посмотрите, если это то же самое (берет два верхних элемента и выполняет ==)

i Если утверждение, так проходит только тогда, когда это палиндром

2 Нажмите номер 2

ä Разделить вход на 2 равных среза

¨ Выдвиньте первый элемент разделения (1264621 приводит к 1264)

} Конец, если

È Проверьте, является ли последний элемент четным

¹ Нажмите первый вход снова

R Отменить этот вход

È Проверьте, если это даже сейчас

Q Проверьте, совпадают ли эти четные результаты и неявно выведите

П. Кнопс
источник
2
Вы поместите какое-нибудь объяснение своего кода?
Мертвый опоссум
Сделаю очень скоро
П. Knops
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)]
  • ... на целое число (<- младший бит <- последняя цифра)
Titus
источник
Вы можете сохранить один байт, используя <?=вместо 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
PurkkaKoodari
источник
Я всегда спрашиваю себя, сколько разных персонажей вам нужно выучить, чтобы писать программы с этим? Вы знаете весь смысл и всех персонажей? Можно ли даже вводить символы без использования клавиши ALT или таблицы символов? Как выглядит IDE для этого?
Даниэль В.
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указанием «не палиндром» и 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]результате charоператор a и оператор по модулю %объединяют chars на основе значения ASCII, а не литерального значения, тогда как a stringделает литеральное значение. Однако @Sinusoid помог мне увидеть, что все 0,1,2,...,9литеральные значения имеют одинаковую четность 48,49,50,...,57, поэтому, если он использует значение ASCII, мы все равно получим тот же результат.

Этот массив остается в конвейере, а вывод неявным.

AdmBorkBork
источник
Из любопытства, почему вам пришлось использовать двойные кавычки и дополнительные, $когда вы делали модуль %2на число? Я попробовал это сам, и не было необходимости, если я делал каждый шаг по отдельности, но это когда вы помещаете его в массив? PowerShell рассматривает его как другой тип переменной?
Синусоида
@Sinusoid Он принимает входные данные в виде строки, поэтому при $n[0]индексировании он выглядит как char. Бросок от charк intзаставлено %оператору не переходит от '1'к 1, но в ASCII - значение, так что это 49. "$( )"Делает явное приведение строки вместо этого, который правильно преобразует его 1. ... Хотя, теперь, когда вы упоминаете, то соотношение в 0..9такой же , как ASCII 48..57, так что я могу , вероятно , гольф , что вниз. Благодарность!
AdmBorkBork
@ Синусоида 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не работает.
Тит
@ Титус Спасибо! Я вообще не был знаком с побитовыми операциями. 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)

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
}
Брэд Гилберт b2gills
источник
3

Ява 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 и3 для False False.

Функция #преобразует оба цифровых символа в их коды символов ascii и суммирует их. Если оба четны или оба нечетны, сумма будет четной, в противном случае, если один четный, а другой нечетный, сумма будет нечетной. Расчет по модулю два, #возвращает 0для равного паритета и в 1противном случае. fпроверяет, является ли входная строка xпалиндромом. Если нет, то #вызывается с, xи последний результат xи два добавляется к результату, в противном случае, если xэто палиндромный вызов #со средним символом xвместо и оставить результат как есть.

Laikoni
источник
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
)
luminous_arbour
источник
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.

idrougge
источник
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)

Принимает ввод от стандартного ввода. Возвращает FALSE FALSEдля False False, FALSE TRUEдля False True, TRUE FALSEдля True False и TRUE TRUEдля True True.

rturnbull
источник
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 (), но при этом никакие байты не будут сохранены :(
Роберт Бенсон
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
Esolanging Fruit
источник
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
Джимвел Анобонг
источник