Code Golf: Vorwärts sdrawkcaB sdrawkcaB Vorwärts Vorwärts sdrawkcaB


14

Aufgabe

  • Der Benutzer gibt einen Satz ein - nur Wörter. Alle Eingaben außer Buchstaben oder Leerzeichen, einschließlich Ganzzahlen und Interpunktion, sollten eine Ausnahme auslösen: "Satz darf nur Buchstaben verwenden".
  • Die Ausgabe hat ein Muster, bei dem einige Wörter umgekehrt und andere Wörter normal sind.
  • Das Muster beginnt als normales Wort, die nächsten zwei Wörter werden umgekehrt, dann sind die nächsten zwei Wörter normal und das Muster wird fortgesetzt.
  • Ein Beispiel, wo die Wörter normal sein sollten und wo Wörter umgekehrt sind, ist unten:

Normal - Umgekehrt - Umgekehrt - Normal - Normal - Umgekehrt - Umgekehrt - Normal ...

Eingabebeispiel

Sie verkauft Muscheln an der Küste

Ausgabebeispiel

Sie schleudert Muscheln an der Küste

Zusätzliche Regeln

  • Wenn Großbuchstaben verwendet werden, sollten sie auf dem Brief bleiben, auf dem sie ursprünglich geschrieben wurden.
  • Mehrere Leerzeichen, die ursprünglich bei der Eingabe eingegeben wurden, sollten auf ein Leerzeichen reduziert werden. Zum Beispiel Programming Puzzles and Code GolfwirdProgramming selzzuP dna Code Golf

Kürzester Code gewinnt !!

Viel Spaß beim Codieren ...


8
Viele Programmiersprachen haben keine Ausnahmen.
Türklinke

15
@nimi Es scheint völlig unnötig, eine Herausforderung aus einem so trivialen Grund auf eine kleine Teilmenge von Sprachen zu beschränken.
Türklinke

10
Diese ansonsten gute Herausforderung wird durch die Regel zunichte gemacht. Any input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".Es bedeutet, eine sekundäre Aufgabe zu implementieren, die nichts mit der Umkehrung von Wörtern zu tun hat, Sprachen auszuschneiden, die keine Ausnahmen enthalten, und eine lange Zeichenfolge fest zu codieren oder zu komprimieren, die viel Zeit in Anspruch nimmt Byteanzahl.
Xnor

2
@Belfield Ja, ich sehe deine Bindung. Ich glaube, du kannst jetzt nichts mehr tun. Versuchen Sie in Zukunft, in die Sandbox zu posten , um vor dem Posten Feedback zu erhalten.
Xnor

3
@Belfield eine gute Herausforderung ist viel schwieriger als eine gute Antwort. Ich habe diesen trotzdem genossen, und der nächste wird besser sein.
EDC65

Antworten:


15

TeaScript , 55 Bytes 58 60 69 76 78 80 87 89

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

Das ist extrem kurz, ich bin sehr zufrieden damit.

Die letzten ~ 20 Zeichen mögen wie Kauderwelsch aussehen, aber das ist "Satz darf nur Buchstaben enthalten", verschlüsselt. Alle Zeichen haben Zeichencodes unter 256, sodass jedes ein Byte ist

Erläuterung

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

Vielen Dank für die Veröffentlichung des Tests - sehr nett. Jeder ist im selben Boot, wenn es um den Fehler geht - keine
Belfield

Seltsam, jetzt funktioniert es in Firefox. Aber ich habe früher auch Firefox verwendet.
Jakube

Beste Antwort bisher!
Belfield

Was? Du hast Pyth geschlagen ?! Mit einer JS-basierten Sprache?!? Wie ist das überhaupt möglich?!?!
ETHproductions

2
@ETHproductions Du kannst immer gewinnen, solange Dennis nicht
antritt

4

Haskell, 141 Bytes

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"

Fast 2/3 des Codes dienen der Fehlerprüfung. Scheint die erste echte Herausforderung zu sein.

Die Arbeit wird erledigt, indem unwords$zipWith($)(cycle[id,reverse,reverse,id])$words xdie Eingabe in eine Liste von Wörtern aufgeteilt, mit der zyklischen Liste von Funktionen komprimiert [id,reverse,reverse,id,id,reverse...]und das Ergebnis mit Leerzeichen zu einer einzelnen Zeichenfolge verknüpft wird.

Danke an @Christian Irwan für 2 Bytes.


"Satz darf nur aus Buchstaben bestehen" kann geändert werden in "Satz darf nur aus Buchstaben bestehen" - mein Fehler!
Belfield

@Belfield: fixed
nimi

Warum nicht r=reverse?
Akangka

@ChristianIrwan: Danke! (In einer frühen Version hatte ich eine Pointfree-Funktion ohne Namen, also zweimal reverseund r=reversehatte die gleiche Länge, weil sie fehlte f=. Nicht erneut überprüft, wenn ich auf Nicht-Pointfree umgestiegen bin).
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')))


Wenn es ein Newline im Eingabe ist, gibt es einen Fehler, aus dem Beispiel glaube ich nicht dies geschehen soll
Downgoat

1
@ Vɪʜᴀɴ es ist knifflig, im Beispiel geht es um mehrere Leerzeichen, aber dann gibt es keine mehreren Leerzeichen - nur eine neue Zeile. Ich denke, es wurde von SO Editor entstellt. WENN wir Zeilenumbrüche und anderen generischen Speicher verwalten müssen, erhöht sich die
Byteanzahl

2

Retina , 103 Bytes

\s+

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

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

In der zweiten Zeile sollte ein Leerzeichen stehen, das SE zu schlucken scheint. Führen Sie den Code aus einer einzelnen Datei mit dem -sFlag aus.

Retina kennt keine Ausnahmebedingungen, daher wird die Ausgabe einfach ersetzt, Sentence must only use letterswenn die Eingabe Nicht-Buchstaben-Zeichen ohne Leerzeichen enthält.



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],

15 Zeichen entfernt, danke Mego !!


Ja, Angst, Nimi hat einen Punkt ...
Belfield

Schieß, das habe ich verpasst. Ich werde es überarbeiten.
Elch

@Mego, re.search gibt None zurück (kann nicht als Index verwendet werden), wenn das Ergebnis nicht gefunden wird, und das Hinzufügen von "! = None" ist tatsächlich ein Byte länger als meine ursprüngliche Methode. Ich habe 3 Bytes gespart, indem ich die letzten beiden Zeilen zusammengeführt habe. Vielen Dank!
Elch

1

Bash + Coreutils, 108

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

Das letzte Zeichen dieses Programms ist ein Leerzeichen.

Die Eingabe erfolgt über die Befehlszeile:

$ ./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
$ 

1

Pyth, 72

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

Schlägt die andere Pyth-Antwort nicht, aber ich habe bereits Zeit investiert, um sie zu schreiben. Es ist im Grunde eine Übersetzung meiner Python-Antwort .

Probieren Sie es online aus


1

Julia, 109 Bytes

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

i=0und (i+=1)%4>1werden verwendet, um zu entscheiden, ob jedes Wort reversed bekommt oder nicht. isalphaGilt für die Wörter nach dem Teilen, um split(s)zu bestimmen, ob es Zeichen gibt, die keine Buchstaben sind (Leerzeichen wurden zu diesem Zeitpunkt bereits entfernt). joinStellt den String nach der Manipulation wieder her, es sei denn, der errorwird geworfen.


1

Julia, 150 134 Bytes

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)]," "))

Ungolfed:

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

16 Bytes gespart dank Glen O!


Könnte ich vor allem vorschlagen, die Logik der anfänglichen Bedingung umzukehren und sie rals Ergebnis zuzuweisen? Das heißt, r=ismatch(...)||error(...)- wird einige Zeichen abschneiden und die verwendete Bedingung umkehren r. Ich nehme an, dass ich noch weitere Einsparungen erzielen werde
Glen O

Kleine Korrektur - Ich musste mich ||mit der Negation befassen, dann wurde mir klar, dass die Negation nicht notwendig ist. Kehren Sie es zurück zu &&. Und noch besser, verwenden Sie ?:stattdessen, um es noch besser zu machen. 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))]," ")für 144 Bytes. Und ich denke, ich kann es innerlich besser machen join...
Glen O

Hier ist eine optimierte Version Ihrer Lösung mit 134 Bytes: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 Super Vorschläge, danke!
Alex A.

0

Pyth, 55 Bytes

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

%%k4 3Hat das Stück von Pietu1998 ausgeliehen. Ein weiteres Byte gespeichert.

Probieren Sie es online aus: Demo oder Test Suite

Erläuterung

?--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


0

Java, 215 Bytes

Regex macht Spaß

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()?"":" "));}}

Probieren Sie es online!


Ihre Ausgabe ist derzeit nicht korrekt. Du gibst jetzt aus She slles aeS shells no the aeS shore, aber es sollte She slles aeS shells on eht aeS shorestattdessen sein (erst normal, dann abwechselnd in 2er-Paaren umgekehrt oder nicht). Zwei Probleme verursachen dies. Sie erhöhen jetzt iauch, wenn ein Artikel leer ist und i++%2<1sollte i++%4>1stattdessen sein. Hier eine feste 211-Byte- Version.
Kevin Cruijssen

@ KevinCruijssen das ist, was ich für nicht genau genug lesen
Benjamin Urquhart

0

Jelly , 39 Bytes

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

Probieren Sie es online!

Vielen Dank an Erik den Outgolfer. Er rettete mich vor ein paar zusätzlichen Bytes und vor vielen Stunden Frustration.

Hier ist eine 46-Byte-Lösung

Tatsächlich wird ein Python-Syntaxfehler ausgegeben, wenn die Eingabe ungültige Zeichen enthält.

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

Probieren Sie es online!


0

Japt v2.0a0 -S, 41 Bytes

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

Versuch es

¸¬è\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

0

05AB1E , 36 Bytes

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

Probieren Sie es online aus.

Löst den folgenden Fehler aus, wenn die Eingabe nicht nur enthält [A-Za-z ]:

(RuntimeError) Konnte nicht konvertiert werden Satz darf nur Buchstaben in Ganzzahlen verwenden.

Erläuterung:

ð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)

Sehen Sie diese 05AB1E Spitze von mir (Abschnitt Wie das Wörterbuch benutzen? ) Zu verstehen , warum “¸–ƒ—€É€Å™ê“ist "sentence must only use letters".


0

PHP , 147 Bytes

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;

Probieren Sie es online!

Oder wenn die()als "Ausnahme" akzeptabel ist:

PHP , 131 Bytes

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

Probieren Sie es online!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.