Разделить на три!

16

Учитывая строку, вы должны разделить ее на группы из трех символов (путем заполнения _в конце).

Связано , но все же по-другому.


Пример ввода / вывода:

  • 'abcde' -> 'abc', 'de_'

  • '1234' -> '123', '4__'

  • '' -> [] or falsey value

  • 'Three spree!' -> 'Thr', 'ee ', 'spr', 'ee!'

  • Строка 6 МБ

Это , поэтому выиграет меньше байтов!

Редактировать: Наконец, вывод неограничен .

Рахул Верма
источник
10
Почему особый случай пустой строки? Можем ли мы выбрать, какой символ использовать для заполнения?
Лохматый
12
Таким образом, задача на самом деле: если задана строка, вернуть значение Falsey, если оно пустое, в противном случае разбить его на группы по три, дополнив при необходимости подчеркиванием ? Похоже на странную пару из двух не связанных задач (проверка длины строки и разбиение).
Адам
15
Чего следует избегать: исключительные крайние случаи . В этом случае пустая строка должна возвращать пустой массив или эквивалент, а не значение Фалси
Джо Кинг,
6
Многие языки со статической типизацией не могут возвращать более одного типа из функции
Воплощение невежества
4
@manassehkatz Да, но только на этих языках. В некоторых языках это делает решения намного более сложными или даже невозможными (например, статически типизированные языки).
Джо Кинг,

Ответы:

8

Python 3, 58 47 34 байта

Я уверен, что кто-то может сделать лучше, Кто-то еще сделал лучше. Спасибо Джо Кингу за -11 -24 байта!

Выход неограничен, добро пожаловать в кортеж ада. Возвращает пустой список ( ложь ) при пустом вводе

lambda x:[*zip(*[iter(x+"__")]*3)]

TIO

Бенджамин Уркхарт
источник
5

Perl 5 , 16 15 байт

"@_\__"=~/.../g

Попробуйте онлайн!

Кжетил С.
источник
1
15 с "@_\__"=~/.../g. Были и другие 16: (pop.__)=~/.../gили map/.../g,pop.__.
Grimmy
1
Спасибо @Grimy за подсказку о \. Он сбрил 1 байт, и я узнал что-то новое.
Кжетил С.
4

APL + WIN 36 24 22 байта

12 байтов, сохраненных в результате вывода, теперь ограничены и используют код из первого комментария @ Adám, модифицированного для работы в APL + WIN, и еще 2 со своим вторым комментарием. Благодарю.

(⌈(↑⍴s)÷3)3⍴(s←⎕),'__'

Запрашивает ввод строки и выводит результат в виде массива nx3

Попробуйте онлайн! Предоставлено Dyalog Classic

Грэхем
источник
@Адам. Вызывает ошибку домена в APL + WIN справа больше всего
Грэм
Не терпит неудачу на '', нет? Я думаю, что OP (по какой-то странной причине) требует, чтобы результат был 0(с любым рангом).
Адам
1
@ Adám Создает массив размером 0 x 3. ОП теперь, кажется, хочет "фальси" для нулевого ввода. С изменяющейся спецификацией я собираюсь кланяться в этот момент и оставить свой ответ как свой! Спасибо за ваши улучшения.
Грэм
3

Perl 6 , 19 байт

{$_~"__"~~m:g/.../}

Попробуйте онлайн!

Дополняет строку двумя подчеркиваниями, а затем разбивает строку на куски по три символа. Возвращает как массив объектов Match.

Джо Кинг
источник
3

Japt , 8 байт

+1 байт в особом случае пустая строка. Можно сохранить 2, если мы можем выбрать наш символ заполнения.

©ò3 ú'_3

Попытайся

©ò3 ú'_3     :Implicit input of string
©            :Logical AND with
 ò3          :Split into chunks of 3
    ú'_3     :Right pad each with "_" to length 3
мохнатый
источник
2

CJam , 11 байт

q'_3*+3/);p

Попробуйте онлайн!

Для пустого ввода это дает пустую строку, что ложно.

Как это устроено

q     e# Read input as a string
'_    e# Push char '_'
3*    e# String formed by that char repeated 3 times
+     e# Concatenate to input string
3/    e# Split in groups of 3, the last of which may be shorter. Gives array of strings
);    e# Detach last string from the array and delete it
p     e# Print string representation of the array
Луис Мендо
источник
2

Сетчатка 0.8.2 , 10 байт

$
__
!`...

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:

$
__

Добавьте два _s, если последняя группа должна быть дополнена.

!`...

Сопоставьте как можно больше групп из трех, выводя сами совпадения, а не счет. (В Retina 1 это было бы Lвместо !.)

Нил
источник
2

Wolfram Language (Mathematica) , 28 21 байт

-7: больше не требуется значение falsy ( False) для пустого ввода

Partition[#,3,1,1,_]&

Попробуйте онлайн!

Принимает список символов в качестве входных данных. Возвращает список из трех наборов символов, дополненных Blanks ( _).


34 27 байт

StringPartition[#<>"__",3]&

Попробуйте онлайн!

Строковый ввод, вывод списка строк

attinat
источник
1

Желе , 9 байт

s3o€“___”

Монадическая ссылка, принимающая список символов, который выдает список списков символов (пустой ввод дает пустой вывод).

Попробуйте онлайн!

Как?

s3o€“___” - Link: list of characters
s3        - split into chunks of three
   €      - for each chunk:
  o       -   OR (vectorises):
    “___” -     list of characters = ['_', '_', '_']

Примечания: необходимо только обработать края случае пустого ввода. Полная программа может отбросить трейлинг , но здесь мы не можем этого сделать, поскольку поведение печати полной программы разбивает все вместе.


Эквивалент 9:

o3ÐƤ“___”

Попытайся


Альтернатива 9:

;“___”s3Ṗ

Попытайся

Джонатан Аллан
источник
1

Java 10, 116 113 байтов

s->{s+="__";int l=s.length()/3,i=l;var r=new String[l];for(;i-->0;)r[i]=s.substring(i*3,i*3+3);return l<1?0>1:r;}

Попробуйте онлайн.

Или 104 101 байт, если вместо массива falseразрешен пустой массив .

s->{s+="__";int l=s.length()/3;var r=new String[l];for(;l-->0;)r[l]=s.substring(l*3,l*3+3);return r;}

Попробуйте онлайн.

Объяснение:

s->{                             // Method with String as both parameter and return-type
  s+="__";                       //  Append two "_" to the input-String
  int l=s.length()/3;            //  Get the length, integer-divided by 3
  var r=new String[l];           //  Create a string-array with that many parts
  for(;l-->0;)                   //  Loop `l` in the range (l, 0]:
    r[l]=                        //   Set the `l`'th value of the array to:
         s.substring(l*3,l*3+3); //   Get the substring of size 3 from index `l*3` from `s`
  return r;}                     //  Return the array
Кевин Круйссен
источник
Пустой массив теперь разрешен
Бенджамин Уркхарт
1

Рубин, 73 42 байта

a=gets
a.length!=0?a.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}:'falsey value'

Редактировать: Поскольку значение Falsey выглядит так, как будто оно не требуется:

gets.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}
Макс Лангерак
источник
1
Максимальный отступ составляет 2 символа, поэтому '_'*2будет достаточно, для которого литерал '__'короче. Но если добавить отступы заранее , то просто не совпадают Куски короче 3 -х символов, короче: puts"#{gets}__".scan /.../. (Обратите внимание , что без явного печати , которая считается irbне ruby.)
manatwork
1

Баш , 90 байт

При этом используются функции Bash, а не комбинация более традиционных команд оболочки Bourne плюс * nix (одна из созданных мною версий имела размер 205 байт). Я обманул, используя хитрость добавления двух символов _ в строку.

c=;read a;a=${a}__;while (($(echo ${#a})>2));do b=${a:0:3};c=$c\ $b;a=${a#$b};done;echo $c

Попробуйте онлайн!

PJF
источник
1

GNU sed , 27 байт

s:$:__:
s:...:& :g
s: _*$::

Попробуйте онлайн!

С вводом пустой строки становится немного сложнее, так как sed не имеет значения ложного значения. Поэтому, чтобы справиться с этим, я предоставлю вам две возможные интерпретации правил для подтверждения моего представления:


О. Вы, по сути, ничего не предоставляете в качестве входных данных, даже завершающий перевод строки (как это имеет место со всеми примерами, включая этот файл размером 6 Мб).

Использование:

echo -n ""|sed -f script

Вывод: ничего не печатается, потому что sed даже не запускает скрипт без ввода.


B. Можно считать ложным значением для sed уникальную строку, т. Е. Возвращаемую только в том случае, если вход является пустой строкой.

Использование:

echo ""|sed -f script

Выход:

__

Я предпочитаю первое толкование гораздо больше, так как считаю, что оно наиболее близко к намеченному правилу, но последнее поможет, если вы запустите скрипт, используя эту ссылку TIO.

seshoumara
источник
0

Атташе , 34 23 байта

PadRight&"_"&3=>@Chop&3

Попробуйте онлайн!

Объяснение (устарело)

{On[#_-1,PadRight&"_"&3,_]}@Chop&3
                           @Chop&3    chop the input string into groups of 3s
{On[#_-1               ,_]}           on the last group
        ,PadRight                         pad it
                     &3                   to length three
                 &"_"                     with underscores
Конор О'Брайен
источник
Сохраните ли вы что-нибудь, заполнив все элементы, а не только последний?
Лохматый
@ Шэгги Хорошая мысль! Я посмотрю на это
Конор О'Брайен
0

Уголь , 10 байт

E⪪S³…⁺ι__³

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

  S         Input string
 ⪪ ³        Split into groups of up to 3 characters
E           Map over each group
      ι     Current group
     ⁺      Concatenated with
       __   Literal `__`
    …    ³  Moulded to length 3
            Each group implicitly printed on its own line
Нил
источник
0

Befunge-93 , 30 29 байт

~:1+%,~:1+!"`"*+,~:1+!"`"*+,,

Попробуйте онлайн!

Ничего не выводит для пустого ввода, в противном случае выводятся строки длиной 3, разделенные символами NUL.

Объяснение:

Вставить символ ввода в стек
 : 1+ Дублируйте ввод и добавьте 1
    % По модулю 2 верхних значения стека и результата push
                                Если вход был -1 (конец потока), вычислите -1% 0 -> останов
                                В противном случае рассчитать вход% (вход + 1) -> вход
     , Поп и выходной персонаж
      Вставить символ ввода в стек
       : 1+! Дублируйте ввод, добавьте 1 и выполните логическое НЕ
           "` "* Умножить на 96 (код ASCII для '`')
                                Это возвращает 96 или 0 в зависимости от результата НЕ
               + Добавить 2 верхних значения из стека и отправить результат
                                Если ввод был -1 (конец потока), нажимает -1 + 96 = 95 или код ASCII для '_'
                                В противном случае нажимает ввод + 0
                , Поп и выходной персонаж
                 ~: 1 +! "` "* +, Снова тот же блок для обработки третьего символа
                            , Выведите символ NUL (стек пуст, поэтому извлечение из стека просто возвращает 0)

Указатель инструкций оборачивается в конце, зацикливая всю строку.
минус семь
источник