Депаліндромізуйте цей рядок!


48

Враховуючи паліндром, сформований відповідно до цього виклику , депаліндромізуйте його.

Тестові справи

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

Оскільки мова йде про депаліндромізацію, ваш код не може бути паліндром .

Пам'ятайте, що це , тому виграє код з найменшими байтами.


23
-1 за безглузде обмеження вашого коду, яке не є паліндром. Це нічого не додає до виклику ІМО, це мало б мало значення.
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

Вхід передається через адресу в psuedo-регістрі $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
Нічого собі, це дуже акуратний спосіб обробляти складні значення як аргументи для нарізки
милі

@miles Дякую! Так, це зручно. Уявна одиниця працює так end, і колони між елементами масиву неявні
Луїс Мендо





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

GameMaker Мова, 59 байт

a=argument0 return string_copy(a,1,ceil(string_length(a)/2)

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/… ) виклику, його довжина завжди буде непарною, тому ви можете просто піти зі своєю коротшою.
користувач59178

2

Dip, 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'

Безголівки:

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 не має типу рядка чи масиву, тому все робиться на стеці по одному символу за один раз. Перший цикл (у верхньому рядку) підраховує кількість прочитаних символів (заміна менш ніж двома елементами у стеку дає початкові 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]'

Безголівки:

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

Pyth , 8 7 байт

<zh/lz2

Збережено 1 завдяки @Steven H

Не найкоротша відповідь Pyth (на половину), але я докладаю зусиль, щоб вивчити мову, і це моє перше повідомлення, що використовує її. Опубліковано стільки, скільки коментарів та відгуків. Це також перша програма Pyth, над якою я працював :)

Тепер мені просто потрібно розібратися, як працює 4-байтна відповідь від @Maltysen :-)


1
Якщо ви все ще хочете дізнатись, як працює відповідь Мальтісена, він скаче cвведення Qна 2шматки і бере перший фрагмент, використовуючи h(який, завдяки здійсненню відбивання, також захопить центральну літеру). Що стосується вашого коду, ви можете замінити +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 виправлено
Karl Napf

Привіт, вибачте, що видалили свій коментар. Я мав рацію, сказавши, що це не спрацює навіть для паліндромів. Але оскільки це зворотне значення для іншого виклику, не буде жодних тестових випадків для навіть паліндромів. Вибачте за це, ви можете скасувати зміни. +1 від мене. :)
Кевін Круїссен

2
Ну, він має однакову довжину зараз, працює для навіть + непарних і виглядає гольфістом. Я з цим все гаразд.
Карл Напф

Це, мабуть, витік пам’яті :-)
ShreevatsaR

1
Я думаю, ви можете прибрати простір уchar* c
Cyoce


1

MATLAB / Октава, 20 19 18 16 байт

1 байт, запозичивши ідею з відповіді1.5 Easterly Irk ( додати замість )
2 байти від @StewieGriffin (непотрібні дужки)

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

Спробуйте це у Ideone .


@StewieGriffin Дякую! Я не знаю, що я думав ...
Луїс Мендо

Ні я: P Це не так, як це "фокус", про який ви не знали ... У мене теж було декілька таких :)
Стюі Гріффін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.