Dibagi menjadi tiga!

16

Diberikan string, Anda harus membaginya menjadi kelompok-kelompok tiga karakter (oleh padding _di akhir).

Terkait , tapi tetap saja berbeda.


Sampel I / O:

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

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

  • '' -> [] or falsey value

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

  • 6 MB string

Ini adalah , sehingga byte paling sedikit akan menang!

Sunting: Akhirnya, output tidak dibatasi .

Rahul Verma
sumber
10
Mengapa case khusus string kosong? Bisakah kita memilih karakter mana yang akan digunakan untuk padding?
Shaggy
12
Jadi tugasnya sebenarnya: Diberikan string, kembalikan nilai falsey jika kosong, jika tidak pisahkan menjadi tiga kelompok, padding dengan garis bawah jika perlu ? Sepertinya pasangan ganjil dari dua tugas yang tidak terkait (memeriksa panjang string dan pemisahan).
Adám
14
Hal-hal yang harus dihindari: Kasus tepi luar biasa . Dalam hal ini, string kosong harus mengembalikan array kosong atau setara, bukan nilai falsey
Jo King
6
Banyak bahasa yang diketik secara statis tidak dapat mengembalikan lebih dari satu jenis dari suatu fungsi
Perwujudan Ketidaktahuan
4
@manassehkatz Ya, tetapi hanya dalam bahasa - bahasa itu. Dalam beberapa bahasa itu membuat solusi jauh lebih rumit, atau bahkan tidak mungkin (misalnya bahasa yang diketik secara statis).
Jo King

Jawaban:

9

05AB1E , 9 8 byte

…___«3ô¨

Cobalah online! atau sebagai Test Suite

Penjelasan

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

Python 3, 58 47 34 byte

Saya yakin orang lain bisa berbuat lebih baik. Orang lain melakukannya dengan lebih baik. Terima kasih Jo King untuk -11 -24 bytes!

Output tidak dibatasi, selamat datang di tuple hell. Mengembalikan daftar kosong ( falsy ) pada input kosong

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

TIO

Benjamin Urquhart
sumber
6

JavaScript, 25 byte

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

Cobalah

Shaggy
sumber
5

Perl 5 , 16 15 byte

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

Cobalah online!

Kjetil S.
sumber
1
15 dengan "@_\__"=~/.../g. Ada 16 lainnya: (pop.__)=~/.../gatau map/.../g,pop.__.
Grimmy
1
Terima kasih kepada @Grimy untuk tipnya \. Ini mencukur 1 byte dan saya belajar sesuatu yang baru.
Kjetil S.
4

APL + WIN 36 24 22 byte

12 byte disimpan sebagai hasil dari output yang sekarang dibatasi dan menggunakan kode dalam komentar pertama @ Adm dimodifikasi untuk bekerja di APL + MENANG dan 2 selanjutnya dengan komentar kedua. Terima kasih.

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

Meminta input string dan menampilkan hasilnya sebagai array nx3

Cobalah online! Atas perkenan Dyalog Classic

Graham
sumber
@ Adám. Melempar kesalahan domain di APL + MENANG di paling kanan ⍴
Graham
Gagal '', bukan? Saya pikir OP (untuk beberapa alasan aneh) membutuhkan hasilnya 0(dengan peringkat apa pun).
Adám
1
@ Adám Ini menghasilkan array 0 x 3. OP sekarang tampaknya menginginkan "falsey" untuk input nol. Dengan spek terus berubah saya akan menyerah pada titik ini dan meninggalkan jawaban saya sebagai teguh! Terima kasih atas peningkatan Anda.
Graham
4

JavaScript, 51 50 48 27 25

b=>(b+"__").match(/.../g)

Cobalah online!

VFDan
sumber
Selamat datang di PPCG! :) Tapi ... codegolf.stackexchange.com/a/185808/58974
Shaggy
@Shaggy Aku bahkan tidak melihat itu ¯ \ _ (ツ) _ / ¯
VFDan
Jangan khawatir, itu terjadi.
Shaggy
3

Perl 6 , 19 byte

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

Cobalah online!

Pads string dengan dua garis bawah kemudian membagi string menjadi potongan tiga karakter. Kembali sebagai array objek Match.

Jo King
sumber
3

Japt , 8 byte

+1 byte untuk kasus khusus string kosong. Dapat menyimpan 2 jika kita dapat memilih karakter padding kami.

©ò3 ú'_3

Cobalah

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

CJam , 11 byte

q'_3*+3/);p

Cobalah online!

Untuk input kosong ini menghasilkan string kosong, yang palsu.

Bagaimana itu bekerja

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
sumber
2

Retina 0.8.2 , 10 byte

$
__
!`...

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

$
__

Tambahkan dua _s, jika kelompok terakhir perlu diisi.

!`...

Cocokkan sebanyak mungkin kelompok yang terdiri dari tiga orang, mengeluarkan pertandingan itu sendiri dan bukan menghitungnya. (Dalam Retina 1 ini akan menjadi Lbukan !.)

Neil
sumber
2

C (gcc) , 67 byte

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

Cobalah online!

Selalu mengembalikan nilai falsey (0).

attinat
sumber
1
Apakah Anda perlu mengembalikan apa pun?
ceilingcat
63 byte
Johan du Toit
2

Bahasa Wolfram (Mathematica) , 28 21 byte

-7: Tidak lagi membutuhkan nilai falsy ( False) pada input kosong

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

Cobalah online!

Mengambil daftar karakter sebagai input. Mengembalikan daftar 3-tupel karakter yang diisi dengan Blanks ( _).


34 27 byte

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

Cobalah online!

Input string, daftar output string

attinat
sumber
1

Jelly , 9 byte

s3o€“___”

Tautan monadik yang menerima daftar karakter yang menghasilkan daftar daftar karakter (input kosong menghasilkan output kosong).

Cobalah online!

Bagaimana?

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

Catatan:
Ini hanya diperlukan untuk menangani kasus tepi input kosong.
Program lengkap dapat menghilangkan jejak , tetapi di sini kita tidak dapat melakukan itu karena perilaku pencetakan dari program lengkap menghancurkan semuanya bersama-sama.


Setara 9:

o3ÐƤ“___”

Cobalah


Alternatif 9:

;“___”s3Ṗ

Cobalah

Jonathan Allan
sumber
1

Java 10, 116 113 byte

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

Cobalah online.

Atau 104 101 byte jika array kosong bukan falsedibolehkan sebagai output ..

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

Cobalah online.

Penjelasan:

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
sumber
Array kosong sekarang diizinkan
Benjamin Urquhart
1

Ruby, 73 42 byte

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

Sunting: Karena nilai falsey sepertinya tidak diperlukan:

gets.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}
Max Langerak
sumber
1
Padding maksimum adalah 2 karakter, jadi '_'*2akan cukup, untuk yang literal '__'lebih pendek. Tapi jika Anda menambahkan padding di muka maka cukup tidak cocok dengan potongan yang lebih pendek dari 3 karakter, lebih pendek: puts"#{gets}__".scan /.../. (Perhatikan bahwa tanpa pencetakan eksplisit yang dianggap irbtidak ruby.)
manatwork
1

C # (Visual C # Interactive Compiler) , 74 byte

Cukup tambahkan dua garis bawah '_' di akhir input untuk memastikan mereka dicetak jika panjang input bukan faktor 3.

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

Cobalah online!

Innat3
sumber
67
dana
57
kata ganti saya adalah monicareinstate
1

Kotlin , 34 byte

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

Cobalah online!

siput_
sumber
ini tidak berhasil, coba{"${it}___".chunked(3).dropLast(1)}
pme
1

C (gcc) , 55 byte

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

Cobalah online!

l4m2
sumber
Menggunakan 9 ( \t) bukannya 10 ( \n) seharusnya baik-baik saja, tapi itu bukan poin utama
l4m2
1

C (dentang) , 128 126 94 67 byte

67 byte berkat @ceilingcat

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

Cobalah online!

arakhnida batu
sumber
1

Bash , 90 byte

Ini menggunakan fitur Bash daripada kombinasi perintah Bourne shell plus * nix yang lebih tradisional (yang satu versi saya buat berakhir pada 205 byte). Saya curang dengan menggunakan dodge untuk menambahkan dua karakter _ ke string.

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

Cobalah online!

PJF
sumber
1

GNU sed , 27 byte

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

Cobalah online!

Ia mendapat sedikit rumit mengenai input string kosong, karena sed tidak memiliki arti nilai palsu. Jadi untuk mengatasi ini, saya memberi Anda dua kemungkinan interpretasi aturan untuk memvalidasi kiriman saya:


A. Anda pada dasarnya tidak memberikan apa-apa sebagai input, bahkan baris baru (seperti halnya semua contoh, termasuk file 6 Mb).

Pemakaian:

echo -n ""|sed -f script

Output: tidak ada yang dicetak, karena sed bahkan tidak menjalankan skrip tanpa input.


B. Seseorang dapat menganggap nilai palsu untuk sed sebagai string unik, yaitu, dikembalikan hanya ketika inputnya adalah string kosong.

Pemakaian:

echo ""|sed -f script

Keluaran:

__

Saya lebih suka interpretasi pertama jauh lebih banyak, karena saya percaya itu yang paling dekat dengan aturan yang dimaksud, tetapi yang terakhir membantu jika Anda menjalankan skrip menggunakan tautan TIO itu.

seshoumara
sumber
0

Jelly , 10 byte

s3;€⁾__ḣ€3

Cobalah online!

Rasanya seperti 8 atau 9 seharusnya dimungkinkan, tetapi belum menemukannya.

Nick Kennedy
sumber
0

Attache , 34 23 byte

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

Cobalah online!

Penjelasan (kedaluwarsa)

{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
sumber
Apakah Anda menyimpan sesuatu dengan menambahkan semua elemen, bukan hanya yang terakhir?
Shaggy
@Shaggy Poin bagus! Saya akan memeriksanya
Conor O'Brien
0

Arang , 10 byte

E⪪S³…⁺ι__³

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

  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
sumber
0

Scala , 31 byte

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

Cobalah online!

Penjelasan

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

Befunge-93 , 30 29 byte

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

Cobalah online!

Tidak menghasilkan apa-apa untuk input kosong, jika tidak menghasilkan string dengan panjang 3 dipisahkan oleh karakter NUL.

Penjelasan:

~ Mendorong karakter input ke stack
 : 1+ Input duplikat dan tambahkan 1
    % Modulo nilai atas 2 hasil stack dan push
                                Jika input -1 (ujung aliran), hitung -1% 0 -> berhenti
                                Kalau tidak, hitung input% (input + 1) -> input
     , Pop dan karakter keluaran
      ~ Mendorong karakter input ke stack
       : 1+! Input duplikat, tambahkan 1 dan lakukan TIDAK logis
           "` "* Kalikan dengan 96 (kode ASCII untuk '`')
                                Ini mengembalikan 96 atau 0 tergantung pada hasil TIDAK
               + Tambahkan 2 nilai teratas dari tumpukan dan dorong hasilnya
                                Jika inputnya -1 (ujung aliran), tekan -1 + 96 = 95, atau kode ASCII untuk '_'
                                Jika tidak, tekan input + 0
                , Pop dan karakter keluaran
                 ~: 1 +! "` "* +, Blok yang sama lagi untuk menangani karakter ketiga
                            , Keluarkan karakter NUL (tumpukan kosong, jadi muncul dari tumpukan hanya mengembalikan 0)

Penunjuk instruksi membungkus di akhir, melingkari seluruh baris.
negatif tujuh
sumber