Код гольфу: форварди sdrawkcaB sdrawkcaB вперед форварди sdrawkcaB


14

Завдання

  • Користувач вводить речення - лише слова. Будь-який вхід, крім букв чи пробілів, включаючи цілі числа та розділові знаки, повинен містити виняток: "Речення має використовувати лише літери".
  • Вихід має шаблон, де одні слова перевернуті, а інші слова - нормальні.
  • Шаблон починається як звичайне слово, наступні два слова перевертаються, потім наступні два слова є нормальними, і шаблон продовжується.
  • Нижче наведено приклад того, де слова мають бути нормальними та де слова перевернуті нижче:

Нормальний - Зворотний - Зворотний - Нормальний - Нормальний - Зворотний - Зворотний - Нормальний ...

Приклад введення

Вона продає морські мушлі на березі моря

Приклад виводу

Вона сліш аес снарядів на березі аеру

Додаткові правила

  • Якщо використовуються великі літери, вони повинні залишатися на листі, на якому вони були спочатку розміщені.
  • Будь-які декілька пробілів, розміщених спочатку на вході, слід зменшити до одного пробілу. Наприклад Programming Puzzles and Code GolfстаєProgramming selzzuP dna Code Golf

Найкоротший код виграє !!

Щасливе кодування ...


8
Багато мов програмування не мають винятків.
Дверна ручка

15
@nimi Мабуть, зовсім не зайвим буде обмежувати виклик невеликим набором мов з такої тривіальної причини.
Дверна ручка

10
Цей інакше хороший виклик руйнується правилом. Any input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".Це означає, що реалізація вторинної задачі, абсолютно не пов'язаної з викликом перевертання слів, вирізає мови, які не мають винятків, і вимагає жорсткого кодування або стискання довгих рядків, які займають багато кількість байтів
xnor

2
@Belfield Так, я бачу вашу прив'язку. Я здогадуюсь, ти зараз нічого не можеш зробити. Надалі спробуйте опублікувати в пісочниці, щоб отримати зворотній зв'язок перед публікацією.
xnor

3
@Belfield хороший виклик набагато складніше, ніж хороша відповідь. Мені це сподобалось у будь-якому випадку, а наступний стане кращим.
edc65

Відповіді:


15

TeaScript , 55 байт 58 60 69 76 78 80 87 89

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

Це надзвичайно коротко, я дуже задоволений цим.

Останні ~ 20 символів можуть здаватися химерними, але це "Засудження повинне використовувати лише літери", закодоване. Усі символи мають char-коди нижче 256, тому кожен - один байт

Пояснення

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

Дякую, що розмістив тест - дуже приємно. Кожен з них знаходиться в одному човні, коли йдеться про помилку - жодного гольфу на цій лінії
Белфілд,

Дивно, зараз він працює у Firefox. Але я також раніше використовував Firefox.
Якубе

Найкраща відповідь поки!
Белфілд

Що? Ви побили Pyth ?! З мовою на базі JS?!? Як це навіть можливо?!?!
ETHproductions

2
@ETHproductions Ви завжди можете перемогти, поки Денніс не змагається: p
Downgoat

4

Haskell, 141 байт

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"

Майже 2/3 коду призначено для перевірки помилок. Здається, це перший справжній світовий виклик.

Робота виконується за допомогою того, unwords$zipWith($)(cycle[id,reverse,reverse,id])$words xщо розбиває введення на список слів, [id,reverse,reverse,id,id,reverse...]з’єднує його за допомогою циклічного списку функцій та приєднує результат із пробілами назад до однієї струни.

Дякуємо @Christian Irwan за 2 байти.


"Речення має містити лише користувацькі букви", можна змінити на "Речення повинно використовувати лише літери" - моє погано на помилку!
Белфілд

@Belfield: фіксований
Ними

Чому ні r=reverse?
Акангка

@ChristianIrwan: Дякую! (У першій версії я мав функцію pointfree без імені, тому два рази користувався reverseі r=reverseмав однакову довжину через відсутність f=. Не перевіряв знову при переході на non pointfree).
німі

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


Коли у введенні є новий рядок, він видає помилку, із прикладу, я не думаю, що це повинно статися
Downgoat

1
@ Vɪʜᴀɴ це хитро, Приклад стосується декількох пробілів, але тоді немає декількох пробілів - лише 1 новий рядок. Я думаю, що це було порушено редактором SO. Якщо ми маємо керувати новинками та іншим загальним простором, кількість байтів збільшиться на 2
edc65,

2

Сітківка , 103 байти

\s+

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

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

На другому рядку має бути єдиний пробіл, який, здається, ковтає SE. Запустіть код з одного файлу з -sпрапором.

Retina не має поняття винятків, тому вихід просто замінюється, Sentence must only use lettersякщо у введенні є символи, що не містять пробілів.



2

Пітон, 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 символів, дякую Мего !!


Так, боїться, що німі має сенс ...
Белфілд

Стріляйте, я це пропустив. Я перегляну це.
Мус

@Mego, re.search повертає None (що неможливо використовувати як індекс), якщо результат не знайдено, і додавання "! = None" насправді на один байт довше мого оригінального методу. Я врятував 3 байти, об'єднавши останні два рядки. Спасибі!
Мус

1

Bash + coreutils, 108

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

Останній персонаж цієї програми - пробіл.

Введення взято з командного рядка:

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

Юлія, 109 байт

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

i=0і (i+=1)%4>1використовуються для того, щоб визначити, отримує чи кожне слово reversed чи ні. isalphaзастосовується до слів після розділення, використовуючи, split(s)щоб визначити, чи є символи, які не є літерами (пробіли вже видалено цією точкою). joinвідновлює рядок після маніпуляції, якщо тільки errorне кинуто.


1

Джулія, 150 134 байт

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

Безголівки:

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 байт завдяки Glen O!


Перш ніж щось інше, я можу запропонувати повернути логіку початкового умовного і призначити rйого результатом? Тобто, r=ismatch(...)||error(...)- буде голити кілька символів, і відміняти умовне, яке використовує r. Знову прокоментую ще, підозрюю, ще кілька заощаджень
Glen O

Незначна корекція - я мав ||справу з запереченням, тоді зрозумів, що заперечення не потрібно. Зворотно поверніть його назад &&. А ще краще, скористайтеся ?:натомість, щоб зробити це ще краще. 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))]," ")за 144 байти. І я думаю, що я можу краще зробити всередині join...
Glen O

Ось впорядкована версія вашого рішення, зі 134 байтами: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 Дивовижні пропозиції, дякую!
Олексій А.

0

Pyth, 55 байт

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

Запозичив %%k4 3трохи від Pietu1998. Збережено один додатковий байт.

Спробуйте в Інтернеті: Демонстрація або Тестовий набір

Пояснення

?--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 байт

Regex - це весело

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

Спробуйте в Інтернеті!


На даний момент ваш результат неправильний. Тепер ви виводите She slles aeS shells no the aeS shore, але це має бути She slles aeS shells on eht aeS shoreзамість цього (спочатку нормальне; потім чергування в парах 2 перетворених чи ні). Дві проблеми викликають це. Тепер ви збільшуєтесь, iнавіть якщо елемент порожній, а замість нього i++%2<1має бути i++%4>1. Тут виправлена версія 211 байт .
Кевін Кройсейсен

@KevinCruijssen це те, що я отримую за те, що я не читаю достатньо уважно
Бенджамін

0

Желе , 39 байт

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

Спробуйте в Інтернеті!

Дякуємо Еріку Поверху. Він врятував мене від кількох зайвих байтів і від багатьох годин розчарування.

Ось 46-байтне рішення

Він фактично видає помилку синтаксису python, коли вхід містить недійсні символи.

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

Спробуйте в Інтернеті!


0

Japt v2.0a0 -S, 41 байт

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

Спробуй це

¸¬è\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 байт

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

Спробуйте в Інтернеті.

Припускає таку помилку, коли вхід містить не лише [A-Za-z ]:

(RuntimeError) Не вдалося перетворити Речення повинно використовувати лише літери до цілого числа.

Пояснення:

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

Дивіться цей 05AB1E наконечник шахти (розділ Як користуватися словником? ) , Щоб зрозуміти , чому “¸–ƒ—€É€Å™ê“це "sentence must only use letters".


0

PHP , 147 байт

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;

Спробуйте в Інтернеті!

Або якщо die()це прийнятно як "Виняток":

PHP , 131 байт

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

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.