Policz postacie - krok po kroku!

19

Prosta część: Biorąc pod uwagę ciąg wejściowy zawierający tylko drukowalne znaki ASCII (spacja - tylda), policz liczbę wystąpień każdego znaku i zwróć wynik w dowolnym dogodnym formacie. Wynik na sznurku a%hda7apowinno być coś takiego: a:3, %:1, h:1, 7:1, d:1. Sortowanie nie jest konieczne, separatory i formaty są opcjonalne, ale należy łatwo zrozumieć, która liczba odpowiada danemu znakowi. Nie należy dołączać znaków, które nie znajdują się w ciągu wejściowym ( a:3, b:0, c:0, d:1, ...nie jest OK).

Prawdziwe wyzwanie:

Konwertuj każdy znak w kodzie na 8-bitową liczbę binarną (lub 16-bitową, jeśli używasz UTF-16 lub podobnego) i wyliczaj każdy znak począwszy od 0.

Dla każdego znaku ( ijest to moduł wyliczający) i%7-bit 1 musi być 1. Bity są ponumerowane z prawej strony. Wszystkie inne bity mogą być czymkolwiek chcesz.

Użyjmy następującego kodu jako przykładu:

[f]-xif)#f

Konwertując to na binarne, otrzymujemy tablicę poniżej. Pierwszy numer (reprezentujący [ma 1pozycję 0, więc jeden jest OK. Drugi numer (reprezentujący fma 1pozycję 1, więc jeden też jest OK. Kontynuuj w ten sposób, a zobaczysz że powyższy kod jest prawidłowy.

C 76543210 Numer bitu
- -------- ----------
[0101101 1   0 - OK
f 011001 1 0 1 - OK
] 01011 1 01 2 - OK
- 0010 1 101 3 - OK
x 011 1 1000 4 - OK
i 01 1 01001 5 - OK
f 0 1 100110 6 - OK
) 0010100 1   0 - OK
# 001000 1 1 1 - OK
f 01100 1 10 2 - OK

Jeśli zmienimy kod na: ]f[-xif)#fotrzymamy następujący początek sekwencji:

C  76543210  Bit number
-  --------  ----------
]  01011101  0   <- OK
f  01100110  1   <- OK
[  01011011  2   <- Not OK
-  00101101  3   <- OK

Jak widzimy, trzeci znak [nie ma 1na 2 pozycji (indeksowany od zera), a zatem ten kod jest nieprawidłowy.

Przypadki testowe:

Input:
This is a string containing some symbols: ".#!".#&/#

Output:
   !  "  #  &  /  :  T  a  b  c  e  g  h  i  l  m  n  o  r  s  t  y  .
7  1  2  3  1  1  1  1  2  1  1  1  2  1  5  1  2  4  3  1  6  2  1  2

Każdy rozsądny format wyjściowy jest OK (cokolwiek najbardziej dla ciebie wygodne). Możesz na przykład mieć: :7, !:1, ":2, #:3, &:1, /:1, T:1, a:2 ...lub [ ,7][!,1][",2][#,3][&,1].... Wyjście odbywa się w dowolny standardowy sposób (powrót z funkcji, wydruk do STDOUT itp.)

1i moduł 7.


To jest , więc najkrótszy kod w bajtach wygra ref .

Stewie Griffin
źródło
6
Aby ci pomóc, oto postacie, których możesz użyć w n%7miejscu trzecim
TidB
@TidB strona jest offline?
Rod
1
@Rod Tak, wydaje się, że pastie ma pewne problemy. Zamiast tego spróbuj pastebin
TidB
1
Pamiętaj, że nowa linia jest 00001010. To też może być przydatne! :)
Stewie Griffin
1
Aby uzyskać dalszą pomoc, oto skrypt sprawdzania poprawności, którego można użyć do kodowania UTF-8. Wystarczy umieścić dane wejściowe w ciągu znaków jak w przykładzie.
AdmBorkBork,

Odpowiedzi:

6

PYKE, 1 6 bajtów

1cn;1c

Wypróbuj tutaj!

1c     - chunk(size=1, input)
  n;1  - noop. 
     c - count(^)

Połowa tego kodu to po prostu brak operacji ...

00110001 - 1
01100011 - c
01101110 - n
00111011 - ;
00110001 - 1
01100011 - c
niebieski
źródło
@EriktheOutgolfer ma ważny punkt. Nie sądzę, aby ten format wejściowy był prawidłowy, chyba że w rzeczywistości jest to zwykły ciąg znaków w Pyke. Byłby to prawidłowy ciąg wejściowy w MATLAB / Octave 'abc'==['a','b','c'], ponieważ może być również w Pyke ...?
Stewie Griffin
@StewieGriffin Nie w ten sposób Pyke normalnie obsługuje łańcuchy. Jeśli to nie w porządku, mogę zobaczyć zmianę formatu wejściowego, ale ponieważ lista znaków znajduje się pod zaakceptowaną listą domyślnych, choć może to być traktowane jako oszustwo
Blue
5
Przepraszam za przerwanie wyzwania za pomocą wbudowanego 1-bajtowego urządzenia. Nie sądzę, że tak naprawdę przepraszasz, a wyzwanie nie zostało zerwane przez :-)
Luis Mendo,
2
To nie jest lista postaci; to lista ciągów. Podczas gdy listy znaków mają wartość + 17 / -0 , listy ciągów mają wartość + 2 / -2 , więc nie jest to zaakceptowana wartość domyślna. @StewieGriffin powinien zdecydować, czy jest ważny, czy nie.
Dennis
1
@StewieGriffin lepiej?
Blue
6

Pyth, 12 8 7 bajtów

-1 bajt dzięki @Loovjo

m+d/Qd{
      { # remove all duplicated elements from the (implicit) input
m       # map each element (d) of the parameter (the set from previous operation)
   /Qd  # count the occurrences of d in Q
 +d     # concatenate with d

reprezentacja binarna

0110110 1 m
001010 1 1 +
01100 1 00 d
0010 1 111 /
010 1 0001 Q
01 1 00100 d
0 1 111011 {

Wypróbuj tutaj

Pręt
źródło
Ładny! :) Wyjście 13dla 111wygląda dziwnie, ale to nie może być źle (nie może być dowolny pojedynczy znak 13, który jest używany 1 raz), więc jest to całkowicie poprawny!
Stewie Griffin
4

Befunge-93, 150 bajtów

={<{p+}3/}*77\%*7{7:\+{}{1g}+3/*77\%*7{7:}=:_{}{}={}{}{v#{}{}`x1:~
}-}=*}{2*}97}:<$}={$_v#}!:-*84g+3/*77\%*7{7:}=:}:}+}1{}<_{@#
}{}{}={}{}{}={^.},\={<

Wypróbuj online!

Zacząłem od napisania tego jako zwykłego programu Befunge, który grałem jak najwięcej w golfa. Następnie dodałem padding, aby różne znaki w programie pojawiały się tylko w dozwolonych pozycjach. To wypełnienie polegało na tym, że nieobsługiwane polecenia są ignorowane w Befunge-93, więc potrzebowałem tylko sekwencji nieużywanych znaków, których bity były zgodne z wymaganymi pozycjami (sekwencją, której użyłem ={}{}{}).

Skomplikowane było to, że różne odgałęzienia między liniami potrzebne do prawidłowego wyrównania (np. vStrzałka w jednej linii, musiałyby zrównać się ze <strzałką poniżej). Było to dodatkowo skomplikowane przez fakt, że polecenia bridge ( #) nie można było oddzielić od sąsiedniej strzałki rozgałęziającej. Początkowo próbowałem programowo wygenerować padding, ale ostatecznie był to głównie proces ręczny.

Ze względu na rozmiar programu nie wymienię pełnej analizy znaków, ale jest to próbka od początku i na końcu:

= 00111101 0
{ 01111011 1
< 00111100 2
{ 01111011 3
p 01110000 4
+ 00101011 5
} 01111101 6
3 00110011 0
/ 00101111 1
...
{ 01111011 1
^ 01011110 2
. 00101110 3
} 01111101 4
, 00101100 5
\ 01011100 6
= 00111101 0
{ 01111011 1
< 00111100 2

Podziały linii są traktowane jako znaki nowej linii, więc będą znajdować się na pozycji 1 lub 3.

James Holderness
źródło
3

MATL , 17 bajtów

u"G91x@=zD91x@uRD

Wyświetla liczbę, a następnie odpowiedni znak, wszystkie oddzielone znakiem nowej linii. Największą trudnością jest to, @co jest 0b01000000; Mam nadzieję, że uda mi się znaleźć sposób na obejście się bez tego.

Wypróbuj online!

Wyjaśnienie:

u"  % Implicit input. Take (u)nique characters and loop (") over them.
G   % Take the input a(G)ain
91x % Filler: push 91, delete immediately.
@   % Push current character of loop
=   % Check for equality with earlier G
z   % Count number of equal characters
D   % Display
91x % More filler!
@   % Get loop character again
uR  % Filler: two NOPs for the single-character @
D   % Display. Implicitly end loop.

MATL, 15 bajtów (wątpliwe wyjście)

Jeśli dozwolone jest pozostawienie na stosie dwóch wektorów wierszy (zachowanie podobne do funkcji jak w tym poście Meta), możemy przejść do

u"G91x@=zv]v!Gu

Ale tutaj wyjście nie jest tak starannie uporządkowane.

Sanchises
źródło
Stos jest domyślnie drukowany na końcu programu, a format wyjściowy jest elastyczny jak na wyzwanie, więc nie widzę problemu z drugim podejściem
Luis Mendo
@LuisMendo Nie jestem pewien. Jeśli masz 90 różnych znaków wejściowych, trudno będzie stwierdzić, który klucz należy do której postaci, więc myślę, że muszę odmówić Sanchises. - Stewie Griffin 2 godziny temu padła odpowiedź na proponowany hybrydowego (liczy się indywidualnie D„d, Gupod koniec programu), a nie jestem pewien, czy w wersji 15-bajtowy jest wystarczająco różne.
Sanchises
@StewieGriffin Czy mógłbyś zobaczyć, czy 15-bajtowa wersja ( Wypróbuj online! ) Jest w porządku, czy nie?
Sanchises,
Nie jestem pewien, czy Stewie dostanie ping w tym poście, lepiej użyj posta z wyzwaniem
Luis Mendo
Nie wiem o tobie, ale nie wydaje mi się, że można to tutaj łatwo zrozumieć :) Wolę rozwiązanie 17-bajtowe, ale zachowaj 15 bajtów również w odpowiedzi! Nawiasem mówiąc,
fajna
1

CJam, 14 bajtów

q__|_ @sfe=]zp

Wypróbuj tutaj.

Spacja przed @i spo niej są znakami wypełniającymi wstawianymi, aby kody ASCII pasowały do ​​wymaganego wzorca: spacja nic nie robi, a po sprostu konwertuje ciąg na ciąg. Poza tym jest to dość prosta i bezpośrednia realizacja zadania wyzwania:

q_ "przeczytaj dane wejściowe i zrób jego kopię";
  _ | „zwiń powtarzające się znaki w kopii”;
    _ "zapisz kopię zwiniętego łańcucha";
      @ "wyciągnij oryginalny ciąg wejściowy na górę stosu";
       s „(nic tu nie robi)”;
        fe = "dla każdego znaku w zwiniętym łańcuchu, policz ...";
                 „... ile razy występuje w oryginalnym ciągu znaków”;
           ] z "sparuj liczniki z zapisaną kopią zwiniętego łańcucha";
             p „wydrukuj ciąg reprezentujący wynik”;

Dla danych wejściowych foobar123ten kod jest generowany [['f 1] ['o 2] ['b 1] ['a 1] ['r 1] ['1 2] ['2 2] ['3 1]]. Jeśli po prostu drukujesz liczby w jednym wierszu, a odpowiednie znaki w drugim, jak w:

[1 2 1 1 1 2 2 1]
fobar123

jest uważany za akceptowalny format wyjściowy, wówczas ]zmożna pominąć zapisywanie dwóch bajtów, w sumie 12 bajtów . Tak, skrócony kod nadal spełnia wymagania dotyczące wzorca bitowego.

Ps. Napisałem również prosty moduł sprawdzający kod źródłowy dla tego wyzwania. Biorąc pod uwagę wiersz kodu jako dane wejściowe, najpierw wyśle ​​echo tego wiersza, a następnie wydrukuje ten sam wiersz, a każdy znak zostanie zastąpiony jego ( n % 7) -tym bitem ASCII. Jeśli drugi wiersz to wszystkie, dane wejściowe są prawidłowe.

Ilmari Karonen
źródło
1

Galaretka , 6 bajtów na stronie kodowej Jelly

ṢZṢṀŒr

Wypróbuj online!

Ta funkcja zwraca listę par (znak, liczba). (Galaretka reprezentuje takie listy jak tekst, np. Jeśli są wysyłane do standardowego wyjścia, łącząc elementy, dlatego należy traktować to jako funkcję, a nie jako pełny program. ( Oto ten sam program z pewnym kodem dołączonym do wywołaj funkcję, a następnie wydrukuj wewnętrzną strukturę na standardowe wyjście, co dowodzi, że dane wyjściowe są w jednoznacznym formacie).

Reprezentacja binarna i objaśnienie:

  76543210 

Ṣ 1011011 1    Posortuj znaki na wejściu
Z 010110 1 0 Transponuj listę (jest to 1D, więc skutecznie otacza ją listą)
Ṣ 10110 1 11 Sortuj listę (no-op, ponieważ zawiera tylko jeden element)
Ṁ 1100 1 000 Weź największy (tj. Tylko) element
Œ 000 1 0011 Pierwszy bajt polecenia dwubajtowego
r 01 1 10010 Kodowanie długości przebiegu

Można zauważyć, że druga, trzecia i czwarta postać znoszą się nawzajem i są tylko po to, aby zachować potrzebny nam wzorzec bitowy. Œrjest po prostu zbyt wygodne, a wypełnienie programu tak, abyśmy mogli go użyć, prawdopodobnie daje nam krótszy program niż próba rozwiązania problemu bez wbudowanego.


źródło