Dividido em três!

16

Dada uma sequência, você deve dividi-la em grupos de três caracteres (preenchendo _no final).

Relacionado , mas ainda assim é diferente.


E / S de amostra:

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

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

  • '' -> [] or falsey value

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

  • Sequência de 6 MB

Este é um , portanto, o menor número de bytes vencerá!

Edit: Finalmente, a saída é irrestrita .

Rahul Verma
fonte
10
Por que caso especial a string vazia? Podemos escolher qual personagem usar para o preenchimento?
21819 Shaggy
12
Portanto, a tarefa é realmente: dada uma string, retorne um valor de falsey se estiver vazio; caso contrário, divida-o em grupos de três, preenchendo com sublinhados, se necessário ? Parece um par ímpar de duas tarefas não relacionadas (verificação do comprimento e divisão da string).
Adám 19/05/19
14
Coisas a evitar: Casos extremos excepcionais . Neste caso, uma seqüência vazia deve returnan array vazio ou equivalente, e não um valor Falsey
Jo rei
6
Lotes de línguas estaticamente tipado não pode retornar mais de um tipo de uma função
Personificação da Ignorância
4
@manassehkatz Sim, mas apenas nesses idiomas. Em algumas línguas, isso torna as soluções muito mais complicadas ou mesmo impossíveis (por exemplo, linguagens de tipo estaticamente).
Jo Rei

Respostas:

9

05AB1E , 9 8 bytes

…___«3ô¨

Experimente online! ou como um conjunto de testes

Explicação

…___«      # append "___" to input
     3ô    # split into groups of 3
       ¨   # discard the last group
Emigna
fonte
8

Python 3, 58 47 34 bytes

Tenho certeza que alguém pode fazer melhor. Alguém fez melhor. Obrigado Jo King por -11 -24 bytes!

A saída é irrestrita, bem-vindo ao tuple inferno. Retorna lista vazia ( falsy ) na entrada vazia

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

TIO

Benjamin Urquhart
fonte
6

JavaScript, 25 bytes

s=>`${s}__`.match(/.../g)

Tente

Shaggy
fonte
5

Perl 5 , 16 15 bytes

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

Experimente online!

Kjetil S.
fonte
1
15 com "@_\__"=~/.../g. Havia outros 16s: (pop.__)=~/.../gou map/.../g,pop.__.
Grimmy
1
Thx to @Grimy para a dica em \. Raspou 1 byte e eu aprendi algo novo.
Kjetil S.
4

APL + WIN 36 24 22 bytes

12 bytes salvos como resultado da saída sendo agora restrita e usando o código no primeiro comentário de @ Adám modificado para funcionar em APL + WIN e mais 2 com seu segundo comentário. Obrigado.

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

Solicita a entrada da sequência e gera o resultado como uma matriz nx3

Experimente online! Cortesia de Dyalog Classic

Graham
fonte
@Adão. Lança um erro de domínio na APL + WIN no direito mais ⍴
Graham
Falha '', não? Eu acho que OP (por algum motivo estranho) exige que o resultado seja 0(com qualquer classificação).
Adám 19/05/19
1
@ Adám Produz uma matriz 0 x 3. O OP agora parece querer "falsey" para uma entrada nula. Com as especificações mudando, vou me curvar neste momento e deixar minha resposta como está! Obrigado por suas melhorias.
Graham
3

Perl 6 , 19 bytes

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

Experimente online!

Almofada a cadeia por dois sublinhados e depois divide a cadeia em pedaços de três caracteres. Retorna como uma matriz de objetos Match.

Brincadeira
fonte
3

Japonês , 8 bytes

+1 byte para o caso especial da string vazia. Pode salvar 2 se pudermos escolher nosso personagem de preenchimento.

©ò3 ú'_3

Tente

©ò3 ú'_3     :Implicit input of string
©            :Logical AND with
 ò3          :Split into chunks of 3
    ú'_3     :Right pad each with "_" to length 3
Shaggy
fonte
2

Stax , 7 bytes

é☻εgP▀╪

Execute e depure

Para uma entrada de sequência vazia, o resultado é uma matriz vazia, que é um valor falsey em stax.

recursivo
fonte
2

CJam , 11 bytes

q'_3*+3/);p

Experimente online!

Para entrada vazia, isso fornece uma string vazia, o que é falso.

Como funciona

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
Luis Mendo
fonte
2

Retina 0.8.2 , 10 bytes

$
__
!`...

Experimente online! O link inclui casos de teste. Explicação:

$
__

Anexe dois _s, caso o último grupo precise ser preenchido.

!`...

Faça a correspondência do maior número possível de grupos de três, produzindo as correspondências em si e não a contagem. (Na Retina 1, isso seria em Lvez de !.)

Neil
fonte
2

C (gcc) , 67 bytes

i;f(char*_){for(;*_;puts(""))for(i=3;i--;)putchar(*_?*_++:95);_=0;}

Experimente online!

Sempre retorna um valor de falsey (0).

attinat
fonte
1
Você precisa mesmo devolver alguma coisa?
ceilingcat
63 bytes
Johan du Toit
2

Wolfram Language (Mathematica) , 28 21 bytes

-7: Não requer mais o Falsevalor falsy ( ) na entrada vazia

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

Experimente online!

Leva uma lista de caracteres como entrada. Retorna uma lista de três tuplas de caracteres preenchidos com Blanks ( _).


34 27 bytes

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

Experimente online!

Entrada de string, lista de saída de strings

attinat
fonte
1

Geléia , 9 bytes

s3o€“___”

Um link monádico que aceita uma lista de caracteres que produz uma lista de listas de caracteres (uma entrada vazia produz uma saída vazia).

Experimente online!

Quão?

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

Notas:
A é somente necessário para manusear o caso extremo de uma entrada vazio.
Um programa completo pode deixar um rasto , mas aqui não podemos fazer isso, pois o comportamento de impressão de um programa completo esmaga tudo.


Equivalente 9:

o3ÐƤ“___”

Tente


Alternativa 9:

;“___”s3Ṗ

Tente

Jonathan Allan
fonte
1

Java 10, 116 113 bytes

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;}

Experimente online.

Ou 104 101 bytes se uma matriz vazia em vez de falsefor permitida como saída.

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;}

Experimente online.

Explicação:

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
Kevin Cruijssen
fonte
Uma matriz vazia agora é permitida
Benjamin Urquhart
1

Ruby, 73 42 bytes

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

Edit: Como o valor de falsey parece que não é necessário:

gets.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}
Max Langerak
fonte
1
O preenchimento máximo é de 2 caracteres, portanto, '_'*2seria suficiente, para o qual um literal '__'é menor. Mas se você adicionar o preenchimento antecipadamente, simplesmente não corresponderá às peças menores que 3 caracteres, será menor:puts"#{gets}__".scan /.../ . (Note-se que, sem a impressão explícito que é considerado irbnão ruby.)
manatwork
1

C # (compilador interativo do Visual C #) , 74 bytes

Basta anexar dois sublinhados '_' no final da entrada para garantir que sejam impressos se o comprimento da entrada não for um fator 3.

s=>Enumerable.Range(0,(s.Length+2)/3).Select(i=>(s+"__").Substring(i*3,3))

Experimente online!

Innat3
fonte
67
dana
57
meu pronome é monicareinstate
1

Kotlin , 34 bytes

{"${it}__".chunked(3).dropLast(1)}

Experimente online!

Caracol_
fonte
isso não funciona, tente{"${it}___".chunked(3).dropLast(1)}
pme
1

C (gcc) , 55 bytes

i;f(char*s){for(;i%4|*s;)putchar(++i%4?*s?*s++:95:10);}

Experimente online!

l4m2
fonte
Usando 9 ( \t) em vez de 10 ( \n) deve estar bem, mas isso não é ponto principal
l4m2
1

C (clang) , 128 126 94 67 bytes

67 bytes graças a @ceilingcat

f(char*k){for(;*k;k++)printf("%c%c%c\n",*k,*++k?*k:95,*++k?*k:95);}

Experimente online!

um aracnídeo de pedra
fonte
1

Bater , 90 bytes

Isso usa os recursos do Bash em vez de uma combinação dos comandos mais tradicionais do shell Bourne mais * nix (que uma versão que eu criei terminou em 205 bytes). Eu trapacei usando a esquiva de adicionar dois caracteres _ à string.

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

Experimente online!

PJF
fonte
1

GNU sed , 27 bytes

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

Experimente online!

Fica um pouco complicado em relação à entrada da string vazia, pois sed não tem significado para um valor falso. Portanto, para lidar com isso, forneço duas interpretações possíveis das regras para validar minha submissão:


UMA. Você essencialmente não fornece nada como entrada, nem mesmo uma nova linha final (como é o caso de todos os exemplos, incluindo o arquivo de 6 Mb).

Uso:

echo -n ""|sed -f script

Saída: nada é impresso, porque o sed nem mesmo executa o script sem entrada.


B. Pode-se considerar como valor falso o sed como uma string única, ou seja, retornada apenas quando a entrada for uma string vazia.

Uso:

echo ""|sed -f script

Resultado:

__

Prefiro muito mais a primeira interpretação, pois acredito que ela seja a mais próxima da regra pretendida, mas a última ajuda se você executar o script usando esse link TIO.

seshoumara
fonte
0

Anexo , 34 23 bytes

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

Experimente online!

Explicação (desatualizada)

{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
Conor O'Brien
fonte
Você economizaria alguma coisa preenchendo todos os elementos em vez de apenas o último?
Salsicha
@Shaggy Bom ponto! Vou dar uma olhada nele
Conor O'Brien
0

Carvão , 10 bytes

E⪪S³…⁺ι__³

Experimente online! Link é a versão detalhada do código. Explicação:

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

Scala , 31 bytes

(s+"___").grouped(3).toSeq.init

Experimente online!

Explicação

(s+"___")       // add "___"
  .grouped(3)   // make groups of 3
  .toSeq        // change to Seq
  .init         // take all but last
pme
fonte
0

Befunge-93 , 30 29 bytes

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

Experimente online!

Não gera nada para uma entrada vazia; caso contrário, gera seqüências de comprimento 3 separadas por caracteres NUL.

Explicação:

~ Empurre o caractere da entrada para empilhar
 : 1+ entrada duplicada e adicione 1
    % Do módulo entre os 2 principais valores do resultado da pilha e push
                                Se a entrada for -1 (final do fluxo), calcule -1% 0 -> parar
                                Caso contrário, calcule a entrada% (entrada + 1) -> entrada
     , Caractere pop e de saída
      ~ Empurre o caractere da entrada para empilhar
       : 1+! Entrada duplicada, adicione 1 e execute NOT lógico
           "` "* Multiplique por 96 (código ASCII para '' ')
                                Isso retorna 96 ou 0, dependendo do resultado do NOT
               + Adicione os 2 principais valores da pilha e empurre o resultado
                                Se a entrada foi -1 (final do fluxo), pressiona -1 + 96 = 95 ou o código ASCII para '_'
                                Caso contrário, empurra a entrada + 0
                , Caractere pop e de saída
                 ~: 1 +! "` "* +, Mesmo bloco novamente para manipular o terceiro caractere
                            , Gera um caractere NUL (a pilha está vazia, portanto, sair da pilha retorna apenas 0)

O ponteiro de instruções envolve no final, fazendo um loop em toda a linha.
sete negativos
fonte