Robienie kwadratowych słów


38

Wyzwanie

Twoim zadaniem jest stworzenie programu, który pobiera dane wejściowe z ciągu i generuje dane wyjściowe w formacie kwadratu. Puste ciągi powinny zwracać pusty ciąg.

Przykłady

Biorąc pod uwagę wkład:

golf

Twój program powinien wypisać:

golf
o  l
l  o
flog

Wkład:

123

Wydajność:

123
2 2
321

Wkład:

a

Wydajność:

a

Wkład:

Hello, world!

Dane wyjściowe (zwróć uwagę na odstęp między i w - przerwa nie jest tylko nową linią):

Hello, world!
e           d
l           l
l           r
o           o
,           w

w           ,
o           o
r           l
l           l
d           e
!dlrow ,olleH

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w każdym języku.


@DJMcMayhem Tak, przepraszam, że zapomniałem to dodać.
SpookyGengar

2
Bez obaw, tylko podwójne sprawdzenie. Ładne pierwsze wyzwanie BTW! Witamy na stronie :)
DJMcMayhem

@SpookyGengar Czy dodałbyś przypadek testowy dla wprowadzenia jednej litery?
musicman523,

@ musicman523, czy już go nie mam? Trzeci przykład z samą literą „a”.
SpookyGengar

1
@SpookyGengar my bad, najwyraźniej jestem ślepy
musicman523

Odpowiedzi:


17

Węgiel , 7 5 bajtów

θ‖O↙↘

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 2 bajty dzięki @CarlosAlejo. Wyjaśnienie:

θ       Print the input string, making the top row
 ‖O     Reflect with overlap...
   ↙    ... down and left, to create the left side
    ↘   ... down and right, to create the bottom and right sides

(Wiele wskazówek do polecenia Odbicie jest uruchamianych kolejno, a nie jednocześnie).


Wow, Jezu, nadal uważam, że Węgiel drzewny był najfajniejszym pomysłem na esolang.
Magic Octopus Urn

1
Można zapisać dwa bajty, jeśli po prostu wydrukować ciąg wejściowy i odzwierciedlają to downleftwards i downrightwards: θ‖B↙↘. Wypróbuj online!
Charlie,

Teraz, gdy o tym myślę, może powinienem był użyć ReflectOverlapzamiast ReflectButterflyunikać odwracania postaci. :-)
Charlie

1
Jest to jeden z nielicznych przypadków, w których odpowiedź golfa w ezoterycznym języku jest łatwiejsza do odczytania i zrozumienia niż pełne nieogolone wersje popularnych języków ogólnego przeznaczenia.
Caleb

Twoja odpowiedź tutaj działa również dla 4 bajtów.
Oliver

10

MATL , 20 16 11 bajtów

otYTO6Lt&(c

Wypróbuj w MATL online!

EDYCJA: Kod działa w wersji 20.2.1, która poprzedza wyzwanie. Link używa tej wersji. (W 20.2.2 kod byłby krótszy, ale byłby późniejszy od wyzwania).

Wyjaśnienie

o     % Implicitly input a string. Convert chars to ASCII codes
t     % Duplicate
YT    % 2-input Toeplitz matrix
O     % Push 0
6L    % Push predefined literal [2, -1+1j]. When used as an index, this is
      % interpreted as 2:end-1 (indexing is 1-based)
t     % Duplicate
&(    % 4-input assignment indexing. This writes 0 at the square formed by
      % rows 2:end-1 and columns 2:end-1 
c     % Convert to char. Char 0 is shown as space. Implicitly display

Bardzo imponujące! :) Czy można usunąć pustą linię na dole każdego wyjścia, czy jest to potrzebne do funkcjonalności?
SpookyGengar

2
@SpookyGengar Jest to bardzo częste żądanie, aby zezwolić na jeden znak nowej linii.
Jonathan Allan

@SpookyGengar Thanks! MATL zawsze wyświetla końcowy znak nowej linii. Jak mówi Jonathan, jest to zwykle dozwolone
Luis Mendo,

1
@LuisMendo Codziennie uczysz się czegoś nowego. :) Dzięki za zgłoszenie - zdecydowanie najlepsze jak dotąd!
SpookyGengar

6

Galaretka ,  29 22  17 bajtów

Węgiel będzie sprać + D to wynik ...

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY

Monadyczny link pobierający i zwracający listy znaków; lub pełny program drukujący wynik.

Wypróbuj online!

W jaki sposób?

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY - Link: list of characters, w     e.g. "whole"
 ⁶                - literal space character              ' '
J                 - range(length(w))                     [1,2,3,4,5]
  ẋ               - repeat                               [" ","  ","   ","    ","     "]
         Ṛ        - reverse w                            "elohw"
        "         - zip with:
       ¦          -   sparse application of:
   a              -     and (vectorises)
    0,1           -     to indexes: [0,1] (last and 1st) ["e","ll","o o","h  h","w   w"]
            $     - last two links as a monad:
          Ṛ       -   reverse                            ["w   w","h  h","o o","ll","e"]
           ;      -   concatenate                        ["w   w","h  h","o o","ll","e","e","ll","o o","h  h","w   w"]
             Ṗ    - pop (remove last entry)              ["w   w","h  h","o o","ll","e","e","ll","o o","h  h"]
              ŒḌ  - reconstruct matrix from diagonals    ["whole","h   l","o   o","l   h","elohw"]
                Y - join with newlines                   "whole\nh   l\no   o\nl   h\nelohw"
                  - if running as a full program implicit print

Bardzo fajny! Jak dotąd najkrótsze rozwiązanie, ale nie działa z wejściami jednoznakowymi i ciągami znaków składającymi się z liczb, np. „123”.
SpookyGengar

Ach, będę musiał poradzić sobie z przypadkiem pojedynczego znaku, tak. Działa z ciągami znaków cyfrowych, dane wejściowe programu powinny być naprawdę cytowane, np. 'Hello'„Spooky's” "123", itp. (Python służy do interpretacji danych wejściowych).
Jonathan Allan

@SpookyGengar - naprawiono to dla przypadku 1-znakowego.
Jonathan Allan

Niezła redukcja długości!
Luis Mendo,

2
Masz rację co do węgla drzewnego.
Neil

3

C, 109 bajtów

i,j;f(char*s){for(i=j=printf("%s\n",s)-2;1[++s];)printf("%c%*c\n",*s,i,s[j-=2]);for(;*s*~i--;)putchar(*s--);}

Wypróbuj online!

Godne uwagi sztuczki:

  • Zamiast marnować bajty strlen, po prostu chwytamy długość łańcucha, jednocześnie drukując pierwszą linię:

    i=j=printf("%s\n",s)-2

    Działa to, ponieważ printfzwraca liczbę zapisanych bajtów.

  • W środkowych liniach musimy zapętlić łańcuch, ale wykluczamy zarówno pierwszy, jak i ostatni znak. Osiąga się to z warunkiem

    1[++s]

    (który jest krótszy niż (++s)[1]), który pomija pierwszy znak z powodu ++jego bycia w stanie i pomija ostatni znak, zatrzymując się, gdy znak minie obecny znak '\0'(zamiast zatrzymywać się na '\0' ).

  • W ciele pierwszej pętli

    printf("%c%*c\n",*s,i,s[j-=2])

    wypisujemy bieżący znak, a następnie odpowiedni znak „dublowany” (śledząc z j, który przechodzi w negatywy, co powoduje dziwną sytuację indeksowania w łańcuch z liczbą ujemną) dopełniany do długości ispacjami (gdzie ijest dogodnie strlen(s) - 1).

  • Odwrócony druk w ostatnim wierszu jest dość prosty; jedyną sztuczką jest to *s*~i--, że jest to najkrótszy sposób na uzyskanie i+2iteracji ciała pętli (od którego nie zależy i; wszystko, co ijest używane, to liczyć). Funky *s*część zapewnia, że ​​pętla nie uruchomi się, jeśli *sjest '\0', co dzieje się na wejściu o długości 1.



3

Haskell , 84 78 bajtów

f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]
r=reverse

Wypróbuj online! Zastosowanie: f "test". Zwraca listę linii.

Edycja: -6 bajtów dzięki Dianne!


1
możesz zaoszczędzić kilka bajtów, używając osłony wzorca jako osłony i definiując synonim reverse; r=reverse;f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]ma 78 bajtów.
dianne



2

05AB1E , 17 16 15 19 bajtów

ÂDÂø¦¨Dgú€Ás)˜»Igi¨

Wypróbuj online!

Wyjaśnienie

Przykład z input = golf

ÂDÂ                  # bifurcate, duplicate, bifurcate
                     # STACK: 'golf', 'flog', 'flog', 'golf'
   ø                 # zip the top 2 items
                     # STACK: 'golf', 'flog', ['fg', 'lo', 'ol', 'gf']
    ¦¨               # remove the first and last element
                     # STACK: 'golf', 'flog', ['lo', 'ol']
      Dg             # get the length of the list
                     # STACK: 'golf', 'flog', ['lo', 'ol'], 2
        ú            # prepend that many spaces to each element
                     # STACK: 'golf', 'flog', ['  lo', '  ol']
         €Á          # rotate each right
                     # STACK: 'golf', 'flog', ['o  l', 'l  o']
           s         # swap the top 2 items
                     # STACK: 'golf', ['o  l', 'l  o'], 'flog'
            )˜       # wrap in a flattened list
                     # STACK: ['golf', 'o  l', 'l  o', 'flog']
              »      # join on newline
               Igi¨  # if input is length 1, remove last char

Poprawka dla wprowadzania 1-literowego była dość droga.
Czuję, że inne podejście może być teraz lepsze.



1

Mathematica, 128 bajtów

(c=Column;g=Length[x=Characters@#]-1;If[g==0,#,c@{#,c@Table[""<>{x[[i]],""<>Table[" ",g-1],x[[-i]]},{i,2,g}],StringReverse@#}])&

1

C, 96 bajtów

i,l;f(char*s){for(i=l=puts(s)-2;--i;)printf("%c%*c\n",s[l-i],l,s[i]);for(;l+1;)putchar(s[l--]);}

Wersja premiowa (122 bajty):

x,y,i,l;f(char*s){for(i=l=puts(s)-1;++i<l*-~l;putchar(x==l?10:x%~-l*(y%~-l)?32:s[(x*y?l+l-2-x-y:x+y)%l]))x=i%-~l,y=i/-~l;}

1

Swift 3 , 215 199 bajtów

let s=readLine()!,c=s.characters,r:[Character]=c.reversed(),b=c.count
print(s)
if b>1{for i in 0..<b-2{print("\(r.reversed()[i+1])\(String.init(repeating:" ",count:b-2))\(r[i+1])")};print(String(r))}

Wypróbuj online


1

Python 3, 88 bajtów

w=input();p=print;l=len(w)-2
[p(w[n+1]+' '*l+w[l-n])for n in range(l)]
l+1and p(w[::-1])

1
Witamy w PPCG!
Martin Ender

Witamy również na stronie! Wierzę, że l+1 andmożna to przepisać, l+1andaby zaoszczędzić bajt.
Wheat Wizard

Edytowano @WheatWizard - dzięki! Byłem zaskoczony, że zadziałało ...
Levi

Będzie działał, z wyjątkiem przypadku 0or, w którym Python nie analizuje, ponieważ 0ojest to ósemkowy przedrostek.
Wheat Wizard

Gdy uruchomię to, że nie wydaje się, aby wydrukować górną linię ... tio.run/##FcoxCsQgEAXQPqeYLk7EwqRL8CRiEVh3Iww/...
Coty Johnathan Saxman

1

JavaScript (ES8), 108 112 bajtów

let f = 

s=>(n=s.length)<2?s:(r=[...s].reverse()).slice(1,-1).reduce((a,v,i)=>a+`
`+s[i+1].padEnd(n-1)+v,s)+`
`+r.join``

o.innerHTML = f("hello folks!")
<pre id="o"></pre>

Mniej golphed

s=>
   (n=s.length) < 2 ?    // record and check length
   s :                   // s has 0 or 1 char, else
   (r=[...s].reverse())  // reverse characters,
   .slice(1,-1)          // exclude 1st and last
   .reduce((a,v,i)=>     // append inner lines
      a +'\n' +s[i+1].padEnd(n-1) + v
    ,s)                  // to first line
    + '\n' +r.join("")   // append characters reversed

Podziękowania dla Justina Marinera za zaoszczędzenie dużej ilości bajtów, które następnie przyzwyczaiły się do dodawania kontroli zerowej lub pojedynczej postaci potrzebnej do wykonania wyzwania. Łapiesz to :-(


Możesz zapisać 7 bajtów, tworząc drugą linię `+s[i+1].padEnd(s.length-1)+v,s)+`i używając r.join``.
Justin Mariner

Dzięki @JustinMariner za wskazówki na temat String.prototype.padStarti otagowano literały szablonów. Potrzebowałem tego, aby ograniczyć dodawanie kontroli długości do minimum :-)
traktor53

Twoje odstępy są teraz o jedną postać za krótkie; możesz to naprawić i zaoszczędzić jeszcze kilka, robiąc (n=s.length-1)?(r=<...>+r.join``:si używając padEnd(n). Jeśli długość wynosi 1, length-1wynosi 0(fałsz).
Justin Mariner

@JustinMariner jest ustalony, ale utrzymałem test długości - jak rozumiem, zarówno łańcuchy o zerowej długości, jak i łańcuchy jednego znaku zwracają się bez powrotu karetki lub powtórzenia łańcucha.
traktor53

1
padEndjest ES2017.
Neil

1

PHP , 118 bajtów

echo $s=$argv[1];$l=strlen($r=strrev($s))-1;for($i=$l-1;$l&&$i;)echo "\n".str_pad($r[$i],$l).$s[$i].(--$i?"":"\n$r");

Wypróbuj online!

echo $s = $argv[1];
$l = strlen($r = strrev($s)) - 1;

for ($i = $l - 1; $l && $i;)
    echo "\n" . str_pad($r[$i], $l) . $s[$i] . (--$i ? "" : "\n$r");

1

APL , 58 bajtów

{(' ',⍵)[x+(x←∘.{((c-1)=⍺⌈⍵)∨0=⍺⌊⍵}⍨r)×o⌊⌽⊖o←∘.⌈⍨r←⍳c←≢⍵]}

Z ⎕IO←0.

Wypróbuj online!

W jaki sposób?

c←≢⍵ - długość sznurka

r←⍳ - zasięg

o←∘.⌈⍨ - produkt zewnętrzny z minimum

123
223
333

o⌊⌽⊖- zminimalizować z samym sobą obróconym o 180 o

123  ⌊  333  =  123
223  ⌊  322  =  222
333  ⌊  321  =  321

× - pomnóż przez

x←∘....⍨r - produkt zewnętrzny z zakresu

    ((c-1)=⍺⌈⍵)∨0=⍺⌊⍵ - rama matrycy

111  ×  123  =  123
101  ×  222  =  202
111  ×  321  =  321

x+ - dodaj ramkę

111  +  123  =  234
101  +  202  =  303
111  +  321  =  432

(' ',⍵)[...] - pobierz według indeksu z łańcucha połączonego w spację


Może ⍉⊖⍉⊖być ⌽⊖?
Zacharý

@ Zacharý dzięki
Uriel

0

JavaScript (ES2017), 87 bajtów

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

Wersja ES6: 93 bajty

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i]+' '.repeat(l-1)+c:z.join``:s).join`
`

Mniej golfa

s => (
  l = s.length-1,
  [...s].reverse().map( // scan string backwards
     (c, i, z) => 
     i != 0 // check if top row
     ? l-i != 0 // check if bottom row
       ? s[i].padEnd(l) + c // any middle row
       : z.join`` // bottom row: string reversed
     :s // top row: original string
  ).join`\n`
)

F=
s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

function update() {
  O.textContent = F(I.value)
}

update()
<input id=I value='Hello, world!' oninput='update()'>
<pre id=O></pre>


padEndjest ES2017.
Neil

@ Nee dziękuję, zmienię nagłówek
edc65

Możesz zapisać bajt w swojej wersji ES6 za pomocą l+~i, unikając konieczności odejmowania 1 dwa razy zamiast tego możesz odjąć 2 raz.
Neil

@Neil powinno byćl-~-i
edc65

Myślałem o tym, s=>[...s].reverse(l=s.length).map((c,i,z)=>i?l+~i?s[i]+' '.repeat(l-2)+c:z.join``:s).join`\n` ale s=>[...s].reverse(l=s.length-2).map((c,i,z)=>i?i+~l?s[i]+' '.repeat(l)+c:z.join``:s).join`\n` też działa.
Neil

0

Java, 191 bajtów

(s)->{PrintStream o=System.out;int l=s.lenght();o.println(s);for(int i=0;i<l;i++){o.printf("%"+"s%"+(l-1)+"s%n",s.charAt(i),s.charAt(l-1-i));for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}}};

(s)może być sprawiedliwy s. Pętle z pojedynczymi liniami wewnątrz mogą mieć usunięte nawiasy klamrowe. Możesz powrócić zamiast drukowania, jeśli pozwoli ci to zaoszczędzić bajty. Używasz int iw obu pętlach, nie wiem, czy mają różne zakresy, ale warto na nie zwrócić uwagę. Inicjalizacja podobnie jak zmienne zwykle oszczędza bajty. for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}-> for(int i=0;i<l;){o.print(s.charAt(l-1-i++));}. Nie potrzebujesz końcowego średnika.
TheLethalCoder

Dzięki za wskazanie;) (niezbyt zaznajomiony z golfem). Zoptymalizuje to później!
Serverfrog

0

C # (.NET Core) , 179 161 bajtów

-18 bajtów dzięki TheLethalCoder

using System.Linq;
s=>{int l=s.Length-1,i=1;var d=s.Reverse().ToArray();while(i<l)s+="\n"+s[i]+new string(' ',l-1)+d[i++];if(l>1)s+="\n"+new string(d);return s;};

Wypróbuj online!

Nie jestem pewien co do reguł, jeśli jest to potrzebne do liczenia bajtów, czy nie:

using System.Linq;

Ktoś, proszę, popraw mnie w tej sprawie.

Nie golfowany:

s =>
{
    int l = s.Length - 1, i = 1;
    var d = s.Reverse().ToArray();
    while (i < l)
        s += "\n" + s[i] + new string(' ', l - 1) + d[i++];
    if (l > 1)
        s += "\n" + new string(d);
    return s;
};

Witaj w PPCG! Używasz Linq, więc powinieneś uwzględnić usingw swojej liczbie bajtów. Ponieważ używasz Linq ToCharArray()może być po prostu ToArray(), czy naprawdę potrzebujesz go wcześniej Reverse()? Podczas używania Stringmusisz go w pełni zakwalifikować lub włączyć używanie, można to jednak łatwo naprawić, zmieniając go string. ifMoże być krótszy jak potrójny podobnego s+=l>1?if code:"";. Możesz usunąć i++pętlę i zwiększyć ją o d[i++].
TheLethalCoder

Zainicjuj za ipomocą llike int l=s.Length-1,i=1;. I myślę, że to może być to!
TheLethalCoder

@TheLethalCoder dziękuję! Dodałem twoje sugestie do kodu. Kilka uwag: Całkowicie zapomniałem, że łańcuch faktycznie ma IEnumerable; Sznurek zamiast sznurka był resztą Javy, z którą wciąż walczę, trójskładnik był w rzeczywistości równie zaskakująco długo; a po twoich zmianach zmieniłem na (; wyrażenie;) na while (wyrażenie), ponieważ wygląda ładniej i ma taką samą liczbę bajtów. Jeszcze raz dziękuję.
Grzegorz Puławski

Bez obaw! Trójskładniki czasami są, ale zwykle wychodzą krócej, więc zawsze warto je wypróbować.
TheLethalCoder

0

Siatkówka , 106 bajtów

..+
$&¶$&
O$^`.(?=.*$)

\G.
$&$%'¶
r`.\G
¶$%`$&
+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2
T`p` `(?<=.¶.).*(?=.¶.)
G`.

Wypróbuj online! Wyjaśnienie:

..+
$&¶$&

Jeśli są co najmniej dwa znaki, zduplikuj dane wejściowe.

O$^`.(?=.*$)

Odwróć duplikat.

\G.
$&$%'¶
r`.\G
¶$%`$&

Zamień struny w trójkąty. Górny trójkąt zaczyna się od wejścia i za każdym razem usuwa pierwszy znak, a dolny trójkąt zaczyna się od pierwszej litery odwróconego wejścia i za każdym razem dodaje znak.

+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2

Połącz trójkąty, nakładając się na siebie, aby ostatnia postać tworzyła /przekątną.

T`p` `(?<=.¶.).*(?=.¶.)

Zmień wszystkie postacie na spacje, jeśli są przynajmniej jedną postacią od końca z każdej strony.

G`.

Usuń wszelkie pozostałe puste linie.


0

Python 3, 85 bajtów

Używanie danych wejściowych dla górnego rzędu :)

a=input()
b=len(a)
for i in range(b-2):print(a[1+i]+" "*(b-2)+a[-2-i])
print(a[::-1])

Czy na pewno daje to prawidłową odpowiedź?
Koishore Roy

0

Lua , 104 bajty

print(s);for a=2,#s-1 do print(s:sub(a,a)..(" "):rep(#s-2)..s:sub(#s-a+1,#s-a+1)) end;print(s:reverse())

Wypróbuj online!


ale używałeś tylko praz ...
Leaky Nun

To prawda ... to zmieni.

0

Python 3, 106 bajtów

Wersja funkcjonalna ...

w=input();p=print;l=len(w)-2
def f(k):p(w[k]+' '*l+w[-k-1]);l-k>0and f(k+1)
l<0 or f(1)or l<1or p(w[::-1])


0

Mathematica, 138 91 bajtów

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&

Możesz wypróbować online, wklejając następujące elementy w piaskownicy chmurowej Wolfram i klikając „oceniaj komórkę” lub naciskając Shift + Enter lub Numpad Enter:

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&@{"g","o","l","f","y"}//MatrixForm
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.