Springify a String

11

Wstaw tutaj piaskownicę .

Utwórz funkcję lub program, który „Springify” ciąg.

  • Dane wejściowe będą ciągiem w standardowym standardzie lub najbliższą alternatywą
  • Dane wejściowe będą zawierać tylko drukowalne ASCII i / lub spacje
  • Dane wyjściowe będą do Stdout lub najbliższej alternatywy
  • Końcowe znaki nowej linii i spacje są dopuszczalne

Jak sprifyfikować ciąg

  1. Sformatuj ciąg w dowolną liczbę cewek sprężynowych ASCII
  2. Wypełnij cewki odstępami, aż do najbliższej cewki
  3. Odczytaj postacie, podążając za sprężyną wokół cewek

To jest cewka sprężynowa ASCII:

#
# ####
 #    #
# ####
#

Gdzie #s są znakami ciągu

Oto przykład:

abcdefghijklmnopqrstuvwxyz

staje się

a
b cdef
 g    h
i jklm
n
o
p qrst
 u    v
w xyz.
.

Gdzie .s zastępują spacje dla widoczności.

Następnie ciąg jest odczytywany ponownie, po sprężynie ASCII w dół, wokół pętli, uderzając w gi udwukrotnie:

1| a  <-3
 V b cdef
    g    h
4| i jklm
 V n  2->
  ...

...dający:

abgjklmhfedcginopuxyz vtsrquw (ze spacją)

Przypadki testowe

(dodano cytaty w celu podkreślenia końcowych spacji - zignoruj ​​je pod względem IO)

I: "abcdefghijklmnopqrstuvwxyz"
O: "abgjklmhfedcginopuxyz vtsrquw "

I: "!@#"
O: "!@         #   "

I: ""
O: ""

I: "12345 67890"
O: "12690  7 54368 "

I: " "
O: "               "

Należy pamiętać, że długość wyjściowa jest zawsze wielokrotnością 15, czyli długości cewki sprężynowej

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Łagodnie Milquetoast
źródło
Wydaje mi się, że znacznie trudniej byłoby podążać za wzorem wzdłuż cewki.
Magic Octopus Urn
@ carusocomputing masz na myśli odwrotność?
MildlyMilquetoast
codegolf.stackexchange.com/a/107531/59376 okazuje się, że nie zrozumiałem wyzwania tak, jak napisano, to właśnie wyzwanie ahaha.
Magic Octopus Urn

Odpowiedzi:

2

Galaretka , 26 bajtów

“4ṘƝ;þ¦Ɱ’b®¤ị
;⁶x14©¤s®ṖÇ€

TryItOnline!

W jaki sposób?

“4ṘƝ;þ¦Ɱ’b®¤ị - Link 1, output for a single coil: char array
           ¤  - nilad followed by link(s) as a nilad
“4ṘƝ;þ¦Ɱ’     - base 250 number, 13140239220751650
          ®   - retrieve from register (14 from main link)
         b    - convert to base, [1,2,7,10,11,12,13,8,6,5,4,3,7,9,0]
            ị - index into the char array

;⁶x14©¤s®ṖÇ€ - Main link: theString
      ¤      - nilad followed by link(s) as a nilad
 ⁶           - a space character
  x          - repeated
   14©       - place 14 into the register and yield 14
;            - concatenate theString with the 14 spaces
       s     - split into chunks of length
        ®    -     retrieve from register (14)
         Ṗ   - pop last entry from the result (removes the space only last entry of 14 chars or less)
          Ç€ - call the last link (1) as a monad for €ach
             - implicit print
Jonathan Allan
źródło
5

Python 2, 104 102 98 bajtów

f=lambda t:''.join((t+' '*13)[ord(x)-97+y*14]for y in range(len(t)/14+1)for x in'abgjklmhfedcgin')

Dzięki za pomoc w komentarzach!

https://tio.run/#2VDVy

Oryginalny:

t=raw_input()+' '*13
print''.join(t[ord(x)-97+y*14]for y in range(len(t)/14)for x in'abgjklmhfedcgin')
throx
źródło
Możesz po prostu użyć input()i pobrać dane w formacie "<stuff>".
HyperNeutrino,
Świetny pierwszy golf! Jak zauważa Alex L., zezwalamy na wprowadzanie danych w cudzysłowie. Możesz także użyć a, lambdaaby nadać anonimowej funkcji zamiast programu - często jest to krótsze .
xnor
Nie powiodło się w przypadku pustego testowego ciągu z indeksem IndexError. Myślę, że możesz potrzebować zmienić 13 na 14 i wyskoczyć z wartości końcowej (podobnie jak moja odpowiedź na galaretkę).
Jonathan Allan,
... zmieniając +13się +14i +1aby +(len(t)%14>0)to zrobić, ale nie musi być krótsza droga.
Jonathan Allan,
3

JavaScript (ES6), 79 bajtów

f=
s=>s.replace(/.{1,14}/g,s=>'0169abc7543268d'.replace(/./g,c=>s['0x'+c-0]||' '))
<input oninput=o.textContent=f(this.value)><pre id=o>

Szesnastkowy ciąg bezwstydnie skradziony z @ETHproductions.

Neil
źródło
@ETHproductions Dzięki, naprawiono.
Neil,
To wspaniale!
dodov
Fajnie, jak fragment pozwala zobaczyć wynik podczas pisania
MildlyMilquetoast
2

Siatkówka , 71 bajtów

$
13$* 
M!`.{14}|$
(.)(.)(.)(.)(.)(.)(.)(....)(.)¶
$5$8$6$4$3$2$1$5$7$9

Wypróbuj online!

Umożliwianie ciągów znaków nie jest dokładnie zwięzłe w Retina ...

Martin Ender
źródło
2

JavaScript (ES7), 144 143 141 114 104 103 bajtów

Dzięki ETHProductions za 10B oszczędności!

a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``

Przykład

f=a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``
f('abcdefghijklmnopqrstuvwxyz')

Wynik

abgjklmhfedcginopuxyz vtsrquw 
Łukasz
źródło
Bardzo dobrze. Możesz zapisać niektóre bajty, konwertując tablicę na ciąg szesnastkowy i używając go +('0x'+whatever)do konwersji na liczbę:(_,c)=>b[(c/15|0)*14+ +('0x'+'0169abc7543268d'[c%15])]
ETHproductions
Sprytna sztuczka. Myślałem już o innych sposobach napisania tablicy, ale nie mogłem wymyślić żadnego. Nadal mogę to skrócić, umieszczając najpierw liczbę szesnastkową, a następnie mnożenie, dzięki czemu przestrzeń staje się niepotrzebna.
Łukasz
Możesz nawet '0x'+'...'[c%15]-0+(c/15|0)*14uratować sobie parę nawiasów :-)
ETHproductions
Masz rację. Dodany.
Łukasz
2

Perl 6 , 61 bajtów

{S:g/(.)**1..14/{[~] $0["abgjklmhfedcgin".ords X-97]X//" "}/}

Jak to działa

Podstawowa struktura jest następująca:

{                                  }  # A lambda.
 S:g/(.)**1..14/{                }/   # Regex-replace segments of 1-14 characters, with:
                     $0               #   The single-char submatches captured by the parens.
                       [  ]           #   Index them using certain indices (see below).
                           X//" "}    #   Replace each undefined element with a space.
                 [~]                  #   Concatenate the characters.

Wyrażenie używane do indeksowania do każdego 14-znakowego segmentu to "abgjklmhfedcgin".ords X- 97, które działa w następujący sposób:

  1. Weź zakodowany ciąg abgjklmhfedcgin.
  2. Zdobądź swoje codepoints: 97 98 103 106 107 108 109 104 102 101 100 99 103 105 110.
  3. Odejmij 97 z każdego numeru: 0 1 6 9 10 11 12 7 5 4 3 2 6 8 13.

Perl 6 , 64 bajtów

{[~] .comb(14)».comb»[0,1,6,9..12,7,5...2,6,8,13].flat X//" "}

Wypróbuj online!

Jak to działa

Podstawowa struktura jest następująca:

{                                    }  # A lambda.
     .comb(14)                          # Split the argument into substrings of <= 14 chars.
              ».comb                    # Split each substring into a list of characters.
                    »[  ]               # Index each list using the same indices (see below).
                         .flat          # Flatten the resulting nested list.
                               X//" "   # Replace each undefined element with a space.
 [~]                                    # Concatenate the list to get a string again.

Te same indeksy jak wyżej, ale ponieważ jesteśmy nazywając .flattak, możemy użyć zagnieżdżonej (1 bajt, ale krótszy) wyrażenie dla nich 0,1,6,9..12,7,5...2,6,8,13.

(Wygląda na trywialne, ale tak naprawdę polega na analizie osobliwości Rakudo Perl 6, która jest prawdopodobnie błędem . Aby napisać go bez wykorzystania tego błędu, trzeba by dodać pareny wokół 5...2.)

smls
źródło
2

Befunge-93, 97 bajtów

<>0>v%2g3\p89:-1+*"!"!:+1<_@#`0:~
,^\,_\:98g\9p1+:76+`#v_:~^
^,,g96g98g9+67,,,,,$$_
==    =  ====

Wypróbuj online!

Jest to podział kodu źródłowego z wyróżnieniem różnych części składowych.

Kod źródłowy z podświetlonymi ścieżkami wykonania

*Główna pętla rozpoczyna wykonywanie od prawej do lewej, owijając się po prawej stronie pola gry. Tutaj czytamy pierwszy znak ze standardowego wejścia i kończymy, jeśli jest to EOF.
*Następna sekcja upewnia się, że wszystkie znaki EOF są konwertowane na spacje za pomocą formuły c = c + 31*!(c+1). Chociaż nie będzie to miało zastosowania przy pierwszej iteracji, może wystąpić przy kolejnych przebiegach.
*Kopia znaku jest zapisywana w pamięci tymczasowej, a następnie w tabeli w wierszu czwartym ( *) wykonywane jest wyszukiwanie bieżącego indeksu w celu ustalenia, czy znak powinien zostać wyprowadzony, czy nie.
*Jeśli postać musi zostać wyprowadzona, bierzemy lewą gałąź. Tutaj wykonywana jest zamiana, aby anulować zamianę, która nastąpi potem, a następnie naciśnięcie zera powoduje wymuszenie prawidłowego rozgałęzienia.
*Jeśli postać nie została wypisana, zamieniamy ją na stos pod licznikiem indeksów (jest to zamiana, która zostaje anulowana w lewej gałęzi). I w obu przypadkach zapisujemy znak do pamięci przy bieżącym przesunięciu indeksu, zwiększamy indeks i sprawdzamy, czy jest on większy niż 13.
*Jeśli nie, odczytujemy kolejny znak ze standardowego wejścia i powtarzamy wewnętrzną pętlę.
*Jeśli tak, skończymy zestaw 14 znaków, 7 zostało wypisanych ( abgjklm), a 7 pozostało na stosie ( cdefhin). Mamy upuść dwa ostatnie wyjście pozostałe 5 ( hfedc), a następnie pobrać i wyjściowe szczególne przypadki g, ii nz pamięci.
*To sprowadza nas z powrotem do początku głównej pętli, w której powtarzamy proces ponownie dla następnych 14 znaków.

James Holderness
źródło
Ładne wyjaśnienie, dobrze zrobione
MildlyMilquetoast
1

Mathematica, 77 72 bajtów

Dzięki JungHwan Min za oszczędność 5 bajtów!

Join@@Partition[#,14,14,{1,1}," "][[;;,LetterNumber@"abgjklmhfedcgin"]]&

Funkcja bez nazwy, która przyjmuje listę znaków jako dane wejściowe i zwraca listę znaków. Partition[#,14,14,{1,1}," "]dzieli dane wejściowe na podlisty o długości 14, w razie potrzeby dopełniając spacjami. LetterNumber@"abgjklmhfedcgin"ocenia na {1,2,7,10,11,12,13,8,6,5,4,3,7,9,14}, co wskazuje na kolejność przyjmowania każdej podlisty o długości 14 (odpowiednio powtarzając siódmy element). Następnie [[;;,...]]bierze elementy wszystkich podlist o długości 14 w tej kolejności i Join@@łączy odpowiedzi razem.

Poprzednie zgłoszenie:

Join@@Partition[#,14,14,{1,1}," "][[All,83224017339955102~IntegerDigits~16]]&
Greg Martin
źródło
1
LetterNumber@"abgjklmhfedcgin"to krótszy sposób na skompresowanie listy. Również ;;zamiast Allzapisuje bajt.
JungHwan Min
Świetne sugestie!
Greg Martin
0

PHP, 94 bajty

foreach(str_split($argv[1],14)as$s)for($i=0;$c=abgjklmhfedcgin[$i++];)echo$s[ord($c)-97]??" ";

dzieli argument wiersza poleceń na 14-bajtowe fragmenty i zapętla łańcuch tłumaczenia jako indeks podciągu. Uruchom z php -nr '<code>' <string>.

Z przyjemnością dowiedziałem się, że ??akceptuje również pusty ciąg (dla „nieprawidłowego” indeksu) jako zerowy.

Tytus
źródło
0

Rubinowy, 83 bajty

->s{v="";(s+" "*13).scan(/.{14}/){|y|"0169:;<7543268=".chars{|o|v+=y[o.ord-48]}};v}

Pierwszym pomysłem było użycie liczb szesnastkowych, ale ord-48 oszczędza kolejny bajt (skradziony z odpowiedzi Throksa).

GB
źródło