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 .


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




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


@ 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.


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


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

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 !.)




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



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

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

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

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!



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.




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

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

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

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ę.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.