Podziel się na trzy!

16

Biorąc pod uwagę ciąg, musisz podzielić go na grupy po trzy znaki (przez wypełnienie _na końcu).

Powiązane , ale wciąż jest inaczej.


Przykładowe I / O:

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

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

  • '' -> [] or falsey value

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

  • Ciąg 6 MB

To jest , więc wygra najmniej bajtów!

Edycja: W końcu dane wyjściowe są nieograniczone .

Rahul Verma
źródło
10
Dlaczego specjalny przypadek pusty ciąg? Czy możemy wybrać, którą postać użyć do wypełnienia?
Kudłaty
12
Tak więc zadanie jest następujące: biorąc pod uwagę ciąg, zwróć wartość falsey, jeśli jest pusta, w przeciwnym razie podziel ją na grupy trzy, w razie potrzeby wypełnij podkreśleniami ? Wygląda na dziwną parę dwóch niezwiązanych ze sobą zadań (sprawdzanie długości łańcucha i dzielenie).
Adám
15
Czego należy unikać: wyjątkowe przypadki na krawędzi . W takim przypadku pusty ciąg znaków powinien zwrócić pustą tablicę lub jej odpowiednik, a nie wartość falsey
Jo King
6
Wiele języków o typie statycznym nie może zwrócić więcej niż jednego typu z funkcji
Embodiment of Ignorance
4
@manassehkatz Tak, ale tylko w tych językach. W niektórych językach sprawia, że ​​rozwiązania są znacznie bardziej skomplikowane, a nawet niemożliwe (np. Języki o typie statycznym).
Jo King

Odpowiedzi:

8

Python 3, 58 47 34 bajtów

Jestem pewien, że ktoś inny może zrobić lepiej. Ktoś inny zrobił to lepiej. Dzięki Jo King za -11 -24 bajty!

Wyjście jest nieograniczone, witaj w krotce piekła. Zwraca pustą listę ( fałsz ) przy pustych danych wejściowych

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

TIO

Benjamin Urquhart
źródło
5

Perl 5 , 16 15 bajtów

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

Wypróbuj online!

Kjetil S.
źródło
1
15 z "@_\__"=~/.../g. Były inne 16: (pop.__)=~/.../glub map/.../g,pop.__.
Grimmy,
1
Dziękuję @Grimy za wskazówkę na temat \. Ogolił się 1 bajt i nauczyłem się czegoś nowego.
Kjetil S.
4

APL + WIN 36 24 22 bajtów

12 bajtów zapisanych w wyniku ograniczenia wyjścia i użycia kodu w pierwszym komentarzu @ Adám zmodyfikowanym do pracy w APL + WIN oraz kolejnych 2 z drugim komentarzem. Dzięki.

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

Monituje o wprowadzenie ciągu i wyświetla wynik jako tablicę nx3

Wypróbuj online! Dzięki uprzejmości Dyalog Classic

Graham
źródło
@ Adám. Zgłasza błąd domeny w APL + WIN po prawej stronie ⍴
Graham
Nie działa '', nie? Myślę, że OP (z jakiegoś dziwnego powodu) wymaga wyniku 0(z dowolną rangą).
Adám
1
@ Adám Wytwarza tablicę 0 x 3. Wygląda na to, że OP chce „falsey” dla wartości zerowej. Z uwagi na to, że specyfikacja ciągle się zmienia, zamierzam się w tym momencie pokłonić i pozostawić swoją odpowiedź na tym etapie! Dzięki za ulepszenia.
Graham
3

Perl 6 , 19 bajtów

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

Wypróbuj online!

Wypełnia ciąg dwoma znakami podkreślenia, a następnie dzieli ciąg na fragmenty trzech znaków. Zwraca jako tablicę obiektów dopasowania.

Jo King
źródło
3

Japt , 8 bajtów

+1 bajt do specjalnego przypadku pusty ciąg. Może uratować 2, jeśli możemy wybrać naszą postać wypełniającą.

©ò3 ú'_3

Spróbuj

©ò3 ú'_3     :Implicit input of string
©            :Logical AND with
 ò3          :Split into chunks of 3
    ú'_3     :Right pad each with "_" to length 3
Kudłaty
źródło
2

Stax , 7 bajtów

é☻εgP▀╪

Uruchom i debuguj

W przypadku pustego ciągu wejściowego wynikiem jest pusta tablica, która jest wartością falsey w stax.

rekurencyjny
źródło
2

CJam , 11 bajtów

q'_3*+3/);p

Wypróbuj online!

W przypadku pustych danych wejściowych daje to pusty ciąg znaków, co jest fałszem.

Jak to działa

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
źródło
2

Retina 0.8.2 , 10 bajtów

$
__
!`...

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

$
__

Dołącz dwa _s, na wypadek gdyby ostatnia grupa musiała zostać uzupełniona.

!`...

Dopasuj jak najwięcej grup po trzy, generując same dopasowania, a nie liczbę. (W Retinie 1 byłoby to Lzamiast !.)

Neil
źródło
2

C (gcc) , 67 bajtów

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

Wypróbuj online!

Zawsze zwraca wartość falsey (0).

attinat
źródło
1
Czy w ogóle musisz coś zwrócić?
ceilingcat
63 bajty
Johan du Toit
2

Wolfram Language (Mathematica) , 28 21 bajtów

-7: Nie wymaga już Falsewartości falsy ( ) na pustych danych wejściowych

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

Wypróbuj online!

Pobiera na wejściu listę znaków. Zwraca listę 3 krotek znaków wypełnionych Blanks ( _).


34 27 bajtów

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

Wypróbuj online!

Ciąg wejściowy, lista ciągów wyjściowych

attinat
źródło
1

Galaretka , 9 bajtów

s3o€“___”

Monadyczny link akceptujący listę znaków, który daje listę list znaków (puste wejście daje puste wyjście).

Wypróbuj online!

W jaki sposób?

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

Uwagi:
Jest to konieczne tylko do obsługi przypadku krawędzi pustego wejścia.
Pełny program może upuścić końcowy ciąg , ale tutaj nie możemy tego zrobić, ponieważ zachowanie pełnego programu podczas drukowania rozbija wszystko razem.


Odpowiednik 9:

o3ÐƤ“___”

Spróbuj


Alternatywa 9:

;“___”s3Ṗ

Spróbuj

Jonathan Allan
źródło
1

Java 10, 116 113 bajtów

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

Wypróbuj online.

Lub 104 101 bajtów, jeśli pusta tablica zamiast falsejest dozwolona jako dane wyjściowe.

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

Wypróbuj online.

Wyjaśnienie:

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
źródło
Pusta tablica jest teraz dozwolona
Benjamin Urquhart
1

Ruby, 73 42 bajty

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

Edycja: Jak wygląda wartość falsey, nie jest wymagana:

gets.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}
Max Langerak
źródło
1
Maksymalne dopełnienie składa się z 2 znaków, więc '_'*2wystarczyłoby, dla których literał '__'jest krótszy. Ale jeśli dodać dopełnienie wcześniej po prostu nie pasuje do kawałków krótszy niż 3 znaki, jest krótszy: puts"#{gets}__".scan /.../. (Należy pamiętać, że bez wyraźnego druku, które uważa się za irbnie ruby.)
manatwork
1

C # (interaktywny kompilator Visual C #) , 74 bajty

Wystarczy dodać dwa podkreślenia „_” na końcu wejścia, aby upewnić się, że zostaną wydrukowane, jeśli długość wejścia nie jest 3-krotna.

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

Wypróbuj online!

Innat3
źródło
67
dana
57
mój zaimek to monicareinstate
1

C (gcc) , 55 bajtów

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

Wypróbuj online!

l4m2
źródło
Używanie 9 ( \t) zamiast 10 ( \n) powinno być w porządku, ale to nie jest główny punkt
l4m2
1

C (clang) , 128 126 94 67 bajtów

67 bajtów dzięki @ceilingcat

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

Wypróbuj online!

kamienny pajęczak
źródło
1

Bash , 90 bajtów

Wykorzystuje to funkcje Bash, a nie kombinację bardziej tradycyjnej powłoki Bourne'a oraz poleceń * nix (które utworzyłem w jednej wersji z 205 bajtami). Oszukiwałem, stosując unik dodawania dwóch znaków _ do łańcucha.

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

Wypróbuj online!

PJF
źródło
1

GNU sed , 27 bajtów

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

Wypróbuj online!

Robi się nieco trudniej, jeśli chodzi o wprowadzanie pustych ciągów, ponieważ sed nie ma znaczenia wartości fałszowania. Aby sobie z tym poradzić, przedstawiam dwie możliwe interpretacje zasad w celu potwierdzenia mojego zgłoszenia:


O. Zasadniczo nie podajesz nic jako danych wejściowych, nawet końcowego nowego wiersza (jak ma to miejsce we wszystkich przykładach, w tym w pliku 6 Mb).

Stosowanie:

echo -n ""|sed -f script

Dane wyjściowe: nic nie jest drukowane, ponieważ sed nawet nie uruchamia skryptu bez danych wejściowych.


B. Za wartość fałszowania dla sed można uznać unikalny ciąg, tzn. Zwracany tylko wtedy, gdy wejście jest pustym ciągiem.

Stosowanie:

echo ""|sed -f script

Wynik:

__

Wolę pierwszą interpretację o wiele bardziej, ponieważ uważam, że jest ona najbliższa zamierzonej regule, ale ostatnia pomaga, jeśli uruchomisz skrypt za pomocą tego łącza TIO.

seshoumara
źródło
0

Attache , 34 23 bajtów

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

Wypróbuj online!

Wyjaśnienie (nieaktualne)

{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
źródło
Czy ocaliłbyś coś, wypełniając wszystkie elementy zamiast tylko ostatniego?
Kudłaty
@Shaggy Dobra uwaga! Zajmę się tym
Conor O'Brien
0

Węgiel drzewny , 10 bajtów

E⪪S³…⁺ι__³

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

  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
źródło
0

Scala , 31 bajtów

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

Wypróbuj online!

Wyjaśnienie

(s+"___")       // add "___"
  .grouped(3)   // make groups of 3
  .toSeq        // change to Seq
  .init         // take all but last
pme
źródło
0

Befunge-93 , 30 29 bajtów

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

Wypróbuj online!

Nie wyświetla nic dla pustych danych wejściowych, w przeciwnym razie wyświetla łańcuchy o długości 3 oddzielone znakami NUL.

Wyjaśnienie:

~ Wciśnij znak wejścia na stos
 : 1+ Zduplikowane dane wejściowe i dodaj 1
    % 2 najwyższych wartości Modulo stosu i wyniku wypychania
                                Jeśli wartość wejściowa wynosiła -1 (koniec strumienia), oblicz -1% 0 -> zatrzymaj
                                W przeciwnym razie oblicz wejście% (wejście + 1) -> wejście
     , Pop i postać wyjściowa
      ~ Wciśnij znak wejścia na stos
       : 1+! Zduplikuj dane wejściowe, dodaj 1 i wykonaj logiczne NIE
           „” „* Pomnóż przez 96 (kod ASCII dla„ ”)
                                Zwraca 96 lub 0 w zależności od wyniku NOT
               + Dodaj 2 najwyższe wartości ze stosu i pchnij wynik
                                Jeśli wartością wejściową było -1 (koniec strumienia), wypycha -1 + 96 = 95 lub kod ASCII dla „_”
                                W przeciwnym razie popycha wejście + 0
                , Pop i postać wyjściowa
                 ~: 1 +! "'" * +, Ponownie ten sam blok, aby obsłużyć trzeci znak
                            , Wypisuje znak NUL (stos jest pusty, więc wyskakiwanie ze stosu zwraca 0)

Wskaźnik instrukcji zawija się na końcu, zapętlając całą linię.
ujemna siódemka
źródło