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.

Oliver Ni
źródło
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:

14

Julia, 21 15 bajtów

x->x[1:end/2+1]

Wypróbuj online! (dodatkowy kod służy do wydruku)

Rɪᴋᴇʀ
źródło
2
end/2jest fajna funkcja
Downgoat
@Downgoat tak, dennis pokazał mi to.
Rɪᴋᴇʀ
6

Python 2, 23 bajty

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

lambda s:s[:-~len(s)/2]
Kade
źródło
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ł.

Rɪᴋᴇʀ
źródło
5

05AB1E, 5 bajtów

Dg;î£

Wypróbuj online!

Wyjaśnienie:

D      Duplicate
 g;î   Divide length by two and round up
    £  First b letters of a
acrolith
źródło
5

Cheddar, 22 18 bajtów

@.head($0.len/2+1)

Tak proste, że nie potrzebuję wyjaśnień, ale dodam jedno, jeśli chcesz.

Wypróbuj online

Downgoat
źródło
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)
Hedi
źródło
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"
mleko
źródło
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.

nimi
źródło
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]
Luis Mendo
źródło
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

Galaretka , 4 bajty

œs2Ḣ

Wypróbuj online!

Wyjaśnienie

œs2      Split input into 2 chunks of similar lengths. For odd-length input,
         the first chunk is the longest
   Ḣ     Keep the first chunk
Luis Mendo
źródło
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).

Fatalizować
źródło
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ą.

Ton Hospel
źródło
3

Java 7, 57 bajtów

String c(String s){return s.substring(0,s.length()/2+1);}
Numberknot
źródło
Brakuje zamknięcia }(czyli 57 bajtów).
Kevin Cruijssen
1
@KevinCruijssen naprawiony.
Numberknot
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
Timtech
źródło
2

GameMaker Language, 59 bajtów

a=argument0 return string_copy(a,1,ceil(string_length(a)/2)
Timtech
źródło
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.

Tytus
źródło
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ć.

Oliver Ni
źródło
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.

Denis Ibaev
źródło
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.

Linus
źródło
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.

Denis Ibaev
źródło
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:

,[>,]
<
[
  [<]
  >.,>[>]
  <,<
]
Mitch Schwartz
źródło
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 :-)

ElPedro
źródło
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

Właściwie 5 bajtów

l½KßH

Wypróbuj online!

-1 bajt dzięki Sherlock9

Wyjaśnienie:

l½K@H
l½K    ceil(len(input)/2)
   ßH  first (len(input)//2 + 1) characters of input
Mego
źródło
6 bajtów:: ;l½K@HD
Sherlock9
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);
}
Karl Napf
źródło
@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

Python 2, 23 bajty

lambda x:x[:len(x)/2+1]
Rɪᴋᴇʀ
źródło
Myślę, że wymaga to Python 2; powinieneś wskazać to w swojej odpowiedzi
Luis Mendo
@LuisMendo och, dzięki!
Rɪᴋᴇʀ
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 .

Luis Mendo
źródło
@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