Как проверить, если и только если одно из условий верно в наборе утверждений в Джулии?

Предположим, у меня есть следующие утверждения:

1 == 1
2 == 1
3 == 2

Я хочу проверить, если и только если одно из этих утверждений является true. Ожидаемый результат для приведенного выше примера — true. Очевидно, что если я использую функцию all для приведенного выше примера, я получаю false. Если я использую функцию any, то это нарушает правило в других ситуациях. Например:

julia> any([1==1, 2==2, 3==1])
true

Мне нужно false в этом случае, потому что есть два утверждения true, а не одно. Другой подход заключается в использовании множества связанных правдивых утверждений, таких как || и &&, что приводит к большому количеству строк кода, если моих утверждений больше. Итак, я ищу хороший и оптимальный способ для этого.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Подход может использовать функцию sum:

julia> sum([1==1, 2==2, 3==1])
2

julia> sum([1==1, 2==1, 3==1])
1

Так:

  • Если результатом является 0, то все утверждения являются false.
  • Если результат 1, есть только утверждение true.
  • Наконец, в других случаях существует более одного истинного утверждения.

Если я попытаюсь сравнить свое предложение с предложением @fredrikekre:

julia> f1(vec::Vector{Bool}) = sum(vec) == 1;

julia> f2(vec::Vector{Bool}) = count(vec) == 1;

julia> @benchmark f1([1==1, 2==1, 3==1])
BenchmarkTools.Trial: 10000 samples with 993 evaluations.
 Range (min … max):  37.059 ns …  1.709 μs  ┊ GC (min … max): 0.00% … 97.14%
 Time  (median):     39.174 ns              ┊ GC (median):    0.00%
 Time  (mean ± σ):   44.735 ns ± 55.112 ns  ┊ GC (mean ± σ):  4.33% ±  3.47%

  ▄▆█▆▅▃▂▂▁    ▁▁▁▁              ▁▂▂▃                         ▂
  █████████▇▆▇██████▇▆▆▇▆▆▇▇██▇███████▇▇▇▇▆▆▅▇▆▇▆▆▆▅▅▁▆▅▅▄▄▅▅ █
  37.1 ns      Histogram: log(frequency) by time      86.8 ns <

 Memory estimate: 64 bytes, allocs estimate: 1.

julia> @benchmark f2([1==1, 2==1, 3==1])
BenchmarkTools.Trial: 10000 samples with 992 evaluations.
 Range (min … max):  37.399 ns …  2.559 μs  ┊ GC (min … max): 0.00% … 97.92%
 Time  (median):     39.516 ns              ┊ GC (median):    0.00%
 Time  (mean ± σ):   50.292 ns ± 68.392 ns  ┊ GC (mean ± σ):  4.74% ±  3.50%

  ▄█▆▄▃▁▁                    ▁▁▃▄▄▄                           ▁
  ███████▇▅▆▇████▇▆▇▆▆▅▆▆▆▆▅▇█████████▆▄▆▆▇▇▇▆▆▅▆▆▆▅▄▄▅▆▆▅▅▅▃ █
  37.4 ns      Histogram: log(frequency) by time      95.6 ns <

 Memory estimate: 64 bytes, allocs estimate: 1.

Я вижу, что мой работает немного лучше.

Вы можете сделать это маленькой однострочной функцией: one_true(list) = sum(list) == 1 ? true : false

Nils L. 09.12.2022 09:47

@НилсЛ. часть ? true ... не нужна. Спасибо.

Shayan 11.12.2022 18:38

Вы можете использовать count:

julia> count(i == 2 for i in 1:4) == 1
true

julia> count([1 == 2, 2 == 2, 3 == 2]) == 1
true

Да, это другой подход. Спасибо!

Shayan 08.12.2022 15:27

Другие вопросы по теме