16

Условие

Палиндром - это слово, фраза или последовательность символов, которая читается одинаково как с начала, так и с конца (например, "ротор" или "мадам"). Вам нужно написать программу, которая определит, можно ли из заданной строки сделать палиндром путем перестановки ее символов.

Входные данные

Строка, состоящая из букв латинского алфавита (от a до z).

Выходные данные

Вывести строку 'YES', если можно переставить символы так, чтобы получить палиндром, и 'NO' в противном случае.

Контрольный пример

Вход: "aab"
Выход: "YES" (можно сделать "aba")

Вход: "abc" Выход: "NO"

Вход: "racecar" Выход: "YES" (это уже палиндром)

Вход: "aaa" Выход: "YES"

Критерий оценивания

Любой язык программирования.

В соревновании победит самое короткое по символам решение (пробелы и переносы - тоже символы).

Ответ победителя будет отмечен верным. Ответ автора вопроса не будет фигурировать при выборе победителя.

Срок соревнования - 7 дней, конец 10.10.2023 в 8:00 по МСК


P.S.

Просьба указывать язык в заголовке ответа и количество символов программы через запятую.

Таблица лидеров (код формы результатов взял отсюда)

execute("ru.stackoverflow.com", "1543735");
.cssload-container,.cssload-cube{width:97px;height:97px;transform-style:preserve-3d}.cssload-container,.cssload-cube,.cssload-half1,.cssload-half2{transform-style:preserve-3d}.cssload-container{position:relative;margin:23px 84px;perspective:292px}.cssload-cube{animation:cube 11.5s forwards infinite;transform-origin:center 49px}.cssload-half1,.cssload-s1{top:0;transform-origin:50% 100%}.cssload-half1{height:39px;position:absolute;animation:half-fold 11.5s forwards infinite}.cssload-side{width:19px;height:19px;background:#ddd;position:absolute}.cssload-s1{left:39px;animation:s1ani 11.5s forwards infinite}.cssload-s2,.cssload-s3,.cssload-s4{left:39px;transform-origin:50% 0}.cssload-s2{top:19px;animation:s2ani 11.5s forwards infinite}.cssload-s3{top:39px;animation:s3ani 11.5s forwards infinite}.cssload-s4{top:58px;animation:s4ani 11.5s forwards infinite}.cssload-s5{left:19px;top:19px;transform-origin:100% 50%;animation:s5ani 11.5s forwards infinite}.cssload-s6{left:58px;top:39px;transform-origin:0 50%;animation:s6ani 11.5s forwards infinite}@keyframes cube{0%,30%{transform:rotateX(0)}40%{transform:rotateX(45deg) rotateY(0) rotate(45deg)}60%{transform:rotateX(60deg) rotateY(0) rotate(45deg)}65%,70%{transform:rotateX(60deg) rotate(45deg) rotate(180deg)}75%,80%{transform:rotateX(60deg) rotate(45deg) rotate(1turn)}90%{transform:rotateX(0) rotate(0) rotate(0)}}@keyframes s1ani{0%{opacity:1;transform:translateY(0);background:#ddd}40%{transform:rotateX(0);background:#ddd}50%{transform:rotateX(-90deg);background:#ddd}90%{transform:rotateX(-90deg)}}@keyframes s2ani{0%{opacity:0;transform:rotateX(-179deg)}10%{opacity:1;transform:rotateX(0)}40%{background:#ddd}45%,80%{background:#b4b4b4}65%{opacity:1;background:#b4b4b4}90%{opacity:1}to{opacity:0}}@keyframes s3ani{0%,10%{opacity:0;transform:rotateX(-179deg)}20%,90%{opacity:1;transform:rotateX(0)}40%{background:#ddd}45%{background:#969696}to{opacity:0}}@keyframes s4ani{0%,20%{opacity:0;transform:rotateX(-179deg)}10%,to{opacity:0}30%{opacity:1;transform:rotateX(0)}40%{transform:rotateX(0);background:#ddd}50%{transform:rotateX(90deg);background:#b4b4b4}80%{background:#b4b4b4}90%{opacity:1;transform:rotateX(90deg)}}@keyframes s5ani{0%,10%{opacity:0;transform:rotateY(-179deg)}20%{opacity:1;background:#ddd;transform:rotateY(0)}40%{transform:rotateY(0)}50%{transform:rotateY(90deg)}55%{background:#ddd}60%{background:#c8c8c8}90%{transform:rotateY(90deg);opacity:1}to{opacity:0}}@keyframes s6ani{0%,20%{opacity:0;transform:rotateY(179deg)}30%{opacity:1;transform:rotateY(0)}40%{transform:rotateY(0)}50%{transform:rotateY(-90deg);background:#ddd}60%,80%{background:#c8c8c8}90%{opacity:1;transform:rotateY(-90deg)}to{opacity:0}}@keyframes half-fold{0%,50%{transform:rotateX(0)}60%,90%{transform:rotateX(-90deg)}}
<script src="https://mayorovp.github.io/codegolf/table-8c505e68f1349e4c69e7.js"></script>
<div class=cssload-container><div class=cssload-cube><div class=cssload-half1><div class="cssload-side cssload-s1"></div><div class="cssload-side cssload-s2"></div><div class="cssload-side cssload-s5"></div></div><div class=cssload-half2><div class="cssload-side cssload-s3"></div><div class="cssload-side cssload-s4"></div><div class="cssload-side cssload-s6"></div></div></div></div>

Результаты и объявление победителей:

В начале хочется выразить огромные благодарности всем участникам данного соревнования за боевой дух и креативность! Представленные решения вызывают восторг и восхищение.

Особая благодарность @Зонтик за вовлеченность в модерацию и редактуру ответов.

1 место: @Stanislav Volodarskiy, Ruby, 56 символов!

2 место: @Чёткая Четырка, Python, 57 символов!

3 место: @Алексей Р, Python, 63 символа!

Всем спасибо за участие!

Acinit
  • 2,325
  • 3
    количество символов минифицированной функции через запятую — так это должна быть функция или полная программа? Для С, например — со всеми #include или просто функция? Нет, я участвовать не собираюсь (раз уж общий счет для любого языка), но сама постановка... – Harry Oct 03 '23 at 06:08
  • @Harry исправил – Acinit Oct 03 '23 at 06:10
  • 2
    Python создать переменную, просто ее написать, в javaScript потребуется ключевое слово let(с учетом пробела +4 символа). Чтение ввода пользователя в js prompt, в c++(если не ошибаюсь) cin. Выовод в c++ cout, в python print, в js console.log... т.е. есть языки, которые по символам проигрывают заранее... названия методов это отдельная история. – SwaD Oct 03 '23 at 06:10
  • @SwaD Да, тоже думал о том, что это прям плохо, но в любом случае готов к критике и предложениям, при том, что основа "любого языка" должна остаться как есть – Acinit Oct 03 '23 at 06:13
  • @SwaD А в общем-то, если пользователь намерен победить, то он будет использовать язык в котором будет минимум по длине методов, в таком случае он будет привязан к определённым языкам. В другом случае сетоваю на тех, кто участвует не ради победы, а ради того, чтобы показать "как можно" и сделать это интересно, получив свои голоса и репутацию как бонус. Данное действие в принципе познавательный импакт имеет. – Acinit Oct 03 '23 at 06:39
  • 1
    является ли палиндромом пустая строка? – Grundy Oct 03 '23 at 13:12
  • А получение строки от пользователя + вывод на экран результата входит в количество символов? – Зонтик Oct 03 '23 at 15:27
  • 1
    @Grundy пустая строка не соответствует входным данным, так как не состоит из букв латинского алфавита (a до z), при этом одиночный символ - палиндром. – Acinit Oct 04 '23 at 03:59
  • @Зонтик входит. Предполагается, что программу можно запустить на языке как есть, следовательно, необходимо в том числе организовать все необходимые импорты/инклуды – Acinit Oct 04 '23 at 04:02
  • 1
    Раньше в таких соревнованиях требовалось написать ф-ю, остальная обвязка не считалась. Необходимость описания ввода-вывода сразу исключает всевозможные экзотические варианты типа sql (да, были и такие! https://ru.stackoverflow.com/a/675325/218063) и прочих – Андрей NOP Oct 04 '23 at 07:01
  • 1
    Считающим байты: не учитывайте перевод строки после последней строки. Его можно удалить из файла (head -c-1 temp.py > temp_.py), код продолжит нормально работать. – Stanislav Volodarskiy Oct 04 '23 at 07:38
  • @Зонтик о "победах" я писал выше в ответ на сообщение SwaD – Acinit Oct 04 '23 at 09:45
  • 1
    Что удивительно, больше десятка ответов, и только четыре плюса на вопросе. Это как? Соревнуемся, а автору вопроса никакой благодарности? – Stanislav Volodarskiy Oct 05 '23 at 10:22
  • @StanislavVolodarskiy да конкурс получился дебильным на самом деле, ответов было бы миллион, если бы я принял решение о том, что можно упаковать всё в функцию, но с следующим конкурсом поправлю моментов и сделаю увлекательней. Тем не менее я восхищаюсь большей части ответов здесь. – Acinit Oct 05 '23 at 10:40
  • 1
    @Acinit, конкурс, очевидно, получился! – Stanislav Volodarskiy Oct 05 '23 at 12:25
  • @StanislavVolodarskiy видимо народ смутил критерий оценки. Кстати, уже 10 плюсов :) – Зонтик Oct 05 '23 at 16:59
  • 1
    @Acinit а вот я тут подумал, и понял: конкурс хороший. Да, пайтон по любому ведёт, но я и так на победу не претендую. Зато сколько всего интересного: и сам решаешь задачки, и смотришь на другие решения, и узнаёшь про языки, про которые не знал... А ещё на конкурс пришёл бывший модератор с хешкода, который в последнее время редко публикует сообщения. Вряд ли такой участник пришёл бы на скучное :) – Зонтик Oct 06 '23 at 15:45
  • 1
    @Зонтик >Python по любому ведёт. Не сказал бы, по таблице выигрывает решение на Ruby (я в шоке) – Acinit Oct 07 '23 at 14:00
  • @Acinit ещё php может выиграть. Где-то уже был вариант (видимо удалили), но он был без ввода строки. А так было 47 символов. – Зонтик Oct 07 '23 at 14:18
  • @Acinit, а из каких символов кроме a-z состоит пустая строка? – Qwertiy Oct 10 '23 at 01:40
  • @SwaD, в js вполне можно создать переменную простым присваиванием. – Qwertiy Oct 10 '23 at 02:30
  • @Qwertiy никаких, она же пустая :) Пробелы и переносы не входят в диапазон от a до z – Acinit Oct 10 '23 at 04:04
  • 3
    Вопрос, делать еще соревнования, думаю, риторический :) – Acinit Oct 10 '23 at 05:49
  • 1
  • @Acinit, вот именно потому что она пустая - она соответствует условиям. – Qwertiy Oct 10 '23 at 15:24

34 Answers34

21

Python, 60

b=0
for c in input():b^=1<<ord(c)
print('YNEOS'[b&b-1>0::2])

Целая переменная b хранит чётность количества символов. Например для 'a' чётность хранится в девяносто седьмом бите, для 'z' в сто двадцать втором бите.

В конце проверяется что в b установлен только один бит. Выражение b & (b - 1) стирает младший бит числа. Если число обнулилось, этот бит был единственным.

Константы 'YES' и 'NO' смешаны в одну строку. Первая на чётных позициях, вторая на нечётных.

17

Ruby, 56

b=1024
gets.chars{|c|b^=1<<c.ord}
puts b&b-1>0?:NO: :YES

Целая переменная b хранит чётность количества символов. Например для 'a' чётность хранится в девяносто седьмом бите, для 'z' в сто двадцать втором бите.

Начальное значение 1024 нужно так как gets возвращает строку с переводом строки. Переводу строки соответствует десятый бит (1024). Он выставлен заранее, перевод строки в конце строки его снимает.

В конце проверяется что в b установлен только один бит. Выражение b & (b - 1) стирает младший бит числа. Если число обнулилось, этот бит был единственным.

15

Python, 57

Думал много дней, наконец додумался) Работает так же, как и многие (с проверкой количества одинаковых символов в строке на чётность)

a={0}
for i in input():a^={i}
print('YNEOS'[len(a)>2::2])


Подробный разбор кода:

  1. Первой строчкой мы создаём множество a

  2. Идём по всем символам строки:

    Если символ есть в множестве a, удаляем его оттуда, а если нет - добавляем

  3. Печатаем YES если количество элементов в множестве меньше или равно 1, иначе печатаем NO


Труднее всего понять последнюю строчку. Объясняю. Если длина массива равна 1, то есть два варианта:

  • В строке изначально был 1 символ;
  • Остался один непарный символ в строке, который можно поставить в середину и всё равно получится палиндром.

Оба этих варианта нам подходят, печатаем YES. А если в строке 0 символов - все были парными, то есть это тоже нам подходят, также печатаем YES.

P.S. СПАСИБО ОГРОМНОЕ ЗА СОКРАЩЕНИЕ КОДА @StanislavVolodarskiy. Этот код рулит среди питоновских только благодаря ему:)

12

Python, 63

Алгоритм - подсчет количества непарных символов

s=input()
print(("NO","YES")[sum(s.count(c)%2 for c in{*s})<2])
12

C, 66

b;main(c){while(c=getchar()-10)b^=1<<c-87;puts(b&b-1?"NO":"YES");}

Это полная программа, которую gcc temp.c превращает в работоспособный исполнимый модуль. При компиляции выдаётся шесть предупреждений, но ни одной ошибки.

Ниже тот же код, но не такой плотный.

Целая переменная b хранит чётность количества символов. Например для 'a' чётность хранится в нулевом бите, для 'z' в двадцать пятом бите.

В конце проверяется что в b установлен только один бит. Выражение b & (b - 1) стирает младший бит числа. Если число обнулилось, этот бит был единственным.

#include <stdio.h>

int main() { int b = 0; int c; while (c = getchar() - '\n') { b ^= 1 << (c - ('a' - '\n')); } puts((b & b - 1) ? "NO" : "YES"); }

11

C#, 70

  • Использую Linq, который в пустом проекте .NET 7 подключен по умолчанию, просто создайте проект с включенным Top-Level Statements
  • Группирую все буквы, и если количество групп с нечетным числом букв > 1, то это не палиндром.

Ввод передается аргументом запуска

Console.Write(args[0].GroupBy(x=>x).Sum(g=>g.Count()%2)>1?"NO":"YES");
aepot
  • 49,560
10

Python, 170

from collections import Counter
s = input()
counts = Counter(s)
odd_count = sum(1 for count in counts.values() if count % 2 != 0)
print("YES" if odd_count <= 1 else "NO")
Acinit
  • 2,325
  • 1
    Начну первым комментировать... https://ideone.com/RxlM9q – Harry Oct 03 '23 at 05:59
  • @Harry правильно подметили, правильность важна, в данном случае данный ответ не может быть принят и не будет фигурировать в выборе победителя, потому что он неправильный – Acinit Oct 03 '23 at 06:00
  • и в любом случае не будет, потому что автор ответа = автор вопроса, ы) – Acinit Oct 03 '23 at 06:07
  • 1
    @Harry а у нас вообше-то ideone недоступна... – чистов_n - за Россию Oct 03 '23 at 10:57
  • @чистов_n процитирую оттуда содержимое, там задан код из неправильного решения и примером ааа, где результат выдачи равен 'NO' – Acinit Oct 03 '23 at 11:16
  • 1
    @Acinit тогда кому недоступен ideone, вот ссылка на replit: https://replit.com/@nikola-chistov/acinitanswer#main.py – чистов_n - за Россию Oct 03 '23 at 11:22
  • @чистов_n ну хоть бы комментариев к реплиту добавил, а тож никто не поймёт, что нужно вводить aaa – Acinit Oct 03 '23 at 11:25
  • @чистов_n И что? У нас прошлой зимой бывало, было недоступно электричество, например — вас это сильно волновало? Вобщем, есть всякие vpn, прокси и иже с ними... – Harry Oct 03 '23 at 11:37
10

JavaScript, 66

JUST FOR FUN

Решаем задачу на регулярках :)

Изи, просто делаем скучную замену, 66 символов.
Спасибо @Cerbrus - сократил на 7 символов.

g=t=>[...t].sort().join``.replace(/(.)\1/g,'').length<2?'YES':'NO'

console.log(g('aab')) console.log(g('abc')) console.log(g('racecar')) console.log(g('aaa'))

Монорегулярка, это уже веселее, но 103 символа

Большое регулярное выражение, ищет символы, вошедшие нечётное количество раз:

alert([...prompt().matchAll(/(.)(?<!\1.+)(?=(((.(?<!\1))*\1){2})*(.(?<!\1))*$)/g)].length<2?"YES":"NO")
ReinRaus
  • 17,873
  • 3
  • 47
  • 86
8

Python, 92

Решение с Counter!

from collections import *
print(["NO","YES"][sum(i%2 for i in Counter(input()).values())<2])

UPD: Вот если надо ссылка на replit: https://replit.com/@nikola-chistov/myfisrtcodegolf#main.py

UPD2: Спасибо @Acinit за советы по укорочению.

8

Haskell, 62

Brute force: составляем все перестановки и проверяем есть ли среди них палиндром:

p(s)=if any(\x->reverse x==x)$permutations s then"YES"else"NO"

https://ideone.com/nV67QU

Haskell, 66

Чуть более длинный вариант, но без брутфорса, идея из соседних ответов:

r[]="YES";r(a)="NO";p(s)=r.tail.filter odd.map length.group$sort s

https://ideone.com/YeNNSO

  • брутфорс палиндрома, просто вау! – Acinit Oct 04 '23 at 04:09
  • А так можно? У меня штук 40 лишних символов в решении на F# из-за ввода-вывода. Можно не вводить, и не выводить, как здесь? – Mark Shevchenko Oct 04 '23 at 12:19
  • @MarkShevchenko нет, нельзя, подсчёт символов здесь неверный – Acinit Oct 04 '23 at 12:51
  • @MarkShevchenko, раньше в таких соревнованиях требовалось написать функцию только. Пусть будет вне конкурса, не проблема – Андрей NOP Oct 04 '23 at 17:48
8

JavaScript, 78

f=([a,b,...c])=>a?a==b?f(c):1+f([b,...c]):0;g=a=>f([...a].sort())>1?'NO':'YES'

Демонстрация еще одной идеи: рекурсивная ф-я f, которая

  • возвращает 0 для пустой строки (условие выхода из рекурсии)
  • делит строку на первые 2 символа a, b и оставшийся хвост с
    • если a = b, то возвращает f(c)
    • иначе 1+f([b,...c])

f=([a,b,...c])=>a?a==b?f(c):1+f([b,...c]):0;g=a=>f([...a].sort())>1?'NO':'YES'

console.log(g('aab')) console.log(g('abc')) console.log(g('racecar')) console.log(g('aaa'))

8

Oracle, 159 176

select decode(nvl(sum(1),1),1,'YES','NO')from(select''from(select''s from dual)connect by rownum<=length(s)group by substr(s,rownum,1)having mod(count(1),2)=1)

Вне конкурса, т. к. нет "стандартного ввода-вывода" ¯\_(ツ)_/¯

Реализована та же идея с подсчетом непарных символов:

select
  decode(
    nvl(sum(1), 1), -- 5. sum возвращает NULL если в подзапросе нет строк, поэтому меняем NULL на 1
    1, -- 6. здесь как раз обрабатываются случаи с одгним непарным символом и нулем (NULL заменили на 1 в п 5)
    'YES',
    'NO'
  )
from (
  select
    ''
  from (
    select 'racecar' s from dual -- 1. входная строка
  )
  connect by rownum <= length(s) -- 2. рекурсивный запрос для разворачивания строки посимвольно
  group by substr(s, rownum, 1) -- 3. группируем символы
  having mod(count(1), 2) = 1 -- 4. и берем только непарные
)

http://sqlfiddle.com/#!4/68b32/6869/0

6

Java, 149

interface G{static void main(String[]a)throws Exception{int b=0,c;for(;(c=System.in.read()-96)>0;)b^=1<<c;System.out.println((b&b-1)>0?"NO":"YES");}}

Ниже тот же код, но не такой плотный.

Целая переменная b хранит чётность количества символов. Например для 'a' чётность хранится в первом бите, для 'z' в двадцать шестом бите.

В конце проверяется что в b установлен только один бит. Выражение b & (b - 1) стирает младший бит числа. Если число обнулилось, этот бит был единственным.

interface G {
    static void main(String[] a) throws Exception {
        int b = 0;
        for (int c; (c = System.in.read() - 96) > 0; )
            b ^= 1 << c;
        System.out.println((b & b - 1) > 0 ? "NO" : "YES");
    }
}
6

RUST, 263

use std::io::{self, Read};fn main(){let mut input = String::new();io::stdin().read_to_string(&mut input).unwrap();let mut b = 0;for c in input.chars().filter(|&c| c != '\n') {b ^= 1 << (c as u8 - b'a');}if b & (b - 1) != 0 {println!("NO");}else{println!("YES");}}
use std::io::{self, Read};
fn main() {
    let mut input = String::new();
    io::stdin().read_to_string(&mut input).unwrap();
    let mut b = 0;
    for c in input.chars().filter(|&c| c != '\n') {
        b ^= 1 << (c as u8 - b'a');
    }
    if b & (b - 1) != 0 {
        println!("NO");
    } else {
        println!("YES");
    }
}
Зонтик
  • 2,262
  • 2
  • 11
  • 39
6

C, 623

понятно, что не будет лидером, но это забавно

#include <stdio.h>
int main(){int o_ed5791501b27396303ad4d84f62e05c3=(0x0000000000000000 + 0x0000000000000200 + 0x0000000000000800 - 0x0000000000000A00);int o_2502a808b536a16317ab10c437e81bc0;while ((o_2502a808b536a16317ab10c437e81bc0 = getchar()) != '\n'){o_ed5791501b27396303ad4d84f62e05c3 ^= (0x0000000000000002 + 0x0000000000000201 + 0x0000000000000801 - 0x0000000000000A03) << (o_2502a808b536a16317ab10c437e81bc0 - 'a');};puts((o_ed5791501b27396303ad4d84f62e05c3 & o_ed5791501b27396303ad4d84f62e05c3 - (0x0000000000000002 + 0x0000000000000201 + 0x0000000000000801 - 0x0000000000000A03)) ? "\x4E""O" : "\x59""E\123");};
Acinit
  • 2,325
6

RUBY, 110 90

b = 0
while (c = STDIN.getc) != "\n"
  b ^= 1 << (c.ord - 'a'.ord)
end
puts (b & (b - 1)).zero? ? "YES" : "NO"

upd 90

b=0
while(c=STDIN.getc)!="\n" 
  b^=1<<(c.ord-'a'.ord)
end
puts (b&(b-1)).zero?? "YES":"NO"
6

ADA, 383

with Ada.Text_IO;

procedure Main is b : Integer := 0; c : Character; begin loop Ada.Text_IO.Get(c); exit when c = Character'Val(Character'Pos('\n')); b := b xor (1 << (Character'Pos(c) - Character'Pos('a'))); end loop;

if (b and (b - 1)) /= 0 then Ada.Text_IO.Put_Line("NO"); else Ada.Text_IO.Put_Line("YES"); end if; end Main;

6

Perl, 77

my $b;while(my $c=ord(getc())-10){$b^=1<<($c-87);}print $b&($b-1)?"NO":"YES";
6

Lua, 82

s=io.read()repeat s,c=s:gsub('(.)(.-)%1','%2')until c<1 print(#s<2 and'YES'or'NO')

Удаляем (через regex) по 2 одинаковых символа пока удаляется, потом смотрим длину остатка.

ESkri
  • 1,072
5

F#, 141

printf (if System.Console.ReadLine()|>Seq.countBy id|>Seq.choose(snd>>fun c->if c%2=1 then Some c else None)|>Seq.length<2 then"yes"else"no")
  • 1
    Так как мы говорим о полноценной программе, добавьте в начало open System https://onecompiler.com/fsharp/3zpjeu6w5 – Acinit Oct 05 '23 at 07:05
  • 1
    @Acinit, я проверил, программа запускается в таком виде. open System не нужен, потому что доступ к Console у меня по полному пути System.Console. – Mark Shevchenko Oct 05 '23 at 14:31
5

C#, 250

string PalindromCheck(string inStr)
{
    int solo = 0;
    string ignoreList = "";
    foreach (char c in inStr)
    {
        if (ignoreList.Count(f => f == c) == 0 && inStr.Count(f => f == c) % 2 != 0)
            solo++;
        ignoreList += c;
        if (solo > 1)
            return "NO";
    }
    return "YES";                
}
Acinit
  • 2,325
Yuki
  • 483
  • функция Count принадлежит .net, следовательно должны быть соответствующие объявления, подсчёт символов неправильный – Acinit Oct 05 '23 at 07:02
  • А как же объявление класса? Или в c# можно программу без класса как-то запустить (но почему-то в хелловорде класс объявляется)? – Зонтик Oct 05 '23 at 08:12
  • Или в c# можно программу без класса - можно @Зонтик – Exploding Kitten Oct 05 '23 at 11:51
5

LISP, 249 330

(defun c ()
  (let ((s (read-line)))
    (let* ((counts (loop for c across s
                         count c into char-counts
                         maximize char-counts))
           (odd-count (count-if (lambda (count) (oddp count)) counts))
           (result (if (< odd-count 2) "YES" "NO")))
      (format t result))))

(c)

upd 249

(defun c ()
  (let* ((b 0)
         (c (read-char)))
    (loop while (not (char= c #\Newline)) do
      (setq b (logxor b (ash 1 (- (char-code c) (char-code #\a)))))
    (if (logand b (- b 1))
        (format t "NO")
        (format t "YES"))))
(c)
Acinit
  • 2,325
5

Rust, 174 176

fn main(){let mut s=String::new();let _=std::io::stdin().read_line(&mut s);let mut b=0u128;for c in s.chars(){b^=1<<(c as u32)}println!("{}",if b&(b-1)==0{"YES"}else{"NO"});}

Компилируется без варнингов. За основу взял код на C.

UPDATE: Нашёл два лишних пробела.

4

Java, 270

В моём ответе два решения.

Код в обоих один и тот же, просто в одном все переменные названы односимвольно и всё записано в 1 строку.

Идея в том, что в строке-палиндроме может быть только один неповторяющийся символ. А если в строке чётное количество символов, то вообще ни одного.

Собственно код:

  1. Нечитаемый, 270 символов.
interface I{static void main(String[]a){String s=new java.util.Scanner(System.in).next();int e=0;String r="YES";for(int i=0; i<s.length();i++){char c=s.charAt(i);if(!s.matches(".*"+c+".*"+c+".*")){++e;r=((e>1)||(e>0&&s.length()%2==0))?"NO":"YES";}}System.out.print(r);}}
  1. Читаемый, 585 символов.
interface I {
    static void main(String[] args){
        String string = new java.util.Scanner(System.in).next();
        int repeatCharacters = 0;
        String result = "YES";
        for(int i = 0; i < string.length(); i++){
            char currentCharakter = string.charAt(i);
            if(!string.matches(".*" + currentCharakter  + ".*" + currentCharakter  + ".*")){
                ++repeatCharacters;
                result = ((repeatCharacters > 1) || (repeatCharacters > 0 && string.length() % 2 == 0))? "NO" : "YES";
            } 
        }
        System.out.print(result);
    }
}

Вывод (добавил цикл while, чтобы одним запуском кода продемонстрировать все тесты):

скриншот вывода

Зонтик
  • 2,262
  • 2
  • 11
  • 39
4

Java, 177

interface I{static void main(String[]s){System.out.print(new java.util.Scanner(System.in).next().chars().sorted().reduce(0,(a,b)->(a&0xFF)==b?a>>8:(a<<8)|b)>>8==0?"YES":"NO");}}

Отформатированная версия

interface I {
    static void main(String[] s) {
        System.out.print(
            new java.util.Scanner(System.in)
            .next()
            .chars()
            .sorted()
            .reduce(0, (a, b) -> (a & 0xFF) == b ? a >> 8 : (a << 8) | b)
            >> 8 == 0 ? "YES" : "NO");
    }
}
Зонтик
  • 2,262
  • 2
  • 11
  • 39
  • Хорошее решение. А если ещё и вместо сканера использовать s, то длина получится почти такая же, как у решения на Java у Stanislav Volodarskiy. – Byb Oct 06 '23 at 21:27
  • @Byb Тут всё на сортированности списка построено, если вместо строки читать посимвольно, то работать не будет. – Alexander Pavlov Oct 06 '23 at 21:31
3

Java, 281

Не в погоне за минимизацией числа символов, но просто ещё не видел тут решения с использованием Java Stream API, поэтому решил написать своё.

import static java.util.stream.Collectors.*;

interface I { static void main(String[] a) { System.out.print( new java.util.Scanner(System.in).next().chars().boxed() .collect(groupingBy(c -> c, counting())) .values().stream().filter(v -> v % 2 != 0).count() > 1 ? "NO" : "YES" ); } }

Особенно интересно в сравнении с ответом от aepot: вроде я тут ничего лишнего в стримах не делал, но, как видно, с использованием C# LINQ данная задача решается заметно короче.

Byb
  • 2,318
  • Хм. На "aab" выводит "NO". – Зонтик Oct 06 '23 at 16:06
  • Точно? А у меня выводит "YES" – Byb Oct 06 '23 at 16:10
  • Извиняюсь, ошибка. Случайно место 'a' другую клавишу нажал. – Зонтик Oct 06 '23 at 16:12
  • Кстати, можно просто print использовать. Будет минимизация символов без извращений. – Зонтик Oct 06 '23 at 16:14
  • Но если записать код в одну строку, то вы можете претендовать на победу :) – Зонтик Oct 06 '23 at 16:15
  • Насчёт print - да, согласен, поправлю. Насчёт победы - это вряд ли, учитывая ответы по 60 символов) А в одну строку я не сделал просто чтобы читаемо было, да и это не сильно уменьшит число символов – Byb Oct 06 '23 at 16:20
  • 1
    Тут вот кстати интересной минимизацией оказался статический импорт методов класса Collectors. Если не импортировать статические методы, то в любом случае надо будет импортировать сам класс Collectors, а его методы вызывать через точку после имени класса. Или не импортировать, а писать полное имя, но это было бы проделано дважды. Так что в итоге статические импорт оба эти варианта побеждает. – Byb Oct 06 '23 at 16:24
  • Можно сделать 2 варианта: в одну строку и читаемый (и это всё в одном ответе). Про количество символов - очень сильно уменьшит. Ведь тут считается каждый пробел. А один отступ - 4 пробела... – Зонтик Oct 06 '23 at 16:25
3

Python, 67

tio.run

s=0
for c in input():s^=1<<int(c,36)
print('NO'if s&(s-1)else'YES')
Qwertiy
  • 123,725
2

VBscript, 267

В моём ответе два решения.

Код в обоих похожий. Различия такие:

  • В одном (в нечитаемом) все переменные названы односимвольно и всё записано в меньшее количество строк.
  • Во втором (читаемом) добавлена просьба ввести число, а не просто пустое диалоговое окно + добавлены иконки (для красоты).

Идея в том, что в строке-палиндроме может быть только один неповторяющийся символ. А если в строке чётное количество символов, то вообще ни одного.

Собственно код:

  1. Нечитаемый, 267 символов
s=inputbox(""):dim a():For i=1to len(s):redim preserve a(i):a(i)=right(left(s,i),1):next:For each c in a:r=0:for i=1to UBound(a)
if a(i)=c then:r=r+1:end if:next:if r=1 then
l=l+1
if(l>1)or((l>0)and(len(s)mod 2=0))then
msgbox"NO":WScript.Quit
end if
end if:next:msgbox"YES"
  1. Читаемый, 569 символов.
str = inputbox("Введите строку:")
dim array()

For i = 1 to len(str) redim preserve array(i) array(i) = right(left(str, i), 1) next

For each currentCharakter in array retreatCurrentCharakter = 0 for i = 1 to UBound(array) if array(i) = currentCharakter then retreatCurrentCharakter = retreatCurrentCharakter + 1 next

if retreatCurrentCharakter = 1 then 
    repeatCharacters = repeatCharacters + 1
    if(repeatCharacters &gt; 1) or ((repeatCharacters &gt; 0) and (len(str) mod 2 = 0)) then
        msgbox&quot;NO&quot;, 16 
        WScript.Quit
    end if
end if

next

msgbox"YES", 64

Запуск читаемого варианта (ибо он красивей: с просьбой ввода строки и с иконками в окнах):

вводим "aab" результат: "YES"

вводим "abc" результат: "NO"

вводим "aaa" результат: "YES"

P.S: если у вас ОС windows, то вы можете сами запустить скрипт у себя на компьютере. Для этого создайте файл с расширением .vbs, cкопируйте код (лучше читаемый) и щёлкните по файлику два раза.

Зонтик
  • 2,262
  • 2
  • 11
  • 39
2

Python, 113

import functools as f
print('YNEOS'[len(f.reduce(lambda a,b:a[:-1]if a[-1:]==b else a+b,sorted(input()),))>1::2])

Бладорность Станиславу за YNEOS хак!

2

Kotlin, 135

fun main(){print(if(readLine()!!.chars().sorted().reduce(0, {a,b->if(a and 0xFF==b)a.shr(8)else a.shl(8)+b}) shr 8==0)"YES" else "NO")}

Отформатированная версия

fun main() {
 print(
  if(readLine()!!.chars().sorted().reduce(0, {
    a,b->if(a and 0xFF==b)a.shr(8)else a.shl(8)+b
  }) shr 8==0) "YES" else "NO")
}

В Котлине нет привычных & | << >> для битовых операций (& и | там вообще булевские), поэтому приходится использовать and or + и shl/shr

Что интересно, в некоторых случаях инфиксная форма x shl y короче, чем x.shl(y), а в других наоборот: a.shr(8)else короче, чем (a shr 8)else

2

Javascript, 81

s=>eval(Object.values([...s].reduce((r,c)=>(r[c]^=1,r),{})).join`+`)<2?'YES':'NO'

Проверка:

f=s=>eval(Object.values([...s].reduce((r,c)=>(r[c]^=1,r),{})).join`+`)<2?'YES':'NO'

for (var s of ["aab", "abc", "racecar", "aaa"]) { console.log(s, f(s)) }

Qwertiy
  • 123,725
2

Javascript, 87

s=>s.replace(/(.)((?=.*\1)|(?<=^(((?!\1).)*\1((?!\1).)*\1)*))/g,'').length<2?'YES':'NO'

f=s=>s.replace(/(.)((?=.*\1)|(?<=^(((?!\1).)*\1((?!\1).)*\1)*))/g,'').length<2?'YES':'NO'

for (var s of ["aab", "abc", "racecar", "aaa", 'aaaa']) { console.log(s, f(s)) }

Qwertiy
  • 123,725
0

Python, 341

def can_be_palindrome(s):
    letter_count = {}
for letter in s:
    if letter in letter_count:
        letter_count[letter] += 1
    else:
        letter_count[letter] = 1

odd_count = 0
for count in letter_count.values():
    if count % 2 != 0:
        odd_count += 1

if odd_count &gt; 1:
    return &quot;NO&quot;
else:
    return &quot;YES&quot;

input_str = input("Введите строку: ").strip()

result = can_be_palindrome(input_str) print(result)

ReinRaus
  • 17,873
  • 3
  • 47
  • 86
-3

Assembly, 537

section .data
    msg db "Введите строку: ",0
    len equ $ - msg

section .bss input resb 255 is_palindrome_msg resb 1

section .text global _start

_start: mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, len int 0x80

mov eax, 3
mov ebx, 0
mov ecx, input
mov edx, 255
int 0x80

mov esi, input

mov edi, esi
add edi, eax
dec edi

mov byte [is_palindrome_msg], 1

check_palindrome: cmp byte [esi], byte [edi] jne not_palindrome

inc esi
dec edi

cmp esi, edi
jae is_palindrome

jmp check_palindrome

not_palindrome: mov byte [is_palindrome_msg], 0

is_palindrome: mov eax, 4 mov ebx, 1 mov ecx, is_palindrome_msg mov edx, 1 int 0x80

mov eax, 1
mov ebx, 0
int 0x80

Acinit
  • 2,325
  • Можете приложить пример работы в онлайн компиляторе? а то выдаёт main.asm:48: error: label 'is_palindrome' inconsistently redefined – Acinit Oct 06 '23 at 07:22
  • а теперь main.asm:34: error: invalid combination of opcode and operands – Acinit Oct 06 '23 at 07:29
  • mov cl, byte [is_palindrome_msg] ; Загрузить байт из is_palindrome_msg в cl – game oniu Oct 06 '23 at 07:32
  • 3
    @Acinit это почти наверняка ChatGPT писал, этот код никто не запускал, отсюда и ошибки. Мне бот выдал почти такой же код. Недаром автор не оставил ни инструкций для сборки, не подсказок как это проверить, просто запостил голый код и всё. – aepot Oct 06 '23 at 12:34
  • 6
    @aepot похоже на то, осуждаю такое участие – Acinit Oct 06 '23 at 12:35
  • @Acinit нахаляву пофармить плюсиков, почему бы и нет, кто-то же голосует за такие попытки. Соседний ответ на питоне из той же оперы, почти наверняка. – aepot Oct 06 '23 at 12:37
  • @aepot может тогда снести этот ответ? – Зонтик Oct 06 '23 at 16:10
  • @Зонтик формально я не могу ничего явно не нарушающее правила сносить, даже если очень хочется. – aepot Oct 06 '23 at 18:02
  • @aepot вроде же нарушает. В прошлый раз аналогичного юзера забанили на неделю, а пост в конкурсном вопросе снесли. – Зонтик Oct 07 '23 at 08:45