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 .


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




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


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


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


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

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




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



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

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

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

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!



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.




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

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

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

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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.