Скручувальні вироки


17

Правила

Програма повинна отримати рядок / масив слів у якості введення. Для кожного слова в рядку / масиві воно буде реконструювати слово, переймаючи символи по черзі з передньої та задньої частини слова.

12345 678 9 -> 15243 687 9.

Потім вони будуть переставляти слова по черзі між найранішим та останнім словом у рядку.

15243 687 9 -> 15243 9 687

Нарешті, він буде реконструювати рядок, розмістивши пробіли, вкладки та нові рядки в індексах, де вони були спочатку розміщені до виведення результату.

12345 678 9-> 15243 687 9 -> 15243 9 687 -> 15243 968 7

Вихід повинен бути таким же типом даних, що і вхідний.

Стандартні лазівки заборонені

Приклади

Вхід:
Швидка бура лисиця перестрибує через ледачого собаку.
Вихід:
Teh d.ogq kucil yaz bnrwo tehf xoo rvej supm

Вхід:
Швидка бура лисиця перестрибує
через ледачого собаку.
Вихід:
Teh d.ogq kucil yaz bnrwo
tehf xoo rvej supm

Вхід:
Aflack
Вихід:
Akfcla

Це тому виграє найкоротший код


6
Це відчувається як дублікат. Клянусь, я це бачив і раніше.
Addison Crump

Тож лише символи вкладки, пробіл та новий рядок не вважаються частиною слова?
Джонатан Аллан

@JonathanAllan правильно
fəˈnɛtɪk

Чи можна вважати ASCII? чи Unicode?
МерМонті

@MayorMonty Ви можете припустити, що персонажі в будь-якій формі полегшують вас, якщо вони належним чином обробляють пробіли.
fəˈnɛtɪk

Відповіді:


3

Желе , 15 14  8 байт

Колосальні 6 байт врятувати від Dennis (переміщаючи згладжуються і цвілі всередині лінії 1 немає необхідності поділу на дві частини і голови, і Flatten там уже , щоб вони стали одним!)

żṚFṁ
Ç€Ç

(з двох рядків:, żṚFœs2Ḣі Ç€ÇFṁ⁸)

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

Бере масив слів і повертає масив нових слів. (Footer в TIO викликає це і з'єднує масив з пробілами, щоб він добре роздруковував.)

Зауважте: обробка однієї струни, розділення на пробіли вкладки та нові рядки, а потім їх складання насправді виявилося досить складним; Одного разу я побачив, що список слів є варіантом.

Як?

Ç€Ç - Main link: list of words
Ç€  - call the last link (1) as a monad for €ach word
  Ç - call the last link (1) as a monad for the result

żṚFṁ - Link 1: Do a twist: list (here, a list of words or characters)
                            e.g. input = [A,B,C,D,E,F,G]
ż    - zip the list with                 [A,    B,    C,    D,    E,    F,    G]
 Ṛ   - the reverse of the list             [G,    F,    E,    D,    C,    B,    A]
                                        [[A,G],[B,F],[C,E],[D,D],[E,C],[F,B],[G,A]]
  F  - flatten into a single list        [A,G,  B,F,  C,E,  D,D,  E,C,  F,B,  G,A]
                                         [A,G,B,F,C,E,D,D,E,C,F,B,G,A]
   ṁ - mould like the input list         [A,G,B,F,C,E,D]

Це має спрацювати. Спробуйте в Інтернеті!
Денніс

Солодке збереження; занадто легко забути цей маневр!
Джонатан Аллан

2

JavaScript (ES6), 89 байт

Бере та виводить масив слів.

a=>a.map(w=>(F=([a,...b])=>a?a+(b.pop()||'')+F(b):'')(a.map(F)).slice(p,p+=w.length),p=0)

Тест

Версія для рядків, 112 байт

Бере і виводить рядок.

s=>s.replace(/\S+/g,w=>(F=([a,...b])=>a?a+(b.pop()||'')+F(b):'')(s.split(/\s/).map(F)).slice(p,p+=w.length),p=0)

Тест



0

Perl 6 , 84 байти

{my &t={(|(.shift,.pop)xx*)[^$_]}
map({|t [.comb]},t [$_]).rotor($_».chars)».join}

Вводить і виводить список слів.

Як це працює

Всередині лямбда я визначив ще одну лямбду, щоб виконувати скручування " чергування символів попереду і ззаду ":

my &t={                        }   # Lambda, assigned to a variable.
          .shift,.pop              # Remove an element from the front an back,
                      xx*          # an infinite number of times,
        |(           )             # and make sure this infinite list is flattened.
                          [^$_]    # Take as many elements as the input had elements.

Це працює, тому що xx оператор більше схожий на макрос, ніж на функцію, тим, що він забезпечує магічну ледачу оцінку.

Потім у головній лямбда:

                   [$_]                          # Create a fresh array from the input,
                 t                               # and twist it (destructively).
map({          },                                # For each element (i.e. word):
      t [.comb]                                  #   Split it into characters and twist them,
     |                                           #   and slip them into the outer list.
                        .rotor($_».chars)        # Partition this flat list of characters,
                               $_».chars         # using the original word lengths.
                                         ».join  # Turn each sub-list into a word.

Perl 6 , 87 байт

{my &t={(|(.shift,.pop)xx*)[^$_]}
my @a=map {|t [.comb]},t [.words];S:g/\S/{@a.shift}/}

Це варіант вищезазначеного, який вводить і виводить рядок, зберігаючи різні символи пробілу.


0

Haskell , 115 95 93 98 95 байт

f(a:b)=a:f(reverse b)
f e=e
a!(y:z)|elem y" \t\n"=y:a!z|b:c<-a=b:c!z
a!z=z
(!)=<<(f=<<).f.words

Подзвоніть з (!)=<<(f=<<).f.words $ "some string". Спробуйте в Інтернеті!

Дякую @nimi за те, що вказав, що раніше я неправильно читав виклик.

Функція fвиконує скручування за списком, тому може бути використана для рядків (список символів) та списку рядків. a!bвставляє пробіл рядка bв рядокa .

(!)=<<(f=<<).f.wordsеквівалентно \s0 -> (concatMap f . f . words $ s0) ! s0:

            s0 = "The quick brown fox jumps\nover the lazy dog."
      words s0 = ["The","quick","brown","fox","jumps","over","the","lazy","dog."] = s1
          f s1 = ["The","dog.","quick","lazy","brown","the","fox","over","jumps"] = s2
concatMap f s2 = "Tehd.ogqkucilyazbnrwotehfxoorvejsupm"                           = s3
       s3 ! s0 = "Teh d.ogq kucil yaz bnrwo\ntehf xoo rvej supm"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.