Розділіть на три!


16

Давши рядок, ви повинні розділити його на групи з трьох символів (за допомогою прокладки _в кінці).

Пов’язане , але все-таки воно інше.


Зразок вводу / виводу:

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

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

  • '' -> [] or falsey value

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

  • 6 Мб рядок

Це , тому виграє найменше байтів!

Редагувати: Нарешті, вихід необмежений .


10
Чому особливий регістр порожній рядок? Чи можемо ми вибрати, який символ використовувати для прокладки?
Кошлатий

12
Отже, завдання є насправді: Давши рядок, поверніть значення фальси, якщо воно порожнє, інакше розділіть його на групи по три, при необхідності замінивши підкресленнями ? Схоже, непарна пара двох незв’язаних завдань (перевірка довжини рядка та розбиття).
Адам

15
Що слід уникати: виняткові краєвиди . У цьому випадку порожня рядок має повернути порожній масив або еквівалент, а не значення фальси
Jo King

6
Багато мов статичного типу не можуть повернути більше одного типу з функції
Втілення

4
@manassehkatz Так, але лише цими мовами. У деяких мовах це робить рішення набагато складнішими або навіть неможливими (наприклад, мови з статичним типом).
Джо Кінг

Відповіді:



8

Python 3, 58 47 34 байт

Я впевнений, що хтось може зробити краще, хтось краще зробив. Дякую Джо Кінгу за -11 -24 байти!

Вихід необмежений, ласкаво просимо в пекло. Повертає порожній список ( хибний ) на порожньому вході

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

ТІО




4

APL + WIN 36 24 22 байт

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

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

Запрошує ввести рядок і виводить результат у вигляді масиву nx3

Спробуйте в Інтернеті! Надано Dyalog Classic


@ Adám. Викидає помилку домену в APL + WIN найправіше ⍴
Грехем,

Не вдається '', ні? Я думаю, що ОП (з якоїсь дивної причини) вимагає, щоб результат був 0(з будь-яким рангом).
Адам

1
@ Adám Він створює масив 0 x 3. ОП, здається, хоче "фальсифікувати" для нульового введення. Зі специфікацією, що постійно змінюється, я збираюся поклонитися в цій точці і залишити свою відповідь як свою позицію! Дякуємо за ваші вдосконалення.
Грехем



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

Мова Вольфрама (Mathematica) , 28 21 байт

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

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

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

Візьме список символів як вхідний. Повертає список 3-х кортежів символів, наповнених Blanks ( _).


34 27 байт

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

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

Введення рядків, список вихідних рядків


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

Ruby, 73 42 байт

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

Редагувати: оскільки значення фальси виглядає, що воно не потрібно:

gets.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}

1
Максимальна кількість накладок - це два символи, так '_'*2що цього було б достатньо, для яких літерал '__'коротший. Але якщо додати відступи заздалегідь , то просто не збігаються Шматки коротше 3 -х символів, коротше: puts"#{gets}__".scan /.../. (Зауважте, що без явного друку, який вважається irbне ruby.)
маніпуляція





1

Баш , 90 байт

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

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

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



1

GNU sed , 27 байт

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

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

Він стає дещо хитрим щодо пустого введення рядка, оскільки sed не має значення хибного значення. Тож для вирішення цього питання я пропоную вам дві можливі інтерпретації правил, щоб підтвердити моє подання:


A. Ви по суті нічого не надаєте в якості вхідного даних, навіть не введений новий рядок (як це стосується всіх прикладів, включаючи файл 6 Мб).

Використання:

echo -n ""|sed -f script

Вихід: нічого не друкується, тому що sed навіть не запускає сценарій без введення.


Б. Можна вважати, що значення помилки для sed є унікальним рядком, тобто повертається лише тоді, коли вхід є порожнім рядком.

Використання:

echo ""|sed -f script

Вихід:

__

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




0

Attache , 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

Чи врятували б ви що-небудь, проклавши всі елементи замість лише останнього?
Кошлатий

@Shaggy Добрий момент! Я перегляну це
Конор О'Браєн



0

Befunge-93 , 30 29 байт

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

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

Не видає нічого для порожнього вводу, інакше виводиться рядки довжиною 3, розділені символами NUL.

Пояснення:

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

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