Депалиндромизируйте эту строку!


48

Учитывая палиндром, сгенерированный в соответствии с этой задачей , депалиндромизируйте его.

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

abcdedcba -> abcde
johncenanecnhoj -> johncena
ppapapp -> ppap
codegolflogedoc -> codegolf

Поскольку речь идет о депалиндромизировании, ваш код не может быть палиндромом .

Помните, что это , поэтому выигрывает код с наименьшим количеством байтов.


23
-1 за бессмысленное ограничение вашего кода, не являющегося палиндромом. Это ничего не добавляет к сложным задачам IMO, это очень важно для очень немногих языков.
Rɪᴋᴇʀ

25
+1 за ограничение. Это так отражает вызов палиондрома ... и это добавляет вызов эзолангу. Мне это нравится. Я прав в предположении, что входные данные всегда будут иметь неравномерную длину?
Тит

42
Ограничение непалиндрома, вероятно, шутка, основанная на предыдущем вызове. Кто-нибудь действительно отрицал, основываясь на этом?
Луис Мендо

5
Это предотвращает однобайтовые решения. @diynevala +1 за ненужные +1.
Адам

5
Что, если строка не палиндром?
Xavon_Wrentaile

Ответы:




6

Python 2, 23 байта

Я не могу проверить на своем телефоне, но это должно работать:

lambda s:s[:-~len(s)/2]

2
Если вы работаете на Android, вы можете использовать QPython из магазина Google Play. Это лучшее, что я нашел :)
Yytsi

termux apt-get install python2
Мэтт

@Matt Это излишне, если все, что вам нужно, это Python.
mbomb007

@Matt, а также то, что если вы можете найти apt-getна своем телефоне, это, вероятно, не обычный телефон.
Законно Ленивый

@MathManiac termux устанавливается из Google Play на любой нерутованный телефон Android. Не может быть намного более нормальным, чем это.
Мэтт

6

Нечеткое окто гуакамоле, 4 байта

2.^/

Я потратил некоторое время на поиск языка, на котором этот вызов был коротким, и понял, что я тупой, и мой собственный язык сделал это.





4

JavaScript (ES6), 32 26 25 байт

1 байт сохранен благодаря Нейлу:

s=>s.slice(0,-s.length/2)


Предыдущие решения
26 байтов благодаря Downgoat:

s=>s.slice(0,s.length/2+1)

32 байта:

s=>s.slice(0,(l=s.length/2)+l%2)

1
Вы можете сократить только до s=>s.slice(0,s.length/2+1)Так как длина всегда будет нечетной
Downgoat

@ Downgoat, благодаря вам, я обнаружил, что еще один байт s=>s.slice(0,s.length/2+.5)будет работать и для четной длины.
Хеди

2
-s.length/2работает как для нечетных, так и для четных длин.
Нил

4

WinDbg, 87 71 байт

db$t0 L1;.for(r$t1=@$t0;@$p;r$t1=@$t1+1){db$t1 L1};da$t0 L(@$t1-@$t0)/2

-16 байт, не вставляя NULL, вместо этого передавая длину da

Ввод осуществляется через адрес в псевдо-регистре $t0. Например:

eza 2000000 "abcdedcba"       * Write string "abcdedcba" into memory at 0x02000000
r $t0 = 33554432              * Set $t0 = 0x02000000
* Edit: Something got messed up in my WinDB session, of course r $t0 = 2000000 should work
* not that crazy 33554432.

Он работает путем замены правого среднего символа (или правого среднего, если строка имеет четную длину) на ноль, а затем печатает строку с исходного начального адреса памяти.

db $t0 L1;                                   * Set $p = memory-at($t0)
.for (r $t1 = @$t0; @$p; r $t1 = @$t1 + 1)   * Set $t1 = $t0 and increment until $p == 0
{
    db $t1 L1                                * Set $p = memory-at($t1)
};
da $t0 L(@$t1-@$t0)/2                        * Print half the string

Выход:

0:000> eza 2000000 "abcdeedcba"
0:000> r $t0 = 33554432
0:000> db$t0 L1;.for(r$t1=@$t0;@$p;r$t1=@$t1+1){db$t1 L1};da$t0 L(@$t1-@$t0)/2
02000000  61                                               a
02000000  61                                               a
02000001  62                                               b
02000002  63                                               c
02000003  64                                               d
02000004  65                                               e
02000005  65                                               e
02000006  64                                               d
02000007  63                                               c
02000008  62                                               b
02000009  61                                               a
0200000a  00                                               .
02000000  "abcde"

3

Haskell, 27 байт

take=<<succ.(`div`2).length

Pointfree версия

\x->take(div(length x)2+1)x

что также составляет 27 байтов.


3

MATL , 7 6 байт

9LQ2/)

Попробуйте онлайн!

объяснение

9L       % Push array [1, 1j]
  Q      % Add 1: transforms into [2, 1+1j]
   2/    % Divide by 2: transforms into [1, 0.5+0.5j]
     )   % Apply as index into implicit input. The array [1, 0.5+0.5j] used as an index
         % is interpreted as [1:0.5+end*0.5]

1
Вау, это очень аккуратный способ обработки сложных значений в качестве аргументов для нарезки
мили

@ Майлз Спасибо! Да, это удобно. Мнимая единица работает как end, и двоеточия между элементами массива неявны
Луис Мендо



3

Брахилог , 4 байта

@2tr

Попробуйте онлайн!

объяснение

@2        Split in half
  t       Take the second half
   r      Reverse it

Если вход имеет нечетную длину, вторая половина, генерируемая с @2помощью, является самой длинной, то есть той, которую мы должны вернуть (после ее изменения).



3

Perl, 15 байт

Включает +2 для -lp

Введите строку ввода в STDIN:

depal.pl <<< "HelleH"

depal.pl:

#!/usr/bin/perl -lp
s/../chop/reg

Это -lдействительно не нужно, если вы вводите палиндром без заключительного перевода строки, но я включил его, чтобы быть справедливым по отношению к другим Perl-решениям, которые его используют.



2

TI-Basic, 14 байтов

Стандартная функция. Возвращает строку из индекса 1 в индекс (длина / 2 + 1/2).

sub(Ans,1,.5+.5length(Ans


2

PHP, 40 байт

<?=substr($a=$argv[1],0,1+strlen($a)/2);

strlen($a)/2получает приведение к int, с входом, всегда имеющим нечетную длину, +1достаточно округлить.

42 байта для любой длины:

<?=substr($a=$argv[1],0,(1+strlen($a))/2);

для неизвестной длины, (1+strlen)/2приводится к int, округляя вверх strlen/2.


Поскольку входные данные определены как поступающие из этого ( codegolf.stackexchange.com/questions/98325/… ) задания, его длина всегда будет нечетной, поэтому вы можете просто пойти с более коротким.
user59178

2

Провал, 8 байт

H{C'0ÏEI

Объяснение:

           # Implicit input
 H         # Push length of input
  {        # Add 1
   C       # Divide by 2
    '      # Convert to int
     0Ï    # Get string back
       E   # Push prefixes of string
        I  # Push prefixes[a]
           # Implicit print

Это может быть значительно улучшено.


2

Perl, 23 + 2 ( -plфлаг) = 28 25 байт

perl -ple '$_=substr$_,0,1+y///c/2'

Ungolfed:

while (<>) {             # -p flag
    chomp($_)            # -l flag
    $_ = substr($_, 0, 1 + length($_) / 2);
    print($_, "\n")      # -pl flag
}

Спасибо @ardnew.


1
Вы можете сохранить 3 символа, заменив length()наy|||c
ardnew

2

Befunge , 24 22 байта

~:0`!#v_\1+
0:-2,\_@#`

Попробуйте онлайн!


Befunge не имеет типа строки или массива, поэтому все выполняется в стеке по одному символу за раз. Первый цикл (в верхней строке) подсчитывает количество прочитанных символов (при замене менее чем на 2 элемента в стеке получается начальный 0). Вторая (в средней строке) печатает символы, а обратный отсчет идет в два раза быстрее. В результате печатается только последняя половина ввода, но LIFO, поэтому он находится в правильном порядке.

Спасибо Брайану Градину за лучшую версию первого цикла.


1
Вы победили меня на полчаса и 7 байтов :) befunge.tryitonline.net/…
Брайан Градин

@BrianGradin, хорошо. теперь я побил тебя на 9 байтов;)
Линус

Ах хорошо. Я вижу, что ты сделал. Мне не приходило в голову рассчитывать на два, а не вычислять фактическое количество символов для печати. Красиво сделано.
Брайан Градин

2

Perl, 14 + 3 ( -lFфлаг) = 19 17 байт

Для 5.20.0+:

perl -lF -E 'say@F[0..@F/2]'

Для 5.10.0+ (19 байт):

perl -nlaF -E 'say@F[0..@F/2]'

Ungolfed:

while (<>) {             # -n flag (implicitly sets by -F in 5.20.0+)
    chomp($_)            # -l flag
    @F = split('', $_);  # -aF flag (implicitly sets by -F in 5.20.0+)
    say(@F[0 .. (scalar(@F) / 2)]);
}

Спасибо @simbabque.


2
Вы можете сохранить два байта, вам не нужно устанавливать -nи -aпотому -Fделает это неявно.
simbabque

@simbabque Да. Но только для 5.20.0+.
Денис Ибаев

2

Brainfuck, 20 байтов

,
[
  [>,]
  <[<]
  >.,>[>]
  <<
]

Попробуйте онлайн.

Это экономит байт по сравнению с более простым подходом потребления входных данных перед началом основного цикла:

,[>,]
<
[
  [<]
  >.,>[>]
  <,<
]

2

Pyth , 8 7 байтов

<zh/lz2

Сохранено 1 с помощью @Steven H

Не самый короткий ответ Pyth (наполовину), но я прилагаю усилия, чтобы выучить язык, и это мой первый пост, использующий его. Размещено столько же комментариев и отзывов, сколько угодно. Это также первая программа Pyth, которую я действительно получил на работу :)

Теперь мне просто нужно разобраться, как работает 4-байтный ответ @Maltysen :-)


1
Если вы все еще хотите знать, как работает ответ Maltysen, он разбивает cввод Qна 2части и берет первый фрагмент, используя h(который, благодаря реализации chop, также захватит центральную букву). Что касается вашего кода, вы можете заменить +1с h, встроенным для приращения числа.
Стивен Х.

Спасибо за объяснение и за hподсказку @Steven H. Есть так много встроенных модулей, я думаю, что это займет некоторое время, чтобы найти их все :)
ElPedro

1
Нет проблем! Если вам когда-нибудь понадобится помощь, попробуйте пинговать меня в девятнадцатом байте.
Стивен Х.


2

C, 31 30 байт

Сохранение 1 байта благодаря Cyoce.

f(char*c){c[-~strlen(c)/2]=0;}

Использование:

main(){
 char a[]="hellolleh";
 f(a);
 printf("%s\n",a);
}

@KevinCruijssen исправлено
Карл Напф

Привет, извините, я удалил свой комментарий. Я был прав, говоря, что это не будет работать даже для палиндромов. Но, поскольку это обратный вызов этой другой задачи, не будет никаких тестов даже для палиндромов. Извините, вы можете отменить изменения. +1 от меня. :)
Кевин Круйссен

2
Ну, теперь он имеет ту же длину, работает на четные + нечетные и выглядит лучше. Я в порядке с этим.
Карл Напф

Это, возможно, утечка памяти :-)
ShreevatsaR

1
Я думаю, что вы можете удалить пространство вchar* c
Cyoce


1

MATLAB / Octave, 20 19 18 16 байт

1 байт заимствует идею из ответа Истерли Ирка (добавьте 1вместо .5)
2 байта благодаря @StewieGriffin (ненужные скобки)

@(x)x(1:end/2+1)

Попробуйте это в Ideone .


@ StewieGriffin Спасибо! Я не знаю, о чем я думал ...
Луис Мендо

Я тоже: P Это не похоже на «трюк», о котором вы не знали ... У меня тоже было несколько таких :)
Stewie Griffin
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.