Código Golf: Avançado sdrawkcaB sdrawkcaB Avançado Avançado sdrawkcaB

14

Tarefa

  • O usuário digita uma frase - apenas palavras. Qualquer entrada que não seja letras ou espaços, incluindo números inteiros e pontuação, deve gerar uma exceção: "A frase deve usar apenas letras".
  • A saída tem um padrão, onde algumas palavras são invertidas e outras são normais.
  • O padrão começa como uma palavra normal, as duas seguintes são invertidas, as duas seguintes são normais e o padrão continua.
  • Um exemplo de onde as palavras devem ser normais e onde as palavras invertidas estão abaixo:

Normal - Invertido - Invertido - Normal - Normal - Invertido - Invertido - Normal ...

Exemplo de entrada

Ela vende conchas do mar na costa do mar

Exemplo de saída

Ela joga conchas na costa

Regras adicionais

  • Se forem usadas letras maiúsculas, elas devem permanecer na letra em que foram originalmente postadas.
  • Qualquer espaço múltiplo publicado inicialmente na entrada deve ser reduzido para um espaço. Por exemplo, Programming Puzzles and Code Golftorna-seProgramming selzzuP dna Code Golf

O código o mais curto ganha !!

Feliz codificação ...

Belfield
fonte
8
Muitas linguagens de programação não têm exceções.
Maçaneta
15
@nimi Parece totalmente desnecessário restringir um desafio a um pequeno subconjunto de idiomas por um motivo tão trivial.
Maçaneta
10
Esse desafio, que de outra forma é bom, é arruinado pela regra Any input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".. Significa implementar uma tarefa secundária totalmente não relacionada ao desafio de reverter palavras, corta idiomas que não têm exceções e requer codificação ou compactação ou compactação de uma cadeia longa que ocupa grande parte do contagem de bytes.
Xnor
2
@ Selffield Sim, eu vejo o seu vínculo. Acho que não há nada que você possa fazer agora. No futuro, tente postar na Sandbox para obter feedback antes de postar.
Xnor
3
@Belfield, um bom desafio é muito mais difícil do que uma boa resposta. De qualquer maneira, eu gostei deste, e o próximo será melhor.
Edc65

Respostas:

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`

Isso é extremamente curto, estou muito feliz com isso.

Os últimos ~ 20 caracteres podem parecer sem sentido, mas é "A sentença deve usar apenas letras" codificadas. Todos os caracteres têm códigos de caracteres abaixo de 256, cada um com um byte

Explicação

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
fonte
Obrigado por postar o teste - muito bom. Todo mundo está no mesmo barco quando se trata de um erro - sem jogar nessa linha
Belfield
Estranho, agora funciona no Firefox. Mas eu também usei o Firefox anteriormente.
Jakube 31/10/2015
Melhor resposta até agora!
Belfield
O que? Você venceu Pyth ?! Com uma linguagem baseada em JS?!? Como isso é possível?!?!
ETHproductions
2
@ETHproductions Você sempre pode vencer enquanto Dennis não está competindo: p
Downgoat
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"

Quase 2/3 do código é para verificação de erros. Parece ser o primeiro desafio do mundo real.

O trabalho é feito unwords$zipWith($)(cycle[id,reverse,reverse,id])$words xdividindo a entrada em uma lista de palavras, compactando-a com a lista de funções de ciclo [id,reverse,reverse,id,id,reverse...]e unindo o resultado com espaços de volta a uma única string.

Obrigado a @Christian Irwan por 2 bytes.

nimi
fonte
"A frase deve usar apenas letras do usuário" pode ser alterada para "A frase deve usar apenas letras" - meu erro está no erro!
Belfield
@Belfield: fixed
nimi
Por que não r=reverse?
Akangka
@ChristianIrwan: Obrigado! (Em uma versão anterior, eu tinha uma função sem ponto, sem nome, portanto, usei duas vezes reversee r=reversetinha o mesmo comprimento, devido à falta f=. Não verifiquei novamente ao mudar para não ponto).
N /
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
fonte
Quando há uma nova linha na entrada, ela gera um erro, pelo exemplo que não acho que isso
deva
1
@ Vɪʜᴀɴ é complicado, o exemplo é sobre vários espaços, mas não há vários espaços - apenas uma nova linha. Eu acho que foi mutilado pelo editor SO. Se temos de gerir novas linhas e outro espaço genérico, o aumento contagem de bytes por 2
edc65
2

Retina , 103 bytes

\s+

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

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

Deve haver um único espaço na segunda linha, que o SE parece estar engolindo. Execute o código de um único arquivo com o -ssinalizador.

Retina não tem conceito de exceções; portanto, a saída é simplesmente substituída por Sentence must only use lettersse houver caracteres que não sejam espaços em branco e que não sejam letras na entrada.

Martin Ender
fonte
2

Pitão, 61 bytes

?.A}R+G\ rz0jd.e_W%%k4 3bfTczd"Sentence must only use letters

Experimente online.

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

Removidos 15 caracteres, obrigado Mego !!

alce
fonte
Sim, medo nimi tem um ponto ...
Belfield
Atire, eu senti falta disso. Eu vou revisar.
Moose
@Mego, re.search retorna None (que não pode ser usado como um índice) se o resultado não for encontrado, e adicionar "! = None" é na verdade um byte a mais que meu método original. Eu salvei 3 bytes, mesclando as duas últimas linhas. Obrigado!
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 \ 

O último caractere deste programa é um espaço.

A entrada é obtida na linha de comando:

$ ./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
$ 
Trauma Digital
fonte
1

Pyth, 72

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

Não supera a outra resposta de Pyth, mas eu já investi tempo em escrevê-la. É basicamente uma tradução da minha resposta em Python .

Experimente online

alce
fonte
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=0e (i+=1)%4>1são usados ​​para decidir se cada palavra recebe reversed ou não. isalphaaplica-se às palavras após serem divididas usando split(s)para determinar se há ou não caracteres que não são letras (os espaços já foram removidos nesse ponto). joinrestaura a sequência após a manipulação, a menos que errorseja lançada.

Glen O
fonte
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

Economizou 16 bytes graças a Glen O!

Alex A.
fonte
Antes de mais nada, posso sugerir reverter a lógica do condicional inicial e atribuir ro resultado? Ou seja, r=ismatch(...)||error(...)- eliminará alguns caracteres e reverterá o condicional usado r. Irá comentar novamente com, eu suspeito, um pouco mais de economia
Glen O
Correção menor - eu tive ||que lidar com a negação, depois percebi que a negação não é necessária. Inverta de volta para &&. E melhor ainda, use ?:para fazê-lo ainda melhor. 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))]," ")para 144 bytes. E eu acho que posso fazer melhor por dentro join...
Glen O
Aqui está uma versão simplificada da sua solução, com 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 Sugestões impressionantes, obrigado!
Alex A.
0

Pitão, 55 bytes

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

Emprestado o %%k4 3bit de Pietu1998. Salvo um byte adicional.

Experimente on-line: Demonstration or Test Suite

Explicação

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

Perl 5 -ap , 80 bytes

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

Experimente online!

Xcali
fonte
0

Java, 215 bytes

Regex é divertido

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

Experimente online!

Benjamin Urquhart
fonte
Sua saída atualmente não está correta. Você agora produz She slles aeS shells no the aeS shore, mas deve ser She slles aeS shells on eht aeS shore(primeiro normal; depois alternando em pares de 2 invertidos ou não). Dois problemas causam isso. Agora você aumenta imesmo que um item esteja vazio e i++%2<1deva estar i++%4>1em seu lugar. Aqui uma versão fixa de 211 bytes .
Kevin Cruijssen
@KevinCruijssen é isso que recebo por não ler atentamente
Benjamin Urquhart
0

Geléia , 39 bytes

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

Experimente online!

Graças a Erik, o Outgolfer. Ele me salvou de alguns bytes extras e de muitas horas de frustração.

Aqui está uma solução de 46 bytes

Na verdade, ele gera um erro de sintaxe python quando a entrada contém caracteres inválidos.

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

Experimente online!

Zylviij
fonte
0

Japt v2.0a0-S , 41 bytes

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

Tente

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

05AB1E , 36 bytes

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

Experimente online.

Lança o seguinte erro quando a entrada não contém apenas [A-Za-z ]:

(RuntimeError) Não foi possível converter a frase deve usar apenas letras para número inteiro.

Explicação:

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

Veja esta dica 05AB1E meu (seção Como usar o dicionário? ) Para entender por que “¸–ƒ—€É€Å™ê“é "sentence must only use letters".

Kevin Cruijssen
fonte
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;

Experimente online!

Ou se die()é aceitável como uma "exceção":

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;

Experimente online!

640KB
fonte