In drei Teile teilen!

16

Wenn Sie eine Zeichenfolge angegeben haben, müssen Sie sie in Gruppen von drei Zeichen aufteilen (durch Auffüllen _am Ende).

Verbunden , aber immer noch anders.


Beispiel-E / A:

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

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

  • '' -> [] or falsey value

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

  • 6 MB String

Dies ist ein , so dass nur wenige Bytes gewinnen!

Bearbeiten: Schließlich ist die Ausgabe uneingeschränkt .

rv7
quelle
10
Warum Sonderfall die leere Zeichenfolge? Dürfen wir wählen, welches Zeichen für das Auffüllen verwendet werden soll?
Shaggy
12
Die Aufgabe lautet also tatsächlich: Gibt bei einer gegebenen Zeichenfolge einen Falsey-Wert zurück, wenn dieser leer ist, oder teilt ihn in Dreiergruppen auf und füllt ihn bei Bedarf mit Unterstrichen auf ? Scheint wie eine ungerade Paarung von zwei unabhängigen Aufgaben (Überprüfung der String-Länge und Aufteilung).
Adám
14
Zu vermeidende Dinge: Außergewöhnliche Randfälle . In diesem Fall sollte eine leere Zeichenfolge ein leeres Array oder einen entsprechenden Wert und keinen falschen Wert zurückgeben
Jo King,
6
Viele statisch typisierte Sprachen können nicht mehr als einen Typ von einer Funktion zurückgeben
Verkörperung der Ignoranz
4
@manassehkatz Ja, aber nur in diesen Sprachen. In einigen Sprachen macht es Lösungen weitaus komplizierter oder sogar unmöglich (z. B. statisch typisierte Sprachen).
Jo King

Antworten:

8

Python 3, 58 47 34 Bytes

Ich bin sicher, jemand anderes kann es besser machen. Jemand anderes hat es besser gemacht. Danke Jo King für -11 -24 Bytes!

Die Ausgabe ist uneingeschränkt, willkommen zum Tupeln der Hölle. Gibt bei leerer Eingabe eine leere Liste ( falsch ) zurück

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

TIO

Benjamin Urquhart
quelle
5

Perl 5 , 16, 15 Bytes

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

Probieren Sie es online!

Kjetil S.
quelle
1
15 mit "@_\__"=~/.../g. Es gab andere 16er: (pop.__)=~/.../goder map/.../g,pop.__.
Grimmy
1
Vielen Dank an @Grimy für den Tipp auf \. Es hat 1 Byte verloren und ich habe etwas Neues gelernt.
Kjetil S.
4

APL + WIN 36 24 22 Bytes

12 Bytes wurden gespeichert, da die Ausgabe nun freigegeben wurde und der Code in @ Adáms erstem Kommentar verwendet wurde, der für APL + WIN geändert wurde, und weitere 2 Bytes mit seinem zweiten Kommentar. Vielen Dank.

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

Fordert zur Eingabe des Strings auf und gibt das Ergebnis als nx3-Array aus

Probieren Sie es online! Mit freundlicher Genehmigung von Dyalog Classic

Graham
quelle
@Adam. Wirft einen Domain-Fehler in APL + WIN ganz rechts ⍴
Graham
Scheitert an '', nein? Ich denke, OP (aus irgendeinem seltsamen Grund) erfordert, dass das Ergebnis 0(mit irgendeinem Rang) ist.
Adám,
1
@ Adám Erzeugt ein 0 x 3-Array. Das OP scheint nun "falsey" für eine Null-Eingabe zu wollen. Da sich die Spezifikation ständig ändert, werde ich mich an dieser Stelle verabschieden und meine Antwort unverändert lassen! Vielen Dank für Ihre Verbesserungen.
Graham
3

Perl 6 , 19 Bytes

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

Probieren Sie es online!

Füllt die Zeichenfolge mit zwei Unterstrichen auf und teilt sie dann in Abschnitte mit drei Zeichen auf. Gibt als Array von Match-Objekten zurück.

Scherzen
quelle
3

Japt , 8 Bytes

+1 Byte zum Sonderfall der leeren Zeichenkette. Kann 2 sparen, wenn wir unseren Füllcharakter wählen können.

©ò3 ú'_3

Versuch es

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

CJam , 11 Bytes

q'_3*+3/);p

Probieren Sie es online!

Bei leerer Eingabe wird ein leerer String ausgegeben, der falsch ist.

Wie es funktioniert

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

Retina 0.8.2 , 10 Bytes

$
__
!`...

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

$
__

Fügen Sie zwei _s hinzu, falls die letzte Gruppe aufgefüllt werden muss.

!`...

Ordnen Sie so viele Dreiergruppen wie möglich zu und geben Sie die Übereinstimmungen statt der Zählung selbst aus. (In Retina 1 wäre dies Lstatt !.)

Neil
quelle
2

C (gcc) , 67 Bytes

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

Probieren Sie es online!

Gibt immer einen Falsey-Wert (0) zurück.

attinat
quelle
1
Müssen Sie überhaupt etwas zurückgeben?
Ceilingcat
63 Bytes
Johan du Toit
1

Gelee , 9 Bytes

s3o€“___”

Ein monadischer Link, der eine Liste von Zeichen akzeptiert, die eine Liste von Listen von Zeichen ergibt (eine leere Eingabe ergibt eine leere Ausgabe).

Probieren Sie es online!

Wie?

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

Hinweise:
Das ist nur notwendig, um den Kantenfall einer leeren Eingabe zu behandeln.
Ein vollständiges Programm kann ein Trailing löschen , aber hier können wir das nicht tun, da das Druckverhalten eines vollständigen Programms alles zusammenbricht.


Äquivalent 9:

o3ÐƤ“___”

Versuch es


Alternative 9:

;“___”s3Ṗ

Versuch es

Jonathan Allan
quelle
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;}

Probieren Sie es online aus.

Oder 104 101 Bytes wenn statt falseals Ausgabe ein leeres Array erlaubt ist.

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

Probieren Sie es online aus.

Erläuterung:

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
quelle
Ein leeres Array ist jetzt zulässig
Benjamin Urquhart
1

Ruby, 73 42 Bytes

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

Bearbeiten: Da Falsey-Wert aussieht, als wäre er nicht erforderlich:

gets.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}
Max Langerak
quelle
1
Der maximale Abstand beträgt 2 Zeichen. Dies ist '_'*2ausreichend, da ein Literal '__'kürzer ist. Wenn Sie jedoch die Polsterung im Voraus hinzufügen, stimmen die Teile, die kürzer als 3 Zeichen sind, einfach nicht überein puts"#{gets}__".scan /.../. (Beachten Sie, dass ohne den expliziten Druck, der irbnicht berücksichtigt wird ruby.)
Manatwork
1

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

Fügen Sie einfach zwei Unterstriche '_' am Ende der Eingabe hinzu, um sicherzustellen, dass sie gedruckt werden, wenn die Länge der Eingabe nicht den Faktor 3 hat.

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

Probieren Sie es online!

Innat3
quelle
67
dana
57
mein Pronomen ist monicareinstate
1

C (gcc) , 55 Bytes

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

Probieren Sie es online!

l4m2
quelle
Die Verwendung von 9 ( \t) anstelle von 10 ( \n) sollte in Ordnung sein, aber das ist nicht das Wichtigste
14m2
1

Bash , 90 Bytes

Dabei werden Bash-Funktionen anstelle einer Kombination aus herkömmlicherer Bourne-Shell und * nix-Befehlen verwendet (wobei eine von mir erstellte Version 205 Byte aufwies). Ich habe betrogen, indem ich zwei _-Zeichen zur Zeichenfolge hinzugefügt habe.

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

Probieren Sie es online!

PJF
quelle
1

GNU sed , 27 Bytes

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

Probieren Sie es online!

Bei der Eingabe eines leeren Strings wird es etwas knifflig, da sed keinen falschen Wert hat. Um dies zu bewältigen, biete ich Ihnen zwei mögliche Interpretationen der Regeln an, um meine Einreichung zu validieren:


EIN. Sie geben im Wesentlichen nichts als Eingabe ein, nicht einmal eine nachgestellte Zeile (wie bei allen Beispielen, einschließlich dieser 6-Mb-Datei).

Verwendung:

echo -n ""|sed -f script

Ausgabe: Es wird nichts gedruckt, da sed das Skript nicht einmal ohne Eingabe ausführt.


B. Als falscher Wert für sed kann eine eindeutige Zeichenfolge angesehen werden, die nur zurückgegeben wird, wenn die Eingabe eine leere Zeichenfolge ist.

Verwendung:

echo ""|sed -f script

Ausgabe:

__

Ich bevorzuge die erste Interpretation viel mehr, da sie meiner Meinung nach der beabsichtigten Regel am nächsten kommt, aber die letzte hilft, wenn Sie das Skript über diesen TIO-Link ausführen.

Seshoumara
quelle
0

Gelee , 10 Bytes

s3;€⁾__ḣ€3

Probieren Sie es online!

Es fühlt sich an, als ob eine 8 oder 9 möglich sein sollte, aber ich habe noch keine gefunden.

Nick Kennedy
quelle
0

Attache , 34 23 Bytes

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

Probieren Sie es online!

Erklärung (veraltet)

{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
quelle
Würden Sie etwas sparen, indem Sie alle Elemente anstelle des letzten auffüllen ?
Shaggy
@ Shaggy Guter Punkt! Ich werde es untersuchen
Conor O'Brien
0

Kohle , 10 Bytes

E⪪S³…⁺ι__³

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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

Scala , 31 Bytes

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

Probieren Sie es online!

Erläuterung

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

Befunge-93 , 30 29 Bytes

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

Probieren Sie es online!

Gibt nichts für eine leere Eingabe aus, andernfalls werden Zeichenfolgen der Länge 3 ausgegeben, die durch NUL-Zeichen getrennt sind.

Erläuterung:

~ Zeichen der Eingabe zum Stapeln drücken
 : 1+ Eingabe duplizieren und 1 hinzufügen
    % Modulo Top 2 Werte von Stack und Push Ergebnis
                                Wenn die Eingabe -1 (Ende des Datenstroms) war, berechnen Sie -1% 0 -> halt
                                Andernfalls berechnen Sie die Eingabe% (Eingabe + 1) -> Eingabe
     , Pop und Ausgabezeichen
      ~ Zeichen der Eingabe zum Stapeln drücken
       : 1+! Eingabe duplizieren, 1 addieren und logisches NOT ausführen
           "` "* Mit 96 multiplizieren (ASCII-Code für '`')
                                Dies gibt 96 oder 0 zurück, abhängig vom Ergebnis des NOT
               + Addiere die oberen 2 Werte vom Stapel und drücke das Ergebnis
                                Wenn die Eingabe -1 (Ende des Streams) war, wird -1 + 96 = 95 oder der ASCII-Code für '_' gedrückt.
                                Ansonsten drückt Eingang + 0
                , Pop und Ausgabezeichen
                 ~: 1 +! "` "* +, Gleicher Block erneut zur Behandlung des dritten Zeichens
                            , Ausgabe eines NUL-Zeichens (Stapel ist leer, daher gibt das Abspringen vom Stapel nur 0 zurück)

Der Anweisungszeiger wird am Ende umbrochen und durchläuft die gesamte Zeile.
negative sieben
quelle