Kod Golf: Naprzód sdrawkcaB sdrawkcaB Naprzód Naprzód sdrawkcaB

14

Zadanie

  • Użytkownik wprowadza zdanie - tylko słowa. Wszelkie dane inne niż litery lub spacje, w tym liczby całkowite i znaki interpunkcyjne, powinny zgłaszać wyjątek: „W zdaniu można używać tylko liter”.
  • Dane wyjściowe mają wzorzec, w którym niektóre słowa są odwrócone, a inne słowa są normalne.
  • Wzór zaczyna się jako normalne słowo, następne dwa słowa są odwrócone, następnie następne dwa słowa są normalne i wzór jest kontynuowany.
  • Przykład, w którym słowa powinny być normalne, a gdzie słowa odwrócone, znajduje się poniżej:

Normalny - Cofnięty - Cofnięty - Normalny - Normalny - Cofnięty - Cofnięty - Normalny ...

Przykład wprowadzania

Sprzedaje muszelki na brzegu morza

Przykład wyjścia

Oblewa pociski na brzeg

Dodatkowe zasady

  • Jeśli używane są wielkie litery, powinny pozostać na liście, na którym zostały pierwotnie wysłane.
  • Wszelkie spacje początkowo zaksięgowane na wejściu powinny zostać zredukowane do jednej spacji. Na przykład Programming Puzzles and Code Golfstaje sięProgramming selzzuP dna Code Golf

Najkrótszy kod wygrywa !!

Miłego kodowania ...

Belfield
źródło
8
Wiele języków programowania nie ma wyjątków.
Klamka
15
@nimi Ograniczenie wyzwania do niewielkiego podzbioru języków wydaje się zupełnie niepotrzebne z tak trywialnego powodu.
Klamka
10
To poza tym dobre wyzwanie jest zrujnowane przez regułę. Any input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".Oznacza to wykonanie zadania wtórnego całkowicie niezwiązanego z wyzwaniem polegającym na odwróceniu słów, wycięciu języków, które nie mają wyjątków, i wymaga zakodowania na stałe lub skompresowania długiego łańcucha, który zajmuje dużo liczba bajtów.
xnor
2
@Belfield Tak, widzę twoje powiązanie. Myślę, że nie możesz teraz nic zrobić. W przyszłości spróbuj opublikować w piaskownicy, aby uzyskać opinię przed opublikowaniem.
xnor 31.10.15
3
@Belfield dobre wyzwanie jest znacznie trudniejsze niż dobra odpowiedź. W każdym razie podobało mi się to, a następne będzie lepsze.
edc65

Odpowiedzi:

15

TeaScript , 55 bajtów 58 60 69 76 78 80 87 89

xO`a-z `?xl(#~-i&2?l:lv(),/ +/):Ld`SÀZn­ Û § «e Ò5s`

To jest bardzo krótkie, bardzo się z tego cieszę.

Ostatnie ~ 20 znaków może wydawać się bełkotem, ale jest to zakodowane w „Zdaniu należy używać tylko liter”. Wszystkie znaki mają kody znaków poniżej 256, więc każdy ma jeden bajt

Wyjaśnienie

xO`a-z `?  // If input contains only a-z and space...

   xl(#       // Loop through input 
      ~-i&2?  // If (index - 1 "unary and"ed with 2) isn't 0...
          :l,     // Leave alone
          lv()    // Otherwise, reverse string
       / +/ // Loops on spaces
   )

:Ld`SÀZn­ Û § «e Ò5s` // Otherwise... decompress and print  the error string
Downgoat
źródło
Dzięki za opublikowanie testu - bardzo miło. Każdy jest na tej samej łodzi, jeśli chodzi o błąd - brak gry w golfa na tej linii
Belfield
Dziwne, teraz działa w przeglądarce Firefox. Ale wcześniej korzystałem z Firefoksa.
Jakube,
Najlepsza jak dotąd odpowiedź!
Belfield,
Co? Pokonałeś Pytha ?! Z językiem opartym na JS?!? Jak to jest w ogóle możliwe?!?!
ETHprodukcje
2
@ETHproductions Zawsze możesz wygrać, dopóki Dennis nie konkuruje: p
Downgoat
4

Haskell, 141 bajtów

r=reverse
f x|all(`elem`(' ':['a'..'z']++['A'..'Z']))x=unwords$zipWith($)(cycle[id,r,r,id])$words x|1<2=error"Sentence must only use letters"

Prawie 2/3 kodu służy do sprawdzania błędów. Wydaje się, że jest to pierwsze prawdziwe wyzwanie.

Praca polega na unwords$zipWith($)(cycle[id,reverse,reverse,id])$words xtym, że dzieli dane wejściowe na listę słów, zamyka je cykliczną listą funkcji [id,reverse,reverse,id,id,reverse...]i łączy wynik spacjami z powrotem w pojedynczy ciąg znaków.

Dzięki @Christian Irwan za 2 bajty.

nimi
źródło
„Zdanie musi zawierać tylko litery użytkownika” można zmienić na „Zdanie musi używać wyłącznie liter” - mój błąd w błędzie!
Belfield
@Belfield: naprawiono
nimi
Dlaczego nie r=reverse?
Akangka
@ChristianIrwan: Dzięki! (We wczesnej wersji miałem funkcję pointfree bez nazwy, więc używałem dwa razy reversei r=reversemiałem tę samą długość z powodu braku f=. Nie sprawdzałem ponownie przy przejściu do trybu pointfree).
nimi
3

JavaScript (ES6) 122

f=s=>/[^a-z ]/i.test(s)?"Sentence must only use letters":s.split(/ +/).map((w,i)=>~-i&2?w:[...w].reverse().join``).join` `

alert(f(prompt('?','She sells Sea shells on the Sea shore')))

edc65
źródło
Kiedy na wejściu jest nowa linia, wyświetla błąd, z przykładu nie sądzę, że tak się powinno stać
Downgoat
1
@ Vɪʜᴀɴ to trudne, przykład dotyczy wielu spacji, ale wtedy nie ma wielu spacji - tylko 1 nowa linia. Wydaje mi się, że został on zniekształcony przez edytor SO. JEŚLI musimy zarządzać znakami nowej linii i inną ogólną przestrzenią, liczba bajtów wzrasta o 2
edc65
2

Siatkówka , 103 bajty

\s+

(?<=^\S+ (\S+ )?((\S+ ){4})*)
;
+`(;\S*)(\S)
$2$1
;

i`.*[^a-z ].*
Sentence must only use letters

W drugim wierszu powinna znajdować się pojedyncza spacja, którą SE wydaje się przełykać. Uruchom kod z jednego pliku za pomocą-s flagą.

W siatkówce nie ma pojęcia wyjątków, więc wynik jest po prostu zastępowany przez, Sentence must only use lettersjeśli na wejściu znajdują się nieliterowe znaki niebiałe.

Martin Ender
źródło
2

Python, 163 160 157 145

k=raw_input()
k=["Sentence tsum ylno use letters",k][k.replace(' ','').isalpha()]
for i,x in enumerate(k.split()):print x[::-1if(i+1)/2%2else 1],

Usunięto 15 postaci, dzięki Mego !!

Łoś
źródło
Tak, obawiam się, że ma rację ...
Belfield
Strzelaj, tęskniłem za tym. Poprawię to.
Łoś
@Mego, re.search zwraca None (którego nie można użyć jako indeksu), jeśli wynik nie zostanie znaleziony, a dodanie „! = None” jest w rzeczywistości o jeden bajt dłuższe niż moja oryginalna metoda. Zaoszczędziłem 3 bajty, łącząc dwa ostatnie wiersze. Dzięki!
Łoś
1

Bash + coreutils, 108

[ ${@//[a-zA-Z]/} ]&&echo Sentence must only use letters||for t;{
((++i/2%2))&&rev<<<$t||echo $t
}|tr \\n \ 

Ostatnim znakiem tego programu jest spacja.

Dane pobierane są z wiersza poleceń:

$ ./norrevvevnor.sh Programming Puzzles and Code$'\n' Golf
Programming selzzuP dna Code Golf $ 
$ ./norrevvevnor.sh Programming Puzzles and Code$'\n' Golf1
Sentence must only use letters
$ 
Cyfrowa trauma
źródło
1

Pyth, 72

=zflTc?:z"[^A-Za-z ]"0"Sentence tsum ylno use letters"zdjd.e?%/hk2 2_bbz

Nie przebija drugiej odpowiedzi Pytha, ale już zainwestowałem czas w jej napisanie. Jest to w zasadzie tłumaczenie mojej odpowiedzi w języku Python .

Wypróbuj online

Łoś
źródło
1

Julia, 109 bajtów

s->(i=0;join([isalpha(w)?(i+=1)%4>1?reverse(w):w:error("Sentence must only use letters")for w=split(s)]," "))

i=0i (i+=1)%4>1służą do decydowania, czy każde słowo otrzyma reversed, czy nie. isalphastosuje się do słów po podzieleniu za pomocą, split(s)aby ustalić, czy istnieją znaki, które nie są literami (spacje zostały już usunięte w tym punkcie). joinprzywraca ciąg po manipulacji, chyba że errorzostanie wyrzucony.

Glen O
źródło
1

Julia, 150 134 bajtów

s->ismatch(r"[^a-z ]"i,s)?error("Sentence must only use letters"):(i=3;join([(i+=1;isodd((i+1)i÷2)?reverse(w):w)for w=split(s)]," "))

Nie golfowany:

function f(s::AbstractString)
    if ismatch(r"[^a-z ]"i, s)
        error("Sentence must only use letters")
    else
        i = 3
        a = [(i += 3; isodd((i + 1)i ÷ 2) ? reverse(w) : w) for w = split(s)]
        return join(a, " ")
    end
end

Oszczędność 16 bajtów dzięki Glen O!

Alex A.
źródło
Przede wszystkim, czy mógłbym zasugerować odwrócenie logiki początkowej warunkowej i przypisanie rjej jako wyniku? Oznacza to, że r=ismatch(...)||error(...)- zgoli kilka znaków i odwróci używane warunki warunkowe r. Skomentuje ponownie, jak podejrzewam, kilkoma dodatkowymi oszczędnościami
Glen O
Drobna korekta - musiałem ||sobie poradzić z negacją, a potem zdałem sobie sprawę, że negacja nie jest konieczna. Odwróć to z powrotem do &&. A nawet lepiej, użyj ?:zamiast tego, aby zrobić to jeszcze lepiej. s->(r=ismatch(r"[^a-z ]"i,s))?error("Sentence must only use letters"):join([(iseven(i)&&(r=!r);r?reverse(w):w)for(i,w)=enumerate(split(s))]," ")dla 144 bajtów. I myślę, że mogę sobie poradzić lepiej join...
Glen O
Oto usprawniona wersja twojego rozwiązania, z 134 bajtami:s->ismatch(r"[^a-z ]"i,s)?error("Sentence must only use letters"):(i=3;join([(i+=1;isodd((i+1)i÷2)?reverse(w):w)for w=split(s)]," "))
Glen O
@GlenO Niesamowite sugestie, dzięki!
Alex A.,
0

Pyth, 55 bajtów

?--rz0Gd"Sentence must only use letters"jd.e_W%%k4 3bcz

Pożyczył %%k4 3nieco od Pietu1998. Zapisano jeden dodatkowy bajt.

Wypróbuj online: Demonstracja lub pakiet testowy

Wyjaśnienie

?--rz0Gd"..."jd.e_W%%k4 3bcz   implicit: z = input string
   rz0                         convert z to lower-case
  -   G                        remove all letters
 -     d                       remove all spaces
?                              if there is some chars left than
        "..."                    print the string "Sentence must only ..."
                               else:
                          cz     split z by spaces or multiple spaces
               .e                map each pair (k index, b string) of ^ to: 
                 _       b          b or reversed of b, depending on
                  W%%k4 3           (k mod 4) mod 3
             jd                  join the result by spaces
Jakube
źródło
0

Perl 5 -ap , 80 bajtów

map$_=++$i%4>1?reverse:$_,@F;$_=/[^a-z ]/i?"Sentence must use only letters":"@F"

Wypróbuj online!

Xcali
źródło
0

Java, 215 bajtów

Regex jest fajny

s->{if(s.split("[^a-zA-Z ]").length>1)throw new Error("Sentence must only contains letters");else{int i=1;for(String a:s.split(" "))System.out.print((i++%2<1?new StringBuffer(a).reverse():a)+(a.isEmpty()?"":" "));}}

Wypróbuj online!

Benjamin Urquhart
źródło
Twoje dane wyjściowe są obecnie nieprawidłowe. Teraz wyprowadzasz wyjście She slles aeS shells no the aeS shore, ale powinno być She slles aeS shells on eht aeS shorezamiast tego (najpierw normalne; następnie naprzemiennie w parach 2 odwróconych lub nie). Powodują to dwa problemy. Teraz zwiększasz, inawet jeśli przedmiot jest pusty i i++%2<1powinien być i++%4>1zamiast tego. Tutaj naprawiona wersja 211 bajtów .
Kevin Cruijssen
@KevinCruijssen to właśnie dostaję za to, że nie czytam wystarczająco uważnie
Benjamin Urquhart
0

Galaretka , 39 bajtów

³Ḳ¹ƇUJ2&TƲ¦K
“*[,ṛDṾȧƤ°Ġṛ©¦»
ØẠ” ṭ³eƇ⁼£

Wypróbuj online!

Dzięki Erikowi Outgolfer. Uratował mnie od kilku dodatkowych bajtów i od wielu godzin frustracji.

Oto 46 bajtowe rozwiązanie

W rzeczywistości generuje błąd składni Pythona, gdy dane wejściowe zawierają nieprawidłowe znaki.

³Ḳ¹ƇUJ2&TƲ¦K
“çỤḷṁŀDṀẠṠGmḟĖƲƑ⁽Ḳḟ»ŒV
ØẠ” ṭ³eƇ⁼£

Wypróbuj online!

Zylviij
źródło
0

Japt v2.0a0 -S, 41 bajtów

¸¬è\L ?`SÀZn­ Û § «e Ò5s`:UeS²S ¸ËzEc2

Spróbuj

¸¬è\L ?`...`:UeS²S ¸ËzEc2     :Implicit input of string U
¸                             :Split on spaces
 ¬                            :Join
  è                           :Count occurrences of
   \L                         :RegEx /[^A-Z]/gi
      ?`...`:                 :If truthy return the compressed string "Sentence must only use letters", else
             Ue               :Recursively replace in U
               S²S            :  Two spaces with one
                   ¸          :Split on spaces
                    Ë         :Map each element at 0-based index E
                     z        :  Rotate clockwise by 90 degrees multiplied by
                      Ec2     :    E rounded up to the nearest multiple of 2
                              :Implicit output, joined with spaces
Kudłaty
źródło
0

05AB1E , 36 bajtów

ðKDáÊi“¸–ƒ—€É€Å™ê“.ªFë#áεN4%>2÷iR]ðý

Wypróbuj online.

Zgłasza następujący błąd, gdy dane wejściowe nie tylko zawierają [A-Za-z ]:

(RuntimeError) Nie można przekonwertować Zdania mogą używać tylko liter do liczb całkowitych.

Wyjaśnienie:

ðK                   # Remove all spaces from the (implicit) input-string
  Dá                 # Create a copy, and remove everything except for letters from this copy
    Êi               # If the copy with letters removed and the original are NOT equal:
      “¸–ƒ—€É€Å™ê“   #  Push dictionary string "sentence must only use letters"
                   #  With sentence capitalization
      F              #  And try to loop that many times, causing the error above
     ë               # Else:
      #              #  Split the (implicit) input-string on spaces
       á             #  Only keep letters (which will remove empty items caused by multiple
                     #  adjacent spaces in the input, which is shorter than `õK`)
        ε            #  Map each word to:
         N4%>2÷      #   Calculate ((index modulo-4) + 1) integer-divided by 2
                     #   (results in 0,1,1,2,0,1,1,2,0,1 for indices 0,1,2,3,4,5,6,7,8,9)
               i     #   If this is exactly 1:
                R    #    Reverse the current word
     ]               # Close the if-statement, map, and if-else statement
      ðý             # Join the modified word-list by spaces
                     # (and then output it implicitly as result)

Zobacz moją wskazówkę 05AB1E (rozdział Jak korzystać ze słownika? ), Aby zrozumieć, dlaczego tak “¸–ƒ—€É€Å™ê“jest "sentence must only use letters".

Kevin Cruijssen
źródło
0

PHP , 147 bajtów

foreach(explode(' ',$argn)as$a){if(!ctype_alpha($a))throw new Exception('Sentence must only use letters');$o.=(++$i%4>1?strrev($a):$a).' ';}echo$o;

Wypróbuj online!

Lub jeśli die()jest to dopuszczalne jako „wyjątek”:

PHP , 131 bajtów

foreach(explode(' ',$argn)as$a){if(!ctype_alpha($a))die('Sentence must only use letters');$o.=(++$i%4>1?strrev($a):$a).' ';}echo$o;

Wypróbuj online!

640 KB
źródło