Code Golf: Avant sdrawkcaB sdrawkcaB Avant Forwards sdrawkcaB

14

Tâche

  • L'utilisateur saisit une phrase - mots uniquement. Toute entrée autre que des lettres ou des espaces, y compris des entiers et des signes de ponctuation, doit lever une exception: "La phrase ne doit utiliser que des lettres".
  • La sortie a un modèle, où certains mots sont inversés et d'autres mots sont normaux.
  • Le motif commence comme un mot normal, les deux mots suivants sont inversés, puis les deux mots suivants sont normaux et le motif continue.
  • Un exemple où les mots devraient être normaux et où les mots inversés est ci-dessous:

Normal - Inversé - Inversé - Normal - Normal - Inversé - Inversé - Normal ...

Exemple d'entrée

Elle vend des coquillages sur le bord de la mer

Exemple de sortie

Elle slles aeS shells on eht aeS shore

Règles supplémentaires

  • Si des majuscules sont utilisées, elles doivent rester sur la lettre sur laquelle elles ont été initialement affichées.
  • Tous les espaces multiples initialement affichés en entrée doivent être réduits à un espace. Par exemple Programming Puzzles and Code GolfdevientProgramming selzzuP dna Code Golf

Le code le plus court gagne !!

Bon codage ...

Belfield
la source
8
De nombreux langages de programmation n'ont pas d'exceptions.
Poignée de porte
15
@nimi Il semble tout à fait inutile de limiter un défi à un petit sous-ensemble de langues pour une raison aussi triviale.
Poignée de porte
10
Ce défi autrement bon est ruiné par la règle. Any input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".Cela signifie implémenter une tâche secondaire sans aucun rapport avec le défi de renverser les mots, de supprimer les langues qui n'ont pas d'exceptions, et nécessite le codage en dur ou la compression d'une longue chaîne qui occupe une grande partie de la nombre d'octets.
xnor
2
@Belfield Oui, je vois votre lien. Je suppose qu'il n'y a rien que vous puissiez faire maintenant. À l'avenir, essayez de publier dans le bac à sable pour obtenir des commentaires avant de publier.
xnor
3
@Belfield un bon défi est beaucoup plus difficile qu'une bonne réponse. J'ai quand même apprécié celui-ci, et le prochain sera meilleur.
edc65

Réponses:

15

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

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

C'est extrêmement court, j'en suis très content.

Les 20 derniers caractères peuvent ressembler à du charabia, mais c'est "La phrase ne doit utiliser que des lettres" encodée. Tous les caractères ont des codes de caractères inférieurs à 256, chacun étant donc d'un octet

Explication

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
la source
Merci d'avoir posté le test - très agréable. Tout le monde est dans le même bateau en ce qui concerne l'erreur - pas de golf sur cette ligne
Belfield
Étrange, maintenant cela fonctionne dans Firefox. Mais j'ai également utilisé Firefox plus tôt.
Jakube
Jusqu'à présent, la meilleure réponse!
Belfield
Quelle? Tu as battu Pyth?! Avec un langage basé sur JS?!? Comment est-ce possible?!?!
ETHproductions
2
@ETHproductions Vous pouvez toujours gagner tant que Dennis ne participe pas: p
Downgoat
4

Haskell, 141 octets

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"

Près des 2/3 du code sont destinés à la vérification des erreurs. Semble être le premier défi du monde réel.

Le travail est effectué par unwords$zipWith($)(cycle[id,reverse,reverse,id])$words xlequel divise l'entrée en une liste de mots, la zippe avec la liste cyclique des fonctions[id,reverse,reverse,id,id,reverse...] et à joindre le résultat avec des espaces à une seule chaîne.

Merci à @Christian Irwan pour 2 octets.

nimi
la source
"La phrase ne doit contenir que des lettres d'utilisateur" peut être remplacée par "La phrase ne doit utiliser que des lettres" - ma mauvaise erreur!
Belfield
@Belfield: fixe
nimi
Pourquoi pas r=reverse?
Akangka
@ChristianIrwan: Merci! (Dans une première version, j'avais une fonction sans point sans nom, donc en utilisant deux fois reverseet r=reversej'avais la même longueur, à cause du manque f=. Je n'ai pas vérifié à nouveau lors du passage en non sans point).
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
la source
Quand il y a une nouvelle ligne dans l'entrée, cela génère une erreur, à partir de l'exemple, je ne pense pas que cela soit censé se produire
Downgoat
1
@ Vɪʜᴀɴ c'est délicat, l'exemple concerne plusieurs espaces, mais il n'y a pas plusieurs espaces - juste une nouvelle ligne. Je pense qu'il a été mutilé par l'éditeur SO. SI nous devons gérer les sauts de ligne et autres espaces génériques, le nombre d'octets augmente de 2
edc65
2

Rétine , 103 octets

\s+

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

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

Il devrait y avoir un seul espace sur la deuxième ligne, que SE semble avaler. Exécutez le code à partir d'un seul fichier avec l' -sindicateur.

Retina n'a pas de concept d'exceptions, donc la sortie est simplement remplacée par Sentence must only use letterss'il y a des caractères non blancs et non blancs dans l'entrée.

Martin Ender
la source
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],

Suppression de 15 caractères, merci Mego !!

élan
la source
Oui, peur que nimi marque un point ...
Belfield
Shoot, j'ai raté ça. Je vais le réviser.
Moose
@Mego, re.search renvoie None (qui ne peut pas être utilisé comme index) si le résultat n'est pas trouvé, et ajouter "! = None" est en fait un octet de plus que ma méthode d'origine. J'ai cependant économisé 3 octets en fusionnant les deux dernières lignes. Merci!
Moose
1

Bash + coreutils, 108

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

Le dernier caractère de ce programme est un espace.

L'entrée provient de la ligne de commande:

$ ./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
$ 
Traumatisme numérique
la source
1

Pyth, 72

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

Ne bat pas l'autre réponse Pyth, mais j'ai déjà investi du temps pour l'écrire. Il s'agit essentiellement d'une traduction de ma réponse Python .

Essayez-le en ligne

élan
la source
1

Julia, 109 octets

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

i=0et (i+=1)%4>1sont utilisés pour décider si chaque mot obtient reversed ou non. isalphas'applique aux mots après avoir été divisé en utilisant split(s)pour déterminer s'il existe ou non des caractères qui ne sont pas des lettres (les espaces ont déjà été supprimés à ce stade). joinrestaure la chaîne après la manipulation, sauf si le errorest levé.

Glen O
la source
1

Julia, 150 134 octets

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

Non golfé:

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 octets enregistrés grâce à Glen O!

Alex A.
la source
Avant toute chose, pourrais-je suggérer d'inverser la logique du conditionnel initial et de lui attribuer rle résultat? Autrement dit, r=ismatch(...)||error(...)- va raser quelques caractères et inverser le conditionnel qui utilise r. Je commenterai à nouveau avec, je suppose, quelques économies supplémentaires
Glen O
Correction mineure - j'ai dû ||gérer la négation, puis j'ai réalisé que la négation n'était pas nécessaire. Retournez-le à &&. Et encore mieux, utilisez ?:plutôt pour le faire encore mieux. 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))]," ")pour 144 octets. Et je pense que je peux faire mieux à l'intérieur join...
Glen O
Voici une version simplifiée de votre solution, avec 134 octets: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 suggestions, merci!
Alex A.
0

Pyth, 55 octets

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

%%k4 3J'ai emprunté le morceau à Pietu1998. Un octet supplémentaire enregistré.

Essayez-le en ligne: démonstration ou suite de tests

Explication

?--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
la source
0

Perl 5 -ap , 80 octets

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

Essayez-le en ligne!

Xcali
la source
0

Java, 215 octets

Regex est amusant

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

Essayez-le en ligne!

Benjamin Urquhart
la source
Votre sortie n'est pas correcte actuellement. Vous produisez maintenant She slles aeS shells no the aeS shore, mais cela devrait être à la She slles aeS shells on eht aeS shoreplace (d'abord normal, puis en alternant par paires de 2 inversées ou non). Deux problèmes en sont la cause. Vous augmentez maintenant imême si un élément est vide, et i++%2<1devrait l'être à la i++%4>1place. Voici une version fixe de 211 octets .
Kevin Cruijssen
@KevinCruijssen c'est ce que j'obtiens pour ne pas avoir lu assez attentivement
Benjamin Urquhart
0

Gelée , 39 octets

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

Essayez-le en ligne!

Merci à Erik l'Outgolfer. Il m'a sauvé de quelques octets supplémentaires et de nombreuses heures de frustration.

Voici une solution de 46 octets

Il génère en fait une erreur de syntaxe python lorsque l'entrée contient des caractères non valides.

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

Essayez-le en ligne!

Zylviij
la source
0

Japt v2.0a0 -S, 41 octets

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

Essayez-le

¸¬è\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
Hirsute
la source
0

05AB1E , 36 octets

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

Essayez-le en ligne.

Lance l'erreur suivante lorsque l'entrée ne contient pas seulement [A-Za-z ]:

(RuntimeError) Impossible de convertir Phrase ne doit utiliser que des lettres en entier.

Explication:

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

Voir cette astuce de la mine de 05AB1E (section Comment utiliser le dictionnaire? ) Pour comprendre pourquoi “¸–ƒ—€É€Å™ê“est "sentence must only use letters".

Kevin Cruijssen
la source
0

PHP , 147 octets

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;

Essayez-le en ligne!

Ou si cela die()est acceptable comme "exception":

PHP , 131 octets

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

Essayez-le en ligne!

640 Ko
la source