Це рядок квадрат?


44

Рядок вважається квадратним, якщо виконуються наступні умови:

  • Кожен рядок має однакову кількість символів
  • Кількість символів у кожному рядку дорівнює кількості рядків.

Ваше завдання - написати програму або функцію, яка визначає, чи є даний вхідний рядок квадратним чи ні.

Ви можете вимагати, щоб введення було обмежене вибором LF, CR або CRLF.

Символи (символи) нового рядка не вважаються частиною довжини рядка.

Вам може знадобитися, щоб у введенні не було чи закінчується новий рядок, який не вважається додатковим рядком.

Вхід - це рядок або 1D масив char; це не список рядків.

Ви можете вважати, що вхід не порожній і містить лише друкований ASCII, включаючи пробіли.

Необхідно вивести значення "truthy" для квадратних струн і хибне для інших рядків.

Пробні кейси:

foo
бар
баз
.
.s.
.ss
.s.
(s представляє простір)
сс
сс
(s представляє простір)
ааааа
ааааа
ааааа
ааааа
ааааа

Тестові випадки фальшивості:

..
.
.

.
….


….
4444
333
22
333
333
abc.def.ghi

Зауважте додаткові порожні рядки в деяких випадках із фальшивими помилками.

Це - найменша кількість байтових виграшів!


Можливий дублікат мовного дизайну: 2-D узгодження шаблону . Завдання №5 те саме, що і це питання.
mbomb007

1
@ mbomb007 Я відчуваю, що різні критерії виграшу роблять це не дублікатом? "Гольфізм" був одним із критеріїв голосування, але я не думаю, що відповіді на це питання будуть значною мірою відображатись на тих, хто тут.
FryAmTheEggman

2
@ mbomb007 Я голосую, щоб залишити це питання відкритим, оскільки, хоча це підмножина іншого питання, інше питання обмежується мовами, створеними спеціально для цього питання.
ETHproductions

2
@ mbomb007: Це не дублікат, тому що це запитання пропонує вам створити мову з метою відповіді на питання, а не відповіді на існуючій мові. Дуже мало відповідей тут було б законним.

1
@ mbomb007: Це не є причиною, щоб закрити цю проблему і не давати людям нікуди публікувати свої відповіді на раніше існуючих мовах. Можливо, це може бути аргументом для закриття іншого виклику (оскільки це лише більш обмежена версія цього), хоча я вважаю це аргументом поганим і вважаю, що обидва слід залишати відкритими.

Відповіді:


19

Брахілог (2), 3 байти

ṇẹṁ

Спробуйте в Інтернеті!

Повна програма. Вихідні дані true.для триути, false.для фальси.

Пояснення

ṇẹṁ
ṇ     Split {standard input} into lines
 ẹ    Split {each line} into basic elements {in this case, characters}
  ṁ   Assert that the result is square

Я трохи скептично ставився до корисності вбудованого, коли його додавали, але я не можу реально заперечувати, що це корисно тут…

Брахілог (2), 7 байт

ṇẹ.\l~l

Спробуйте в Інтернеті!

Не вбудований розчин. Ще б'є всі інші записи, станом на час написання. РЕДАКТУВАННЯ: Не зовсім рівномірний запис Jelly потрапив, коли я це писав, і переміщує його через тайбрек.

Пояснення

ṇẹ.\l~l
ṇ         Split {standard input} into lines
 ẹ        Split {each line} into basic elements {in this case, characters}
   \l     Assert that the result is rectangular, and the number of columns
  .  ~l     is equal to the number of rows

1
Правильний інструмент для роботи!
Павло

10
= "Стверджуйте, що результат квадратний" :(
Ерік Вихідник

5
Нещодавно в минулому був виклик, коли я з усіх сил намагався написати квадрат-аргумент (це було б щось на зразок .\l~lтого часу, за винятком того, що команда зворотної косої риси, яка, серед іншого, стверджує, що його вхід є прямокутником , була зламана; зверніть увагу , що навіть якщо ми замінимо з .\l~l, це ще найкоротшою програмою тут, задумайтеся про це, я додам , що на цю посаду). Команда зворотної косої риски виправлена, але автор мови вирішив одночасно додати квадрат аргументу. Я думав, «напевно, це більше ніколи не з’явиться». Мабуть, я помилився.

2
@Phoenix: Номер версії мови, це не працюватиме в Brachylog v1. Більшість людей просто говорять "Brachylog" (так само, як і більшість людей говорять "Perl", а не "Perl 5"), але я ввійшов у звичку на той час, тому що я використовую Brachylog v1 рідко.

2
@iFreilicht Це погано, оскільки він перемагає будь-яку іншу мову для гри в гольф.
Ерік Аутгольфер

21

Python 2 , 52 байти

x=input().split('\n')
print{len(x)}==set(map(len,x))

Спробуйте в Інтернеті! або Спробуйте всі тестові приклади


4
Мені подобається те, що це і гольф, і читабельний.
jpmc26

Вам не потрібно '\n', просто залиште його порожнім (оскільки у вводі немає пробілів та вкладок).
12431234123412341234123

@ 12431234123412341234123 ні, це не працює для квадратних рядків, що містять пробіли !!!
Містер Xcoder

@ Mr.Xcoder Потрібно це працювати з пробілами? Як я зрозумів, у вводі ніколи немає пробілів.
12431234123412341234123

Ви неправильно зрозуміли характеристики: Ви можете припустити, що введення не порожнє і містить лише ASCII для друку. , а пробіл (``)
друкується

14

JavaScript (ES6), 46 45 байт

s=>!(s=s.split`
`).some(x=>x.length-s.length)

Пояснення

  1. Розділіть рядок на масив на нових рядках.
  2. Петля за масивом.
  3. Віднімаємо довжину масиву від довжини кожного рядка.
  4. Якщо для будь-якого рядка повертається ненульове (тобто truthy) значення, рядок не є квадратним.
  5. Заперечіть результат циклу, щоб дістати trueдля квадрата, а falseдля не.

Спробуй це

f=
s=>!(s=s.split`
`).some(x=>x.length-s.length)
oninput=_=>o.innerText=f(i.value)
o.innerText=f(i.value=`foo
bar
baz`)
<textarea id=i></textarea><pre id=o>


3
Я думаю, ви можете зберегти байт за допомогоюs=>!(s=s.split`\n`).some(x=>x.length-s.length)
ETHproductions

Дякую, @ETHproductions. У мене жахлива звичка звільнятись !someз рук, просто тому, що вона така ж довжина every.
Кудлатий

9

05AB1E , 10 8 байт

¶¡€gDgQP

Спробуйте в Інтернеті!

-2 завдяки Райлі, це в основному його відповідь ._.

Code       # Explanation                  | Truthy Example          | Falsy Example
-----------#------------------------------+-------------------------+--------------
¶¡         # Split on newlines            | [['aaa','aaa','aaa']]   | [['aa']]
  €g       # Get length of each           | [[3,3,3]]               | [[2]]
    D      # Dupe                         | [[3,3,3],[3,3,3]]       | [[2],[2]]
     g     # Get length                   | [[3,3,3],3]             | [[2],1]
      Q    # Check equality               | [[1,1,1]]               | [[0]]
       P   # Take product                 | 1                       | 0

@ Райлі ах, приємний улов, моя оригінальна ідея була більше за те, що у вас було, але трохи інше. Повторили ще два рази і не зрозуміли моєї математичної помилки.
Magic Octopus Urn

Я не думаю, що "Заголовок" є коректною формою на вході.
Павло

@Phoenix є , що краще?
Magic Octopus Urn

1
Введення можна також взяти за допомогою трьох лапок, як це .
Аднан

1
Якщо ви отримаєте довжину кожного першого, ви можете уникнути s. Ось так¶¡€gDgQP
Райлі


9

Haskell, 38 34 байт

l=length
(all=<<(.l).(==).l).lines

Спробуйте в Інтернеті!

Версія Pointfree f s = all ((==length (lines s)).length) (lines s), тобто розділіть вхід на рядки і перевірте, чи довжина кожного рядка дорівнює кількості рядків.

Редагування: Дякуємо @xnor за 4 байти.


1
Я думаю, ви можете використовувати allдля mapвирізання and..
xnor

9

Желе , 7 байт

ỴµL;L€E

Спробуйте в Інтернеті!

Пояснення

Ỵµ       Split the input on newline and use as input in the second link     
  L      Get the number of list items
   ;     And append to that
    L€   A list with the legth of each list item
      E  Check to see if all items are equal.

1
Здається, ваше посилання TIO вказує на те, що ніякої зворотної лінії не повинно бути там.
Павло

@Phoenix виправлено / повернено ...
steenbergh

Це просто перевіряє, чи всі рядки однакової довжини - насправді взагалі не враховується кількість нових рядків. Коли ви досягнете атома Е, у вас є список довжин ліній і це все.
розкидання

@Christian виправлено та скорочено. Вибачте, але замішання, я здогадуюсь, що щось пішло не так після того, як у мене було робоче рішення, і я спробував це зробити в гольф ..
steenbergh

9

Japt , 9 байт

=Ur.Q)¥Uy

Перевірте це в Інтернеті!

Пояснення

 =Ur.Q)¥ Uy
U=Ur.Q)==Uy
             // Implicit: U = input string, Q = quotation mark
U=    )      // Set U to
  Ur.Q       //   U with each non-newline (/./g) replaced with a quotation mark.
       ==Uy  // Return U == U transposed. U is padded to a rectangle with spaces before
             // transposing; if U was not a rectangle before, or the sides are not of
             // equal length, the result will not be the same as U.
             // Implicit: output result of last expression

Використовуючи деякі функції, реалізовані незабаром після опублікування цього виклику, це може бути 6 байт:

r.Q
¥y

Перевірте це в Інтернеті!

Пояснення

       // Implicit: U = input string
r.Q    // Replace each non-newline (/./g) in U with a quotation mark.
       // Newline: set U to the result.
¥      // Return U ==
 y     //   U transposed.
       // Implicit: output result of last expression

Як у світі ти такий швидкий?
повністюлюдський

@totallyhuman Я випадково побачив запитання одразу, коли воно було опубліковане, і мені знадобилося дві хвилини, щоб придумати алгоритм. Після цього це було лише впровадження та розміщення. (Також у мене є речі, щоб повернутися до ха-ха)
ETHproductions

Приємно :) Я знав, що yце рішення, але мій надходив ще на кілька байтів.
Shaggy

Msgstr " Використання деяких функцій, реалізованих незабаром після опублікування цього виклику " - Тепер ви можете розмістити це як власника.
Shaggy

7

Сітківка , 33 31 байт

.
.
^(.(.)*)(?<-2>¶\1)*$(?(2).)

Спробуйте в Інтернеті! Пояснення: Перший етап просто змінює всі друковані ASCII на один і той же символ, щоб полегшити співставлення. (Це можна зробити без, але це код з гольфом, а не виклик коду.) Потім другий етап відповідає принаймні одному символу в першому рядку. Однак для кожного додаткового символу в першому рядку він необов'язково відповідає новому рядку з подальшим копією першого рядка. Заключна частина виразу спричиняє збіг збігу, якщо стовпців більше, ніж рядків.


На жаль, це відповідає дійсності для цього тесту .
Kritixi Lithos

@KritixiLithos Я вважаю, що для подання заявки потрібен новий вхідний рядок, який дозволений.
Павло

Також я вважаю, що використання \S\n;замість першого рядка економить один байт
Kritixi Lithos

@KritixiLithos Насправді заміна .на .два економить, але дякую.
Ніл

@Neil Це дуже розумно!
Kritixi Lithos

6

Лушпиння , 6 байт

S≡T'a¶

Бере рядок і друкує 1або 0. Спробуйте в Інтернеті! Перший рядок повторює тестові випадки; видаліть його, якщо ви хочете протестувати одне значення.

Пояснення

Хуск - це нова функціональна мова для гольфу, створена мною та Левом . У ньому відсутня безліч функцій, і розробка триває. Його основна особливість - система жорсткого типу, яка дозволяє перевантажувати функції вищого порядку.

На високому рівні програма працює так:

S≡T'a¶  Define a function:
     ¶  split on newlines,
  T'a   transpose and pad to rectangle using character 'a',
 ≡      check if this has the same shape as
S       the split input.

Функція насправді перевіряє, чи мають два масиви однакову форму і однаковий розподіл правдоподібних елементів. У Husk всі символи, окрім нульового байта, є truthy, і це не відбудеться у наших введеннях. Крім того , Sє S-комбінатор , функція , яка приймає в якості вхідних даних двох функцій, тут і T'a, і повертає нову функцію , що карти xз ≡(x)(T'a x). Результат Sскладається з , і ця функція застосовується до вводу неявно.

Звідки Хаск знає, що він повинен застосовуватися Sдо наступної функції, але повинен бути складений з функції зліва? Просте: воно просто намагається здійснити кожну інтерпретацію і підбирає ту, де типи мають сенс. Це детальніше пояснено в документації на лушпиння .


5

Чистий баш (без комунальних послуг), 55

mapfile -t a
for l in ${a[@]};{
((c+=${#l}^${#a[@]}))
}
  • mapfile зчитує вхід в масив a
  • тоді кількість елементів масиву XORed з кожною довжиною рядка та взятою сумою. Для ідеального квадрата кожен результат XOR (і, таким чином, сума) буде 0. Для будь-якого іншого результат буде> 0.

Протилежне значення цього повертається як код повернення оболонки (вивчіть echo $?) - ідеальний квадрат дорівнює 1, все інше - 0.

Спробуйте в Інтернеті (truthy) .

Спробуйте в Інтернеті (помилково) .


Попередня відповідь із використанням пекла eval-escape-extension, 78:

mapfile -t a
echo $[0$(eval eval echo +\\$\{#a[{0..$[${#a[@]}-1]}]}^${#a[@]})]

Спробуйте в Інтернеті (truthy) .

Спробуйте в Інтернеті (помилково) .


5

Perl 6 , 27 байт

{.lines==all .lines».comb}

Тестує, чи дорівнює кількість рядків у рядку введення кількості символів у кожному рядку.


це ігнорує символ нового рядка?
Khaled.K

Так, нові рядки .linesметодом не повертаються .
Шон

4

Pyth, 7 байт

CImL1.z

Спробуйте тут

Не вимагає відмітки нового рядка. Замінює вхід двовимірним масивом 1s, де 1 являє собою будь-який символ у вихідному вході. Потім ми перевіряємо, чи не змінюється цей масив після його переміщення (замінюючи стовпці рядками). Лише квадрат поверне справжню в такій ситуації.


4

Java (OpenJDK 8) ,96 91 90 87 байт

-5 байт завдяки @KevinCruijssen
-1 байт завдяки @TheLethalCoder
-2 байт завдяки @ OlivierGrégoire

a->java.util.Arrays.stream(a.split("\n")).allMatch(x->x.length()==a.split("\n").length)

Спробуйте в Інтернеті!


1
Ви можете видалити пробіл у, String[]sа ви можете видалити ,0значок .split("\\n");для -3 байтів. І крапка з комою / ;в самому кінці вам не доведеться рахувати, так що ще -1. О, і ви повинні включити java.util.перед цим, Arraysя боюся. Імпорт / використання також є частиною підрахунку байтів.
Кевін Круїйсен

1
Оскільки ви забули включити java.util., просто звичайний цикл подібного типу for(String x:s)if(x.length()!=s.length)return 0>1;return 1>0;здається коротшим, ніж return java.util.Arrays.stream(s).anyMatch(l->l.length()!=s.length);.
Кевін Круїйсен

2
Хіба це не просто \n?
TheLethalCoder

1
Повторення a.split("\n")фактично коротше! a->java.util.Arrays.stream(a.split("\n")).allMatch(x->x.length()==a.split("\n").length)
Олів'є Грегоар

2
Ммм ... ще трохи присутній , а також між lengі th(). Отже, мабуть, вони з'являються спочатку після 60-ї картки, а потім кожні 20 символів.
Олів'є Грегоар

3

Види обману imo, що в основному беруть nдані замість 1, і чому моя оригінальна відповідь не спрацювала.
Magic Octopus Urn

@carusocomputing Ні, |означає "взяти іншу частину вводу та розділити на нові рядки", що жодним чином не приймає кілька входів. Ви просто повинні розглядати STDIN як єдиний вхід.
Ерік Аутгольфер

3

R , 57 байт

function(s)all(nchar(n<-strsplit(s,'
')[[1]])==length(n))

Анонімна функція; Розбиває на нові рядки, обчислює довжину кожного рядка і перевіряє, чи всі вони однакові, як кількість рядків.

Спробуйте в Інтернеті!


3

MATL , 14 12 байт

10H&XXot&n=h

Рядок введення визначається за допомогою конкатенації рядків ( [...]) і з кодовою точкою 10для представлення LF. Наприклад, ['aaa' 10 'bb']інтерпретується в MATL як рядок, з'єднаний 'aaa'символом з кодовою точкою, 10з'єднаною з рядком 'bb'.

Вихід є не порожнім числовим вектором, який є правдоподібним тоді і тільки тоді, коли всі його записи не нульові.

Спробуйте в Інтернеті!

Пояснення

Розглянемо вхід ['4444' 10 '333' 10 '22'].

10H   % Push 10 (code point of LF). Push 2
      % STACK: 10, 2
&XX   % Regexp with three arguments. First argument is implicit input (string);
      % second is 2, which indicates that we want to split the input; third is
      % 10, which is the character to split on. The result is a cell array of
      % matched strings
      % STACK: {'4444', '333', '22'}
o     % Concatenate into a numeric 2D array of code points, right-padding with
      % zeros if needed
      % STACK: [52 52 52 52; 51 51 51 0; 50 50 0 0]
t&n   % Duplicate. Push number of rows and number of columns
      % STACK: [52 52 52 52; 51 51 51 0; 50 50 0 0], 3, 4
=     % Are they equal?
      % STACK: [52 52 52 52; 51 51 51 0; 50 50 0 0], 0
h     % Concatenate into a row vector (in column-major order). Implicit display
      % STACK: [52 51 50 52 51 50 52 51 0 52 0 0 0]

3

R, 35 байт

all(nchar(x<-scan(,""))==length(x))

Бере вхід з stdin. Перевіряє, що кількість символів у кожному рядку дорівнює загальній кількості рядків. Повертається TRUEабо FALSEвідповідно.


зауважте, що вхідні дані потрібно загорнути в лапки, інакше це може розбитися на пробіли у кожному рядку.
Джузеппе





2

QBIC , 43 байти

{_?~_lA||h=h+1┘g=g+_lA|~g%_lA||_Xp]\_xg/h=h

Мені, я задоволений тим, наскільки короткий похідний QBasic повинен вирішити цю проблему.

Пояснення:

{_?       DO infinitely: ask the user for input, store as A$
~    |    IF
 _lA|       The length of A$   (implicitly <> 0)
h=h+1     Add 1 to our line counter
┘         (syntactic linebreak)
g=g+_lA|  Add the length of this line to the running total of line lengths
~      |  IF
 g%_lA|     The length of the running total modulo the length of the last string
            yields anything but 0, there is a discrepancy between earlier line
            lengths and this one.
_Xp]      THEN QUIT, printing 0, end IF
\         ELSE (refers to the LEN(A$), user didn't input anything.
_xg/h=h   QUIT (the inf. loop) printing -1 if the root of the chars is the row count
            or 0 if not.

2

Pyth, 7 байт

qCC.z.z

Демонстрація

Перекладіть вхід із усіченням двічі, а потім перевірте, чи результат такий, як оригінал.


2

Рубін, 50 байт

s=$<.read.split $/,-1;p [s.size]==s.map(&:size)|[]

Спробуйте в Інтернеті!

Пояснення

  1. Розділити вхід на масив у новому рядку.
  2. Зверніть увагу, що масив, що містить лише розмір цього масиву, дорівнює масиву, що містить усі розміри uniq (встановлення об'єднання з порожнім масивом) усіх елементів цього масиву.

1
Збережіть персонажа за допомогою .split($/,-1);->.split $/,-1;
Крістофер пізніше

Заощаджуйте більше, використовуючи linesзамість, readа потім split(але тоді вам потрібно додати 1, sizeоскільки рядки містять проміжний новий рядок)
GB


1

Clojure, 58 байт

#(let[s(re-seq #"[^\n]+"%)c count](apply =(c s)(map c s)))

Потрібна нова лінія, з нетерпінням чекаю, коли побачимо щось більш магічне.


1

APL (Dyalog) , 17 байт

Потрібно, ⎕ML←3що для багатьох систем за замовчуванням. Використовує CR.

↓∘⎕FMT≡⎕TC[2]∘≠⊂⊢

Спробуйте в Інтернеті!

↓∘⎕FMT [є] аргумент розбиття на рядки F або m a t аргументований на квадрат

 тотожна

⎕TC[2]∘≠ внутрішні групи не-нового рядка * -характеристики

 розділений

 аргумент?

* другий елемент списку T erminal C ontrol символів.


У версії 16.0 можна писати за ↓∘⎕FMT≡⎕TC[3]∘≠⊆⊢допомогою ⎕ML←1.


Цікаво, що ⎕ML?
Павло

1
@Phoenix У Dyalog APL та APL +, M igration L evel - це груба міра діалектичного руху у напрямку APL2 IBM. Чим більша кількість, тим більше стає схожою на APL2 мову. Люди, які мігрують з APL2 на інші APL, мають тенденцію бігати з високим ⎕ML, в той час як люди, які починали з інших APL, як правило, бігають із низьким ⎕ML.
Адам

1

PowerShell, 64 байти

Той самий (розділений, довжина рядків, кількість рядків) підхід, як і інші відповіді мови не для гольфу, але немає приємного еквівалента карти (), тому це масив довжин рядків з кількістю рядків, позначених на кінці, а потім цей масив групується. Виходять квадрати як, 3,3,3,3 -> 1 group, all line lengths and line count were equalа не квадрати виходять на зразок 3,2,1 -> 3 groups, на площі щось було нерівне:

$f={@(@(($L="$args"-split"`n")|% le*)+$L.Count|group).Count-eq1}

Потрібні завершення стилю Linux у новому рядку, без затримки нового рядка. напр

$Ttests = @(@'
foo
bar
baz
'@,
'.',
@'
aaaaa
aaaaa
aaaaa
aaaaa
aaaaa
'@
)
$Ttests = $Ttests | foreach {$_ -replace "`r"}

$Ttests | % { & $f $_ }

(І ви можете зробити подібне для помилкових тестів, але я не ставлю його сюди, оскільки їх більше). Пара @символів потрібна для того, коли вхід є єдиним, '.'інакше розщеплюється, це не створює масив з однієї рядка, він просто робить одну рядок, і тоді конкатенація масиву не 1,1видає його виведення 2.

Я сподівався, що може бути коротше замінити всі символи на "a", а потім грубою силою від 1 до введення довжини всіх квадратів "a" і побачити, чи не відповідає жодному вводу. Як тільки я пройшов парам () і .Length і -join і -замінити, він закінчується набагато довше на 81 байт:

$f={param($s)!!(1..$s.Length|?{,('a'*$_)*$_-join"`n"-eq($s-replace"[^`n]",'a')})}

1

Грим , 11 байт

e`.|_./+/.+

Відбитки 1для квадратів та 0для неквадратиків. Спробуйте в Інтернеті!

Пояснення

Детальне пояснення можна знайти на сторінці підручника Grime , яка, як приклад, містить саме цю програму.

e`.|_./+/.+
e`            Match entire input against pattern:
  .           A single character
   |          OR
    _         a recursive match of this pattern
     ./+      with one column of characters on its right
        /     and below that
         .+   one row of characters.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.