Depalindromize ten ciąg!


48

Biorąc pod uwagę palindrom wygenerowany zgodnie z tym wyzwaniem , depalindromize go.

Przypadki testowe

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

Ponieważ chodzi o depalindromizację, twój kod nie może być palindromem .

Pamiętaj, to jest , więc wygrywa kod z najmniejszą liczbą bajtów.


23
-1 za bezsensowne ograniczenie twojego kodu, który nie jest palindromem. Nie wnosi nic do wyzwania IMO, w bardzo niewielu językach miałoby to znaczenie.
Rɪᴋᴇʀ

25
+1 za ograniczenie. Odzwierciedla to wyzwanie paliondrome ... i dodaje wyzwanie esolangom. Lubię to. Czy mam rację, zakładając, że dane wejściowe zawsze będą miały nierówną długość?
Titus

42
Ograniczenie inne niż palindrom jest prawdopodobnie żartem opartym na poprzednim wyzwaniu. Czy ktoś naprawdę głosował na tej podstawie?
Luis Mendo,

5
Zapobiega rozwiązaniom jednobajtowym. @diynevala +1 za niepotrzebne +1.
Adám

5
Co jeśli ciąg nie jest palindromem na początek?
Xavon_Wrentaile

Odpowiedzi:




6

Python 2, 23 bajty

Nie mogę przeprowadzić testu na telefonie, ale powinno to działać:

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

2
Jeśli używasz Androida, możesz użyć QPython ze sklepu Google Play. To najlepsze, jakie znalazłem :)
Yytsi

termux apt-get install python2
Matt

@Matt To przesada, jeśli wszystko, czego chcesz, to Python.
mbomb007

@Matt, a także to, że można znaleźć apt-getw telefonie, prawdopodobnie nie jest to normalny telefon.
Zgodny z prawem Leniwy

@MathManiac termux jest instalowany z Google Play na dowolnym nierootowanym telefonie z Androidem. Nie może być dużo bardziej normalny niż to.
Matt

6

Rozmyte Octo Guacamole, 4 bajty

2.^/

Spędziłem trochę czasu, szukając języka, w którym to wyzwanie jest krótkie, i zdałem sobie sprawę, że jestem głupi, a mój własny język to zrobił.





4

JavaScript (ES6), 32 26 25 bajtów

1 bajt zapisany dzięki Neilowi:

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


Poprzednie rozwiązania
26 bajtów dzięki Downgoat:

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

32 bajty:

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

1
Możesz skrócić do właśnie s=>s.slice(0,s.length/2+1)Ponieważ długość zawsze będzie nieparzysta
Downgoat

@Downgoat dzięki tobie odkryłem, że jeszcze jeden bajt s=>s.slice(0,s.length/2+.5)będzie działał na równą długość.
Hedi

2
-s.length/2działa zarówno na parzyste, jak i nieparzyste.
Neil,

4

WinDbg, 87 71 bajtów

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

-16 bajtów, nie wstawiając NULL, zamiast tego przekazując długość do da

Dane wejściowe są przekazywane przez adres w rejestrze psuedo $t0. Na przykład:

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.

Działa poprzez zamianę prawej środkowego znaku (lub prawej-środkowej, jeśli ciąg ma równą długość) na null, a następnie drukuje ciąg z oryginalnego początkowego adresu pamięci.

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

Wynik:

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 bajtów

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

Wersja Pointfree

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

który również ma 27 bajtów.


3

MATL , 7 6 bajtów

9LQ2/)

Wypróbuj online!

Wyjaśnienie

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
Wow, to bardzo fajny sposób na obsługę złożonych wartości jako argumentów dla krojenia
mile

@miles Thanks! Tak, jest przydatny. Wyimaginowana jednostka działa jako end, a dwukropki między elementami macierzy są niejawne
Luis Mendo



3

Brachylog , 4 bajty

@2tr

Wypróbuj online!

Wyjaśnienie

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

Jeśli dane wejściowe mają nieparzystą długość, druga połowa generowana przez @2jest tą najdłuższą, czyli tą, którą powinniśmy zwrócić (po odwróceniu).



3

Perl, 15 bajtów

Obejmuje +2 za -lp

Podaj ciąg wejściowy na STDIN:

depal.pl <<< "HelleH"

depal.pl:

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

Nie -ljest tak naprawdę potrzebne, jeśli wprowadzisz palindrom bez końcowej nowej linii, ale uwzględniłem go, aby był sprawiedliwy wobec innych rozwiązań perla, które go używają.



2

TI-Basic, 14 bajtów

Standardowa funkcja. Zwraca ciąg z indeksu 1 do indeksu (długość / 2 + 1/2).

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

2

GameMaker Language, 59 bajtów

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

2

PHP, 40 bajtów

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

strlen($a)/2zostaje rzutowane na int, przy czym dane wejściowe zawsze mają nieparzystą długość, +1wystarczy zaokrąglić w górę.

42 bajty dla dowolnej długości:

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

dla nieznanej długości (1+strlen)/2zostaje rzutowany na int, zaokrąglając w górę strlen/2.


Ponieważ dane wejściowe są zdefiniowane jako pochodzące z tego wyzwania ( codegolf.stackexchange.com/questions/98325/... ), jego długość zawsze będzie nieparzysta, więc możesz po prostu wybrać swój krótszy.
user59178,

2

Zanurz, 8 bajtów

H{C'0ÏEI

Wyjaśnienie:

           # 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

Prawdopodobnie można to znacznie poprawić.


2

Perl, 23 + 2 ( -plflaga) = 28 25 bajtów

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

Nie golfowany:

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

Dzięki za @ardnew.


1
można zapisać 3 znaki zastępując length()zy|||c
ardnew

2

Befunge , 24 22 bajtów

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

Wypróbuj online!


Befunge nie ma ciągów ani tablic, więc wszystko odbywa się na stosie po jednym znaku na raz. Pierwsza pętla (w górnym wierszu) liczy liczbę odczytanych znaków (zamiana z mniej niż 2 elementami w stosie daje początkowe 0). Drugi (w środkowej linii) drukuje znaki, odliczając dwa razy szybciej. W rezultacie drukowana jest tylko ostatnia połowa danych wejściowych, ale LIFO jest w prawidłowej kolejności.

Podziękowania dla Briana Gradina za lepszą wersję pierwszej pętli.


1
Pokonałeś mnie o pół godziny i 7 bajtów :) befunge.tryitonline.net/…
Brian Gradin

@BrianGradin, miło. teraz pokonałem cię o 9 bajtów;)
Linus

Ach, okej Widzę co zrobiłeś. Nie przyszło mi do głowy, aby odliczyć o dwa, zamiast obliczyć rzeczywistą liczbę znaków do wydrukowania. Ładnie wykonane.
Brian Gradin

2

Perl, 14 + 3 ( -lFflaga) = 19 17 bajtów

W wersji 5.20.0+:

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

Dla wersji 5.10.0+ (19 bajtów):

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

Nie golfowany:

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)]);
}

Dzięki za @simbabque.


2
Można zapisać dwa bajty, nie trzeba do zbioru -ni -adlatego -Fczyni to w sposób dorozumiany.
simbabque

@simbabque Tak. Ale tylko w wersji 5.20.0+.
Denis Ibaev,

2

Brainfuck, 20 bajtów

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

Wypróbuj online.

To oszczędza bajt dzięki prostszemu podejściu do pobierania danych wejściowych przed uruchomieniem głównej pętli:

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

2

Pyth , 8 7 bajtów

<zh/lz2

Zapisano 1 dzięki dzięki @Steven H.

Nie jest to najkrótsza odpowiedź Pytha (o połowę), ale staram się nauczyć języka i to mój pierwszy post, w którym go używam. Wysłano tyle samo komentarzy i opinii jak cokolwiek innego. To także pierwszy program w Pyth'u, który faktycznie mam pracować :)

Teraz muszę tylko dowiedzieć się, jak działa 4-bajtowa odpowiedź @Maltysen :-)


1
Jeśli nadal chcesz wiedzieć, jak działa odpowiedź Maltysena, cprzeskakuje ona Qna 2kawałki i bierze pierwszy kawałek za pomocą h(który dzięki implementacji chop również chwyta środkową literę). Co do kodu, można wymienić +1z hwbudowana w inkrementacji numerów.
Steven H.,

Dzięki za wyjaśnienie i hpodpowiedź @Steven H. Jest tak wiele wbudowanych, że chyba znalezienie ich wszystkich zajmuje trochę czasu :)
ElPedro,

1
Nie ma problemu! Jeśli kiedykolwiek potrzebujesz pomocy, spróbuj pingować mnie w dziewiętnastym bajcie.
Steven H.,


2

C, 31 30 bajtów

Oszczędność 1 bajtu dzięki Cyoce.

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

Stosowanie:

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

@KevinCruijssen naprawiony
Karl Napf

Cześć, przepraszam, że usunąłem swój komentarz. Miałem rację mówiąc, że to nie zadziała nawet dla palindromów. Ale ponieważ jest to odwrotność tego innego wyzwania, nie będzie żadnych przypadków testowych nawet dla palindromów .. Przepraszamy za to, że możesz cofnąć zmianę. +1 ode mnie :)
Kevin Cruijssen

2
Cóż, ma teraz tę samą długość, działa na parzyste + nieparzyste i wygląda bardziej golfowo. Nic mi nie jest.
Karl Napf,

Jest to prawdopodobnie wyciek pamięci :-)
ShreevatsaR

1
Myślę, że możesz usunąć to miejsce wchar* c
Cyoce


1

MATLAB / Octave, 20 19 18 16 bajtów

1 bajt poza pożyczaniem pomysłu z odpowiedzi Easterly Irk (dodaj 1zamiast .5)
2 bajty dzięki @StewieGriffin (niepotrzebne nawiasy)

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

Wypróbuj w Ideone .


@StewieGriffin Thanks! Nie wiem, o czym myślałem ...
Luis Mendo

Ja też nie: P To nie jest „sztuczka”, o której nie wiedziałeś… Miałem też kilka takich :)
Stewie Griffin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.